From 9b91ca743c60bd7082a7047b7183b4884eb5472c Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:03:42 -0600 Subject: [PATCH 01/27] add the originally changed files from Esri as esri-*.js --- js/source/esri-source.js | 127 +++++++++++ js/source/esri-tile-pyramid.js | 322 +++++++++++++++++++++++++++ js/source/esri-vector-tile-source.js | 102 +++++++++ js/source/esri-worker.js | 134 +++++++++++ js/source/esri-worker_tile.js | 215 ++++++++++++++++++ 5 files changed, 900 insertions(+) create mode 100644 js/source/esri-source.js create mode 100644 js/source/esri-tile-pyramid.js create mode 100644 js/source/esri-vector-tile-source.js create mode 100644 js/source/esri-worker.js create mode 100644 js/source/esri-worker_tile.js diff --git a/js/source/esri-source.js b/js/source/esri-source.js new file mode 100644 index 00000000000..b19e5d4550f --- /dev/null +++ b/js/source/esri-source.js @@ -0,0 +1,127 @@ +'use strict'; + +var util = require('mapbox-gl/js/util/util'); +var ajax = require('mapbox-gl/js/util/ajax'); +var browser = require('mapbox-gl/js/util/browser'); +var TileCoord = require('mapbox-gl/js/source/tile_coord'); +var TilePyramid = require('./esri-tile-pyramid'); +var normalizeURL = require('mapbox-gl/js/util/mapbox').normalizeSourceURL; + +exports._loadTileJSON = function(options) { + var indexLoaded = function (err, index) { + //util.extend(this._pyramid, util.pick(index, 'index')); + + this._pyramid = new TilePyramid({ + index: index.index, + tileSize: this.tileSize, + cacheSize: 20, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + reparseOverscaled: this.reparseOverscaled, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this) + }); + + this.fire('load'); + }; + + var loaded = function (err, tileJSON) { + if (err) { + this.fire('error', {error: err}); + return; + } + + util.extend(this, util.pick(tileJSON, + 'tiles', 'minzoom', 'maxzoom', 'attribution')); + + if (tileJSON.index){ + //console.log("Getting index from: ", tileJSON.index); + ajax.getJSON(normalizeURL(tileJSON.index), indexLoaded.bind(this)); + } + else{ + this._pyramid = new TilePyramid({ + tileSize: this.tileSize, + cacheSize: 20, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + reparseOverscaled: this.reparseOverscaled, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this) + }); + + this.fire('load'); + } + }.bind(this); + + if (options.url) { + ajax.getJSON(normalizeURL(options.url), loaded); + } + else { + browser.frame(loaded.bind(this, null, options)); + } +}; + +exports._renderTiles = function(layers, painter) { + if (!this._pyramid) + return; + + var ids = this._pyramid.renderedIDs(); + for (var i = 0; i < ids.length; i++) { + var pos = TileCoord.fromID(ids[i]), + tile = this._pyramid.getTile(ids[i]), + z = pos.z, + x = pos.x, + y = pos.y, + w = pos.w; + + // if z > maxzoom then the tile is actually a overscaled maxzoom tile, + // so calculate the matrix the maxzoom tile would use. + z = Math.min(z, this.maxzoom); + + x += w * (1 << z); + tile.calculateMatrices(z, x, y, painter.transform, painter); + + painter.drawTile(tile, layers); + } +}; + +exports._vectorFeaturesAt = function(point, params, callback) { + if (!this._pyramid) + return callback(null, []); + + var result = this._pyramid.tileAt(point); + if (!result) + return callback(null, []); + + this.dispatcher.send('query features', { + uid: result.tile.uid, + x: result.x, + y: result.y, + scale: result.scale, + source: this.id, + params: params + }, callback, result.tile.workerID); +}; + +exports.create = function(source) { + // This is not at file scope in order to avoid a circular require. + var sources = { + vector: require('mapbox-gl/js/source/vector_tile_source'), + indexedVector: require('mapbox-gl/js/source/vector_tile_source'), + raster: require('mapbox-gl/js/source/raster_tile_source') + }; + + for (var type in sources) { + if (source instanceof sources[type]) { + return source; + } + } + + return new sources[source.type](source); +}; diff --git a/js/source/esri-tile-pyramid.js b/js/source/esri-tile-pyramid.js new file mode 100644 index 00000000000..a04cf4bb052 --- /dev/null +++ b/js/source/esri-tile-pyramid.js @@ -0,0 +1,322 @@ +'use strict'; + +var Tile = require('mapbox-gl/js/source/tile'); +var TileCoord = require('mapbox-gl/js/source/tile_coord'); +var Point = require('mapbox-gl/node_modules/point-geometry'); +var Cache = require('mapbox-gl/js/util/mru_cache'); +var util = require('mapbox-gl/js/util/util'); + +module.exports = TilePyramid; + +function TilePyramid(options) { + this.tileSize = options.tileSize; + this.minzoom = options.minzoom; + this.maxzoom = options.maxzoom; + this.reparseOverscaled = options.reparseOverscaled; + this.index = options.index; + + this._load = options.load; + this._abort = options.abort; + this._unload = options.unload; + this._add = options.add; + this._remove = options.remove; + + this._tiles = {}; + this._cache = new Cache(options.cacheSize, function (tile) { + return this._unload(tile); + }.bind(this)); +} + +TilePyramid.prototype = { + loaded: function () { + for (var t in this._tiles) { + if (!this._tiles[t].loaded) + return false; + } + return true; + }, + + orderedIDs: function () { + return Object.keys(this._tiles) + .sort(function (a, b) { + return (b % 32) - (a % 32); + }) // z-order + .map(function (id) { + return +id; + }); + }, + + renderedIDs: function () { + return this.orderedIDs().filter(function (id) { + return this._tiles[id].loaded && !this._coveredTiles[id]; + }.bind(this)); + }, + + reload: function () { + this._cache.reset(); + for (var i in this._tiles) { + this._load(this._tiles[i]); + } + }, + + getTile: function (id) { + return this._tiles[id]; + }, + + // get the zoom level adjusted for the difference in map and source tilesizes + getZoom: function (transform) { + return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2; + }, + + coveringZoomLevel: function (transform) { + return Math.floor(this.getZoom(transform)); + }, + + coveringTiles: function (transform) { + var z = this.coveringZoomLevel(transform); + var actualZ = z; + + if (z < this.minzoom) return []; + if (z > this.maxzoom) z = this.maxzoom; + + var tr = transform, + tileCenter = TileCoord.zoomTo(tr.locationCoordinate(tr.center), z), + centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5); + + var tiles = TileCoord.cover(z, [ + TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: 0, y: 0}), z), + TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: tr.width, y: 0}), z), + TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: tr.width, y: tr.height}), z), + TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: 0, y: tr.height}), z) + ], this.reparseOverscaled ? actualZ : z).sort(function (a, b) { + return centerPoint.dist(TileCoord.fromID(a)) - + centerPoint.dist(TileCoord.fromID(b)); + }); + + /*//the added logic to not try to download empty tiles + var indexed = tiles.map(function (t) { + return this._indexSearch(t); + }, this); + + tiles = []; + indexed.forEach(function (id) { + if (tiles.indexOf(id) === -1) { + tiles.push(id); + } + });*/ + + tiles.sort(function (a, b) { + return centerPoint.dist(TileCoord.fromID(a)) - + centerPoint.dist(TileCoord.fromID(b)); + }); + + return tiles; + }, + + // Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; + // adds found tiles to retain object; returns true if children completely cover the tile + findLoadedChildren: function (id, maxCoveringZoom, retain) { + var complete = true; + var z = TileCoord.fromID(id).z; + var ids = TileCoord.children(id, this.maxzoom); + for (var i = 0; i < ids.length; i++) { + if (this._tiles[ids[i]] && this._tiles[ids[i]].loaded) { + retain[ids[i]] = true; + } + else { + complete = false; + if (z < maxCoveringZoom) { + // Go further down the hierarchy to find more unloaded children. + this.findLoadedChildren(ids[i], maxCoveringZoom, retain); + } + } + } + return complete; + }, + + // Find a loaded parent of the given tile (up to minCoveringZoom); + // adds the found tile to retain object and returns the tile if found + findLoadedParent: function (id, minCoveringZoom, retain) { + for (var z = TileCoord.fromID(id).z; z >= minCoveringZoom; z--) { + id = TileCoord.parent(id, this.maxzoom); + var tile = this._tiles[id]; + if (tile && tile.loaded) { + retain[id] = true; + return tile; + } + } + }, + + // Removes tiles that are outside the viewport and adds new tiles that are inside the viewport. + update: function (used, transform, fadeDuration) { + var i; + var id; + var tile; + + // Determine the overzooming/underzooming amounts. + var zoom = Math.floor(this.getZoom(transform)); + var minCoveringZoom = util.clamp(zoom - 10, this.minzoom, this.maxzoom); + var maxCoveringZoom = util.clamp(zoom + 1, this.minzoom, this.maxzoom); + + // Retain is a list of tiles that we shouldn't delete, even if they are not + // the most ideal tile for the current viewport. This may include tiles like + // parent or child tiles that are *already* loaded. + var retain = {}; + var now = new Date().getTime(); + + // Covered is a list of retained tiles who's areas are full covered by other, + // better, retained tiles. They are not drawn separately. + this._coveredTiles = {}; + + var required = used ? this.coveringTiles(transform) : []; + for (i = 0; i < required.length; i++) { + id = +required[i]; + tile = this.addTile(id); + + retain[id] = true; + + if (tile.loaded) + continue; + + // The tile we require is not yet loaded. + // Retain child or parent tiles that cover the same area. + if (!this.findLoadedChildren(id, maxCoveringZoom, retain)) { + this.findLoadedParent(id, minCoveringZoom, retain); + } + } + + for (id in retain) { + tile = this._tiles[id]; + if (tile && tile.timeAdded > now - (fadeDuration || 0)) { + // This tile is still fading in. Find tiles to cross-fade with it. + if (this.findLoadedChildren(id, maxCoveringZoom, retain)) { + this._coveredTiles[id] = true; + retain[id] = true; + } + else { + this.findLoadedParent(id, minCoveringZoom, retain); + } + } + } + + // Remove the tiles we don't need anymore. + var remove = util.keysDifference(this._tiles, retain); + for (i = 0; i < remove.length; i++) { + this.removeTile(+remove[i]); + } + }, + + addTile: function (id) { + var tile = this._tiles[id]; + if (tile) + return tile; + + var wrapped = this._wrappedID(id); + tile = this._tiles[wrapped] || this._cache.get(wrapped); + + if (!tile) { + var zoom = TileCoord.fromID(id).z; + var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1; + tile = new Tile(wrapped, this.tileSize * overscaling); + + tile.parentId = this._indexSearch(id); // get the parent tile in the tile index + + this._load(tile); + } + + tile.uses++; + this._tiles[id] = tile; + this._add(tile, id); + + return tile; + }, + + removeTile: function (id) { + var tile = this._tiles[id]; + if (!tile) + return; + + tile.uses--; + delete this._tiles[id]; + this._remove(tile, id); + + if (tile.uses > 0) + return; + + if (tile.loaded) { + this._cache.add(this._wrappedID(id), tile); + } + else { + this._abort(tile); + this._unload(tile); + } + }, + + clearTiles: function () { + for (var id in this._tiles) + this.removeTile(id); + this._cache.reset(); + }, + + tileAt: function (point) { + var ids = this.orderedIDs(); + for (var i = 0; i < ids.length; i++) { + var tile = this._tiles[ids[i]]; + var pos = tile.positionAt(point); + if (pos && pos.x >= 0 && pos.x < 4096 && pos.y >= 0 && pos.y < 4096) { + // The click is within the viewport. There is only ever one tile in + // a layer that has this property. + return { + tile: tile, + x: pos.x, + y: pos.y, + scale: pos.scale + }; + } + } + }, + + _wrappedID: function (id) { + var pos = TileCoord.fromID(id); + return pos.w === 0 ? id : TileCoord.toID(pos.z, pos.x, pos.y, 0); + }, + + _indexSearch: function (id) { + //console.log("checking index for missing tile"); + var tile = TileCoord.fromID(id), + w = tile.w, + result, z; + + var ids = []; + + id = TileCoord.toID(tile.z, tile.x, tile.y); + ids.push(id); + while (id !== 0) { + id = TileCoord.parent(id); + ids.push(id); + } + + var cursor = this.index, + cursorId = ids.pop(), + index; + + while (ids.length) { + id = ids.pop(); + index = TileCoord.children(cursorId).indexOf(id); + if (cursor[index] === 0) { + id = cursorId; + break; + } + else if (cursor[index] === 1) { + break; + } + else { + cursorId = id; + cursor = cursor[index]; + } + } + + tile = TileCoord.fromID(id); + return TileCoord.toID(tile.z, tile.x, tile.y, w); + } +}; diff --git a/js/source/esri-vector-tile-source.js b/js/source/esri-vector-tile-source.js new file mode 100644 index 00000000000..fd71d9e7cbf --- /dev/null +++ b/js/source/esri-vector-tile-source.js @@ -0,0 +1,102 @@ +'use strict'; + +var util = require('mapbox-gl/js/util/util'); +var Evented = require('mapbox-gl/js/util/evented'); +var TileCoord = require('mapbox-gl/js/source/tile_coord'); +var Source = require('./esri-source'); + +module.exports = VectorTileSource; + +function VectorTileSource(options) { + util.extend(this, util.pick(options, 'url', 'tileSize')); + + if (this.tileSize !== 512) { + throw new Error('vector tile sources must have a tileSize of 512'); + } + + Source._loadTileJSON.call(this, options); +} + +VectorTileSource.prototype = util.inherit(Evented, { + minzoom: 0, + maxzoom: 22, + tileSize: 512, + reparseOverscaled: true, + _loaded: false, + + onAdd: function (map) { + this.map = map; + }, + + loaded: function () { + return this._pyramid && this._pyramid.loaded(); + }, + + update: function (transform) { + if (this._pyramid) { + this._pyramid.update(this.used, transform); + } + }, + + reload: function () { + this._pyramid.reload(); + }, + + render: Source._renderTiles, + featuresAt: Source._vectorFeaturesAt, + + _loadTile: function (tile) { + var overscaling = tile.zoom > this.maxzoom ? Math.pow(2, tile.zoom - this.maxzoom) : 1; + var params = { + //url: TileCoord.url(tile.id, this.tiles, this.maxzoom), + url: TileCoord.url(tile.parentId, this.tiles, this.maxzoom), // MOB + uid: tile.uid, + id: tile.id, + parentId: tile.parentId, //MOB + zoom: tile.zoom, + maxZoom: this.maxzoom, + tileSize: this.tileSize * overscaling, + source: this.id, + overscaling: overscaling + }; + + if (tile.workerID) { + this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID); + } + else { + tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile)); + } + }, + + _tileLoaded: function (tile, err, data) { + if (tile.aborted) + return; + + if (err) { + this.fire('tile.error', {tile: tile}); + return; + } + + tile.loadVectorData(data); + this.fire('tile.load', {tile: tile}); + }, + + _abortTile: function (tile) { + tile.aborted = true; + this.dispatcher.send('abort tile', {uid: tile.uid, source: this.id}, null, tile.workerID); + }, + + _addTile: function (tile) { + this.fire('tile.add', {tile: tile}); + }, + + _removeTile: function (tile) { + this.fire('tile.remove', {tile: tile}); + }, + + _unloadTile: function (tile) { + tile.unloadVectorData(this.map.painter); + this.glyphAtlas.removeGlyphs(tile.uid); + this.dispatcher.send('remove tile', {uid: tile.uid, source: this.id}, null, tile.workerID); + } +}); diff --git a/js/source/esri-worker.js b/js/source/esri-worker.js new file mode 100644 index 00000000000..1b8bfc2cfce --- /dev/null +++ b/js/source/esri-worker.js @@ -0,0 +1,134 @@ +'use strict'; + +var Actor = require('../util/actor'); +var WorkerTile = require('./worker_tile'); +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var vt = require('vector-tile'); +var Protobuf = require('pbf'); +var TileCoord = require('./tile_coord'); + +var geojsonvt = require('geojson-vt'); +var GeoJSONWrapper = require('./geojson_wrapper'); + +module.exports = Worker; + +function Worker(self) { + this.self = self; + this.actor = new Actor(self, this); + this.loading = {}; + this.loaded = {}; + this.layers = []; + this.geoJSONIndexes = {}; +} + +util.extend(Worker.prototype, { + 'set layers': function(layers) { + this.layers = layers; + }, + + 'load tile': function(params, callback) { + //console.log("in load tile"); + var source = params.source, + uid = params.uid; + + if (!this.loading[source]) + this.loading[source] = {}; + + this.loading[source][uid] = ajax.getArrayBuffer(params.url, function(err, data) { + delete this.loading[source][uid]; + + if (err) return callback(err); + + var tile = new WorkerTile(params); + tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data))); + + if (params.id !== params.parentId && tile.data.layers) + { + var tilePos = TileCoord.fromID(params.id); + var parentPos = TileCoord.fromID(params.parentId); + //if (parentPos.z === 14 && parentPos.x === 4823 && parentPos.y ===6157) + //{ + //parentPos.z = parentPos.z; + //} + var dz = tilePos.z - parentPos.z; + var xPos = tilePos.x & ((1 << dz) - 1); + var yPos = tilePos.y & ((1 << dz) - 1); + tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); + } + else + tile.parse(tile.data, this.layers, this.actor, callback); + + this.loaded[source] = this.loaded[source] || {}; + this.loaded[source][uid] = tile; + }.bind(this)); + }, + + 'reload tile': function(params, callback) { + var loaded = this.loaded[params.source], + uid = params.uid; + if (loaded && loaded[uid]) { + var tile = loaded[uid]; + tile.parse(tile.data, this.layers, this.actor, callback); + } + }, + + 'abort tile': function(params) { + var loading = this.loading[params.source], + uid = params.uid; + if (loading && loading[uid]) { + loading[uid].abort(); + delete loading[uid]; + } + }, + + 'remove tile': function(params) { + var loaded = this.loaded[params.source], + uid = params.uid; + if (loaded && loaded[uid]) { + delete loaded[uid]; + } + }, + + 'parse geojson': function(params, callback) { + var indexData = function(err, data) { + if (err) return callback(err); + this.geoJSONIndexes[params.source] = geojsonvt(data, {baseZoom: params.maxZoom}); + callback(null); + }.bind(this); + + // TODO accept params.url for urls instead + if (typeof params.data === 'string') ajax.getJSON(params.data, indexData); + else indexData(null, params.data); + }, + + 'load geojson tile': function(params, callback) { + var source = params.source, + coord = TileCoord.fromID(params.id); + + // console.time('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); + + var geoJSONTile = this.geoJSONIndexes[source].getTile(coord.z, coord.x, coord.y); + + // console.timeEnd('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); + + // if (!geoJSONTile) console.log('not found', this.geoJSONIndexes[source], coord); + + if (!geoJSONTile) return callback(null, null); // nothing in the given tile + + var tile = new WorkerTile(params); + tile.parse(new GeoJSONWrapper(geoJSONTile.features), this.layers, this.actor, callback); + + this.loaded[source] = this.loaded[source] || {}; + this.loaded[source][params.uid] = tile; + }, + + 'query features': function(params, callback) { + var tile = this.loaded[params.source] && this.loaded[params.source][params.uid]; + if (tile) { + tile.featureTree.query(params, callback); + } else { + callback(null, []); + } + } +}); diff --git a/js/source/esri-worker_tile.js b/js/source/esri-worker_tile.js new file mode 100644 index 00000000000..d233c3144b5 --- /dev/null +++ b/js/source/esri-worker_tile.js @@ -0,0 +1,215 @@ +'use strict'; + +var FeatureTree = require('../data/feature_tree'); +var Collision = require('../symbol/collision'); +var BufferSet = require('../data/buffer/buffer_set'); +var createBucket = require('../data/create_bucket'); + +module.exports = WorkerTile; + +function WorkerTile(params) { + this.id = params.id; + this.uid = params.uid; + this.zoom = params.zoom; + this.maxZoom = params.maxZoom; + this.tileSize = params.tileSize; + this.source = params.source; + this.overscaling = params.overscaling; +} + +WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, yPos) { + this.featureTree = new FeatureTree(this.id); + + var i, k, + tile = this, + layer, + bucket, + buffers = new BufferSet(), + collision = new Collision(this.zoom, 4096, this.tileSize), + buckets = {}, + bucketsInOrder = [], + bucketsBySourceLayer = {}; + + // Map non-ref layers to buckets. + for (i = 0; i < layers.length; i++) { + layer = layers[i]; + + if (layer.source !== this.source) + continue; + + if (layer.ref) + continue; + + var minzoom = layer.minzoom; + if (minzoom && this.zoom < minzoom && minzoom < this.maxZoom) + continue; + + var maxzoom = layer.maxzoom; + if (maxzoom && this.zoom >= maxzoom) + continue; + + var visibility = layer.layout.visibility; + if (visibility === 'none') + continue; + + bucket = createBucket(layer, buffers, collision, this.zoom, this.overscaling); + bucket.layers = [layer.id]; + + buckets[bucket.id] = bucket; + bucketsInOrder.push(bucket); + + if (data.layers) { + // vectortile + var sourceLayer = layer['source-layer']; + if (!bucketsBySourceLayer[sourceLayer]) + bucketsBySourceLayer[sourceLayer] = {}; + bucketsBySourceLayer[sourceLayer][bucket.id] = bucket; + } else { + // geojson tile + bucketsBySourceLayer[bucket.id] = bucket; + } + } + + // Index ref layers. + for (i = 0; i < layers.length; i++) { + layer = layers[i]; + + if (layer.source !== this.source) + continue; + + if (!layer.ref) + continue; + + bucket = buckets[layer.ref]; + if (!bucket) + continue; + + bucket.layers.push(layer.id); + } + + // read each layer, and sort its features into buckets + if (data.layers) { + // vectortile + for (k in bucketsBySourceLayer) { + layer = data.layers[k]; + if (!layer) continue; + sortLayerIntoBuckets(layer, bucketsBySourceLayer[k], dz, xPos, yPos); + } + } else { + // geojson + sortLayerIntoBuckets(data, bucketsBySourceLayer); + } + + function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i); + + //MOB + feature.dz = dz; + feature.xPos = xPos; + feature.yPos = yPos; + + for (var key in buckets) { + var bucket = buckets[key]; + if (bucket.filter(feature)) { + bucket.features.push(feature); + } + } + } + } + + var prevPlacementBucket; + var remaining = bucketsInOrder.length; + + /* + * The async parsing here is a bit tricky. + * Some buckets depend on resources that may need to be loaded async (glyphs). + * Some buckets need to be parsed in order (to get placement priorities right). + * + * Dependencies calls are initiated first to get those rolling. + * Buckets that don't need to be parsed in order, aren't to save time. + */ + + for (i = 0; i < bucketsInOrder.length; i++) { + bucket = bucketsInOrder[i]; + + // Link buckets that need to be parsed in order + if (bucket.collision) { + if (prevPlacementBucket) { + prevPlacementBucket.next = bucket; + } else { + bucket.previousPlaced = true; + } + prevPlacementBucket = bucket; + } + + if (bucket.getDependencies) { + bucket.getDependencies(this, actor, dependenciesDone(bucket)); + } + + // immediately parse buckets where order doesn't matter and no dependencies + if (!bucket.collision && !bucket.getDependencies) { + parseBucket(tile, bucket); + } + } + + function dependenciesDone(bucket) { + return function(err) { + bucket.dependenciesLoaded = true; + parseBucket(tile, bucket, err); + }; + } + + function parseBucket(tile, bucket, skip) { + if (bucket.getDependencies && !bucket.dependenciesLoaded) return; + if (bucket.collision && !bucket.previousPlaced) return; + + if (!skip) { + var now = Date.now(); + if (bucket.features.length) bucket.addFeatures(); + var time = Date.now() - now; + if (bucket.interactive) { + for (var i = 0; i < bucket.features.length; i++) { + var feature = bucket.features[i]; + tile.featureTree.insert(feature.bbox(), bucket.layers, feature); + } + } + if (typeof self !== 'undefined') { + self.bucketStats = self.bucketStats || {_total: 0}; + self.bucketStats._total += time; + self.bucketStats[bucket.id] = (self.bucketStats[bucket.id] || 0) + time; + } + } + + remaining--; + + if (!remaining) { + done(); + return; + } + + // try parsing the next bucket, if it is ready + if (bucket.next) { + bucket.next.previousPlaced = true; + parseBucket(tile, bucket.next); + } + } + + function done() { + var transferables = [], + elementGroups = {}; + + for (k in buffers) { + transferables.push(buffers[k].array); + } + + for (k in buckets) { + elementGroups[k] = buckets[k].elementGroups; + } + + callback(null, { + elementGroups: elementGroups, + buffers: buffers + }, transferables); + } +}; From 1fa5f375b4eec99d68b6faba98dd8141fe302b8a Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:05:37 -0600 Subject: [PATCH 02/27] request an index file if its given then extend the tile pyramid with the index --- js/source/source.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/js/source/source.js b/js/source/source.js index f8ea2684b0b..9c787267be3 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -8,6 +8,7 @@ var TileCoord = require('./tile_coord'); var normalizeURL = require('../util/mapbox').normalizeSourceURL; exports._loadTileJSON = function(options) { + var loaded = function(err, tileJSON) { if (err) { this.fire('error', {error: err}); @@ -32,7 +33,22 @@ exports._loadTileJSON = function(options) { redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined }); - this.fire('load'); + // if index is defined, fetch the index json, then extend the pyramid + if (tileJSON.index) { + ajax.getJSON(normalizeURL(tileJSON.index), function (err, index) { + if (err) { + this.fire('error', {error: err}); + return; + } + + util.extend(this._pyramid, index); + this.fire('load'); + + }.bind(this)); + } else { + this.fire('load'); + } + }.bind(this); if (options.url) { From 2e90988ca369adcad50354c6128d4bf99b5442be Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:06:23 -0600 Subject: [PATCH 03/27] if pyramid has an index then find a tiles parentID in the index --- js/source/tile_pyramid.js | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index 33a6db8310f..d9e6ef1d5dd 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -25,6 +25,8 @@ function TilePyramid(options) { this.maxzoom = options.maxzoom; this.roundZoom = options.roundZoom; this.reparseOverscaled = options.reparseOverscaled; + // esri/chelm + this.index = options.index; this._load = options.load; this._abort = options.abort; @@ -271,6 +273,10 @@ TilePyramid.prototype = { var zoom = coord.z; var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1; tile = new Tile(wrapped, this.tileSize * overscaling); + // esri/chelm + if (this.index) { + tile.parentId = this.indexSearch(id); + } this._load(tile); } @@ -372,5 +378,47 @@ TilePyramid.prototype = { } return result; + }, + + /** + * For a given tile id find its parent tile from the index + * @param {string|number} id tile id + * @returns {Object} tile + * @private + */ + indexSearch: function (id) { + var tile = TileCoord.fromID(id); + + var ids = []; + + var parentTile = tile; + while (id !== 0) { + parentTile = parentTile.parent(id); + id = parentTile.id; + ids.push(id); + } + + var cursor = this.index, + cursorId = ids.pop(), + index; + + while (ids.length) { + id = ids.pop(); + index = tile.children(cursorId).indexOf(id); + if (cursor) { + if (cursor[index] === 0) { + id = cursorId; + break; + } else if (cursor[index] === 1) { + break; + } else { + cursorId = id; + cursor = cursor[index]; + } + } + } + + return TileCoord.fromID(id).id; } + }; From 0caefd7fe42c6e37cc59ecfaf35fc62eb362a64d Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:08:05 -0600 Subject: [PATCH 04/27] when loading tiles use the parentID tile for the url --- js/source/vector_tile_source.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/js/source/vector_tile_source.js b/js/source/vector_tile_source.js index f8893e9d9a3..1e9d7cc568e 100644 --- a/js/source/vector_tile_source.js +++ b/js/source/vector_tile_source.js @@ -75,6 +75,11 @@ VectorTileSource.prototype = util.inherit(Evented, { collisionDebug: this.map.collisionDebug }; + // request the tile parentID if it exists + if (tile.parentId) { + params.url = tile.coord.fromID(tile.parentID).url(this.tiles, this.maxzoom); + } + if (tile.workerID) { this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID); } else { From cea6ca4e330a366ff763c681be43fa96bd91a2d8 Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:09:02 -0600 Subject: [PATCH 05/27] when a parent ID is defined determine the dz and x/y offset of a tile relationship to its parent --- js/source/worker.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/js/source/worker.js b/js/source/worker.js index 29ca0dce54a..3e03e53de62 100644 --- a/js/source/worker.js +++ b/js/source/worker.js @@ -47,7 +47,16 @@ util.extend(Worker.prototype, { if (err) return callback(err); tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data))); - tile.parse(tile.data, this.layers, this.actor, callback); + if (params.id !== params.parentId && tile.data.layers) { + var tilePos = tile.coord.fromID(params.id); + var parentPos = tile.coord.fromID(params.parentId); + var dz = tilePos.z - parentPos.z; + var xPos = tilePos.x & ((1 << dz) - 1); + var yPos = tilePos.y & ((1 << dz) - 1); + tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); + } else { + tile.parse(tile.data, this.layers, this.actor, callback); + } this.loaded[source] = this.loaded[source] || {}; this.loaded[source][uid] = tile; From dbe8533d966f9e1d7155a74148021d5d1671afea Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:13:52 -0600 Subject: [PATCH 06/27] pass dz and x/y position down to the feature --- js/source/worker_tile.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/js/source/worker_tile.js b/js/source/worker_tile.js index 8d523d51906..f11228c27ef 100644 --- a/js/source/worker_tile.js +++ b/js/source/worker_tile.js @@ -22,7 +22,7 @@ function WorkerTile(params) { this.stacks = {}; } -WorkerTile.prototype.parse = function(data, layers, actor, callback) { +WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, yPos) { this.status = 'parsing'; @@ -104,16 +104,21 @@ WorkerTile.prototype.parse = function(data, layers, actor, callback) { layer = data.layers[k]; if (!layer) continue; if (layer.extent) extent = layer.extent; - sortLayerIntoBuckets(layer, bucketsBySourceLayer[k]); + sortLayerIntoBuckets(layer, bucketsBySourceLayer[k], dz, xPos, yPos); } } else { // geojson sortLayerIntoBuckets(data, bucketsBySourceLayer); } - function sortLayerIntoBuckets(layer, buckets) { + function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i); + //MOB + feature.dz = dz; + feature.xPos = xPos; + feature.yPos = yPos; + for (var key in buckets) { var bucket = buckets[key]; if (bucket.filter(feature)) { From 838048e5d0d9391a3ac802cbe4e570fa92a5067d Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 11:30:02 -0600 Subject: [PATCH 07/27] delinting; tests all pass --- js/source/esri-source.js | 9 ++++++--- js/source/esri-tile-pyramid.js | 3 +-- js/source/source.js | 4 ++-- js/source/tile_pyramid.js | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/js/source/esri-source.js b/js/source/esri-source.js index b19e5d4550f..b147fa71a23 100644 --- a/js/source/esri-source.js +++ b/js/source/esri-source.js @@ -9,6 +9,10 @@ var normalizeURL = require('mapbox-gl/js/util/mapbox').normalizeSourceURL; exports._loadTileJSON = function(options) { var indexLoaded = function (err, index) { + if (err) { + this.fire('error', {error: err}); + return; + } //util.extend(this._pyramid, util.pick(index, 'index')); this._pyramid = new TilePyramid({ @@ -37,11 +41,10 @@ exports._loadTileJSON = function(options) { util.extend(this, util.pick(tileJSON, 'tiles', 'minzoom', 'maxzoom', 'attribution')); - if (tileJSON.index){ + if (tileJSON.index) { //console.log("Getting index from: ", tileJSON.index); ajax.getJSON(normalizeURL(tileJSON.index), indexLoaded.bind(this)); - } - else{ + } else { this._pyramid = new TilePyramid({ tileSize: this.tileSize, cacheSize: 20, diff --git a/js/source/esri-tile-pyramid.js b/js/source/esri-tile-pyramid.js index a04cf4bb052..d8dd321d780 100644 --- a/js/source/esri-tile-pyramid.js +++ b/js/source/esri-tile-pyramid.js @@ -284,8 +284,7 @@ TilePyramid.prototype = { _indexSearch: function (id) { //console.log("checking index for missing tile"); var tile = TileCoord.fromID(id), - w = tile.w, - result, z; + w = tile.w; var ids = []; diff --git a/js/source/source.js b/js/source/source.js index 9c787267be3..9b1f06e15aa 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -8,7 +8,7 @@ var TileCoord = require('./tile_coord'); var normalizeURL = require('../util/mapbox').normalizeSourceURL; exports._loadTileJSON = function(options) { - + var loaded = function(err, tileJSON) { if (err) { this.fire('error', {error: err}); @@ -41,7 +41,7 @@ exports._loadTileJSON = function(options) { return; } - util.extend(this._pyramid, index); + util.extend(this._pyramid, index); this.fire('load'); }.bind(this)); diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index d9e6ef1d5dd..b2b9155a961 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -25,7 +25,7 @@ function TilePyramid(options) { this.maxzoom = options.maxzoom; this.roundZoom = options.roundZoom; this.reparseOverscaled = options.reparseOverscaled; - // esri/chelm + // esri/chelm this.index = options.index; this._load = options.load; @@ -275,7 +275,7 @@ TilePyramid.prototype = { tile = new Tile(wrapped, this.tileSize * overscaling); // esri/chelm if (this.index) { - tile.parentId = this.indexSearch(id); + tile.parentId = this.indexSearch(coord.id); } this._load(tile); } From 8c93f73bfaeb279f013a9b6e5835be82897e00a4 Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 12:52:57 -0600 Subject: [PATCH 08/27] fixing ref to parentID --- js/source/vector_tile_source.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/source/vector_tile_source.js b/js/source/vector_tile_source.js index 1e9d7cc568e..47dae81139b 100644 --- a/js/source/vector_tile_source.js +++ b/js/source/vector_tile_source.js @@ -3,6 +3,7 @@ var util = require('../util/util'); var Evented = require('../util/evented'); var Source = require('./source'); +var TileCoord = require('./tile_coord'); module.exports = VectorTileSource; @@ -77,7 +78,7 @@ VectorTileSource.prototype = util.inherit(Evented, { // request the tile parentID if it exists if (tile.parentId) { - params.url = tile.coord.fromID(tile.parentID).url(this.tiles, this.maxzoom); + params.url = TileCoord.fromID(tile.parentId).url(this.tiles, this.maxzoom); } if (tile.workerID) { From 340c79a54a8c5193c1e45e33705a6f7a691cf1d3 Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 12:55:23 -0600 Subject: [PATCH 09/27] adding the demo code to show the index working (but ps... its not working yet) --- demo/index.html | 40 + demo/streets-mobile.json | 9001 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 9041 insertions(+) create mode 100644 demo/index.html create mode 100644 demo/streets-mobile.json diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 00000000000..1f07f9887fa --- /dev/null +++ b/demo/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + +
+ + + + + diff --git a/demo/streets-mobile.json b/demo/streets-mobile.json new file mode 100644 index 00000000000..522c5be102f --- /dev/null +++ b/demo/streets-mobile.json @@ -0,0 +1,9001 @@ +{ + "version" : 7, + "sprite" : "http://basemapsbeta.arcgis.com/preview/styles/StreetMapMobile/resources/sprites/sprite", + "glyphs" : "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/fonts/{fontstack}/{range}.pbf", + "sources" : { + "esri" : { + "type" : "indexedVector", + "minZoom" : 0, + "maxZoom" : 19, + "bounds" : [ + -180, + -85.0511, + 180, + 85.0511 + ], + "name" : "World", + "scheme" : "xyz", + "tilejson" : "2.0.0", + "tiles" : [ + "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/tile/{z}/{x}/{y}.pbf" + ], + "index" : "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/tilemap/index.json" + } + }, + "constants" : { + "@waterbody_sea_fill_color" : "#b6deff", + "@waterbody_sea_1_fill_color" : "#b6deff", + "@Arial Italic" : "Arial Italic", + "@land_land_fill_color" : "#F6F1E7", + "@land_land_1_fill_color" : "#a9cdeb", + "@land_ice_fill_color" : "#FFFFFF", + "@land_ice_1_fill_color" : "#a9cdeb", + "@bathymetry_2_fill_color" : "#b6deff", + "@bathymetry_3_fill_color" : "#b6deff", + "@bathymetry_4_fill_color" : "#b6deff", + "@bathymetry_5_fill_color" : "#b6deff", + "@bathymetry_6_fill_color" : "#b6deff", + "@bathymetry_7_fill_color" : "#b6deff", + "@urban_areas_fill_color" : "#EBE3DC", + "@vectorvegsmallscale_9_fill_color" : "#cbe5b1", + "@vectorvegsmallscale_10_fill_color" : "#bae291", + "@vectorvegsmallscale_9_1_fill_color" : "#cbe5b1", + "@vectorvegsmallscale_10_1_fill_color" : "#bae291", + "@airport_airport_property_SL1_SLD0_fill_color" : "#E0E1E0", + "@airport_airport_property_SL0_SLD0_line_color" : "#d1d1d1", + "@airport_airport_property_SL0_SLD0_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.666667], [14, 0.666667], [17, 0.666667]] + }, + "@airport_airport_runway_SLD1_fill_color" : "#CFD0D0", + "@Arial Regular" : "Arial Regular", + "@admin1_park_fill_color" : "#cbe5b1", + "@admin_0_forest;_admin_0_park_fill_color" : "#cbe5b1", + "@open_space_fill_color" : "#cbe5b1", + "@water_supply_and_treatment_SL1_fill_color" : "#E0E1E0", + "@water_supply_and_treatment_SL0_line_color" : "#d1d1d1", + "@water_supply_and_treatment_SL0_line_width" : { + "base" : 1.2, + "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@transportation_facility_SL1_fill_color" : "#E0E1E0", + "@transportation_facility_SL0_line_color" : "#d1d1d1", + "@transportation_facility_SL0_line_width" : { + "base" : 1.2, + "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@port_facility_SL1_fill_color" : "#E0E1E0", + "@port_facility_SL0_line_color" : "#d1d1d1", + "@port_facility_SL0_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.266667], [17, 0.266667]] + }, + "@military_SL1_fill_color" : "#E0E1E0", + "@military_SL0_line_color" : "#d1d1d1", + "@military_SL0_line_width" : { + "base" : 1.2, + "stops" : [[6, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@industry_SL1_fill_color" : "#E0E1E0", + "@industry_SL0_line_color" : "#d1d1d1", + "@industry_SL0_line_width" : { + "base" : 1.2, + "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@tribal_government_facility_fill_color" : "#ded9cb", + "@mail_and_shipping_fill_color" : "#E8E3D5", + "@energy;_government;_information_and_communication_fill_color" : "#E8E3D5", + "@building_general;_emergency_response_and_law_enforcement_fill_color" : "#E8E3D5", + "@banking_and_finance_fill_color" : "#E8E3D5", + "@health_and_medical_SL1_fill_color" : "#fcd6a8", + "@health_and_medical_SL0_line_color" : "#fcd6a8", + "@health_and_medical_SL0_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@public_attraction_and_landmark_fill_color" : "#fcd6a8", + "@commercial_and_retail_fill_color" : "#fcd6a8", + "@education_fill_color" : "#fddfd6", + "@cemetery_fill_color" : "#cbe5b1", + "@golf_course_SL1_fill_color" : "#cbe5b1", + "@golf_course_SL0_line_color" : "#cbe5b1", + "@golf_course_SL0_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.266667], [14, 0.266667], [17, 0.266667]] + }, + "@zoo_fill_color" : "#cbe5b1", + "@park_fill_color" : "#cbe5b1", + "@water_body_577k_-_2m_lake_or_pond;_stream_or_river_fill_color" : "#b6deff", + "@water_body_577k_-_2m_lake_or_pond-intermittent_fill_color" : "#b6deff", + "@water_body_4m_-_9m_lake_or_pond;_stream_or_river_fill_color" : "#b6deff", + "@water_body_4m_-_9m_lake_or_pond-intermittent_fill_color" : "#b6deff", + "@water_body_18m_-_147m_SL1_fill_color" : "#b6deff", + "@water_body_18m_-_147m_SL0_line_color" : "#b6deff", + "@water_body_18m_-_147m_SL0_line_width" : { + "base" : 1.2, + "stops" : [[1, 0.533333], [5, 0.533333]] + }, + "@waterbody_inundated_area_SLD0_fill_color" : "#b6deff", + "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3_fill_color" : "#b6deff", + "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_color" : "#b6deff", + "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.666667], [14, 0.666667], [17, 0.666667]] + }, + "@waterbody_playa_SLD4_fill_color" : "#b6deff", + "@waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash_SLD4_fill_color" : "#b6deff", + "@waterbody_ice_mass_SLD6_fill_color" : "#b6deff", + "@waterbody_swamp_or_marsh_SLD6_fill_color" : "#b6deff", + "@Arial Bold Italic" : "Arial Bold Italic", + "@water_flowline_577k_-_2m_stream_or_river_line_color" : "#b6deff", + "@water_flowline_577k_-_2m_stream_or_river_line_width" : { + "base" : 1.2, + "stops" : [[7, 0.5], [11, 0.7]] + }, + "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_color" : "#b6deff", + "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_width" : { + "base" : 1.2, + "stops" : [[7, 0.5], [11, 0.7]] + }, + "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_color" : "#b6deff", + "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_width" : { + "base" : 1.2, + "stops" : [[7, 0.533333], [11, 0.533333]] + }, + "@water_flowline_577k_-_2m_canal_or_ditch_SL0_icon_image" : "water_flowline_577k_-_2m_canal_or_ditch_SL0", + "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_color" : "#b6deff", + "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_width" : { + "base" : 1.2, + "stops" : [[7, 0.5], [11, 0.7]] + }, + "@water_flowline_4m_-_9m_line_color" : "#b6deff", + "@water_flowline_4m_-_9m_line_width" : { + "base" : 1.2, + "stops" : [[5, 0.5], [7, 0.7]] + }, + "@water_flowline_18m_-_147m_line_color" : "#b6deff", + "@water_flowline_18m_-_147m_line_width" : { + "base" : 1.2, + "stops" : [[1, 0.5], [5, 0.7]] + }, + "@waterline_canal_or_ditch_SL1_line_color" : "#b6deff", + "@waterline_canal_or_ditch_SL1_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.7], [14, 1.0], [17, 2]] + }, + "@waterline_canal_or_ditch_SL0_icon_image" : "waterline_canal_or_ditch_SL0", + "@waterline_stream_or_river-intermittent_line_color" : "#b6deff", + "@waterline_stream_or_river-intermittent_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.7], [14, 0.7], [17, 2]] + }, + "@waterline_stream_or_river-intermittent_line_dasharray" : [10.6667, 1.77778], + "@waterline_stream_or_river;_artificial_path;_connector_line_color" : "#b6deff", + "@waterline_stream_or_river;_artificial_path;_connector_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.7], [14, 0.7], [17, 2.66667]] + }, + "@landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0_fill_color" : "#cbe5b1", + "@landscape_grass_SLD1_fill_color" : "#c1d9a8", + "@landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2_fill_color" : "#FCEDC2", + "@landscape_pool___fountain_SLD3_fill_color" : "#b6deff", + "@sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0_fill_color" : "#cbe5b1", + "@sports_baseball_field;_softball_field_SL1_SLD1_fill_color" : "#cbe5b1", + "@sports_baseball_field;_softball_field_SL0_SLD1_line_color" : "#c3e3a4", + "@sports_baseball_field;_softball_field_SL0_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.266667], [17, 0.266667]] + }, + "@sports_golf_fairway_SLD2_fill_color" : "#bcd4a4", + "@sports_golf_sand_trap_SLD3_fill_color" : "#FFFFD4", + "@sports_golf_putting_green___teeing_ground_SL1_SLD4_fill_color" : "#afc698", + "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_color" : "#FFFFD4", + "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_width" : { + "base" : 1.2, + "stops" : [[14, 2], [17, 2]] + }, + "@sports_golf_water_hazard_SLD5_fill_color" : "#b6deff", + "@sports_athletic_track;_track_-_clay_or_dirt_SLD6_fill_color" : "#FFCCCC", + "@sports_hardcourt_SL1_SLD7_fill_color" : "#DEDED1", + "@sports_hardcourt_SL0_SLD7_line_color" : "#CCCCC0", + "@sports_hardcourt_SL0_SLD7_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.266667], [17, 0.266667]] + }, + "@pavement_parking_lot;_parking_lot_other_SLD0_fill_color" : "#DEDED1", + "@pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1_fill_color" : "#FFFFFF", + "@pavement_ipc_garden_path_SL1_SLD2_fill_color" : "#FFFFFF", + "@pavement_ipc_garden_path_SL0_SLD2_line_color" : "#E3DED6", + "@pavement_ipc_garden_path_SL0_SLD2_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.266667], [17, 0.266667]] + }, + "@special_area_of_interest_line_line_color" : "#FFFFFF", + "@special_area_of_interest_line_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.666667], [17, 0.666667]] + }, + "@building_footprint_SL1_fill_color" : "#EBE7DC", + "@building_footprint_SL1_1_fill_color" : "#D1CAC5", + "@building_footprint_SL0_line_color" : "#f8f7f4", + "@building_footprint_SL0_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.75], [17, 0.75]] + }, + "@trails_and_paths_SLD0_line_color" : "#FDFDFD", + "@trails_and_paths_SLD0_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.6], [17, 1.6]] + }, + "@Arial Bold" : "Arial Bold", + "@ferry_inland_water_ferry;_ocean_ferry_line_color" : "#92c5f8", + "@ferry_inland_water_ferry;_ocean_ferry_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.0], [14, 1.0], [17, 1.0]] + }, + "@ferry_inland_water_ferry;_ocean_ferry_line_dasharray" : [6.06061, 3.63636], + "@ferry_rail_ferry_SL2_line_color" : "#CFD0D0", + "@ferry_rail_ferry_SL2_line_width" : { + "base" : 1.2, + "stops" : [[11, 3.33333], [14, 4], [17, 4]] + }, + "@ferry_rail_ferry_SL1_line_color" : "#E0E1E0", + "@ferry_rail_ferry_SL1_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 1.33333], [17, 1.33333]] + }, + "@ferry_rail_ferry_SL0_icon_image" : "ferry_rail_ferry_SL0", + "@road_centerlines_4wd;_recreation_SL1_SLD0_line_color" : "#FFFFFF", + "@road_centerlines_4wd;_recreation_SL1_SLD0_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 2], [17, 4]] + }, + "@road_centerlines_local_road_SL1_SLD1_line_color" : "#CCCCCC", + "@road_centerlines_local_road_SL1_SLD1_line_width" : { + "base" : 1.4, + "stops" : [[11, 1.5], [14, 4.0], [17, 6.0]] + }, + "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color" : "#CCCCCC", + "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.5], [14, 3.33333], [17, 4.33333]] + }, + "@road_centerlines_pedestrian_SLD1_line_color" : "#ebe8e2", + "@road_centerlines_pedestrian_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[14, 0.75], [17, 2.6]] + }, + "@road_centerlines_4wd;_recreation_SL0_SLD1_line_color" : "#CCCCCC", + "@road_centerlines_4wd;_recreation_SL0_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[11, 1], [14, 1], [17, 2]] + }, + "@road_centerlines_local_road_SL0_SLD5_line_color" : "#FDFDFD", + "@road_centerlines_local_road_SL0_SLD5_line_width" : { + "base" : 1.4, + "stops" : [[11, 0.75], [14, 2.66667], [17, 4.66667]] + }, + "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color" : "#FDFDFD", + "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.75], [14, 1.33333], [17, 2.33333]] + }, + "@road_centerlines_minor_arterial_SL1_SLD7_line_color" : "#acaeb0", + "@road_centerlines_minor_arterial_SL1_SLD7_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.7], [14, 6.66667], [17, 6.66667]] + }, + "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color" : "#acaeb0", + "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4], [17, 6]] + }, + "@road_centerlines_minor_arterial_SL0_SLD9_line_color" : "#FFFFFF", + "@road_centerlines_minor_arterial_SL0_SLD9_line_width" : { + "base" : 1.2, + "stops" : [[9, 1], [14, 4.66667], [17, 4.66667]] + }, + "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color" : "#FFFFFF", + "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.75], [14, 2], [17, 4]] + }, + "@road_centerlines_major_arterial_SL1_SLD11_line_color" : "#f7b45e", + "@road_centerlines_major_arterial_SL1_SLD11_line_width" : { + "base" : 1.2, + "stops" : [[8, 1.5], [14, 7.33333], [17, 14.33333]] + }, + "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color" : "#f7b45e", + "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4.66667], [17, 7.66667]] + }, + "@road_centerlines_major_arterial_SL0_SLD13_line_color" : "#FFEBC4", + "@road_centerlines_major_arterial_SL0_SLD13_line_width" : { + "base" : 1.2, + "stops" : [[8, 0.75], [14, 5.33333], [17, 10.33333]] + }, + "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color" : "#FFEBC4", + "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.75], [14, 2.66667], [17, 4.66667]] + }, + "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_color" : "#FF9A42", + "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" : { + "base" : 1.2, + "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] + }, + "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_color" : "#d4d1ca", + "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_width" : { + "base" : 1.2, + "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] + }, + "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color" : "#FF9A42", + "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4.66667], [17, 8.66667]] + }, + "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_color" : "#FFEC80", + "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" : { + "base" : 1.2, + "stops" : [[4, 0.55], [14, 5.33333], [17, 10.33333]] + }, + "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color" : "#FFEC80", + "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.55], [14, 2.66667], [17, 4.66667]] + }, + "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_color" : "#FFFFFF", + "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 2], [17, 4]] + }, + "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_color" : "#CCCCCC", + "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_width" : { + "base" : 1.4, + "stops" : [[11, 1.5], [14, 4.0], [17, 6.0]] + }, + "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color" : "#CCCCCC", + "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.5], [14, 3.33333], [17, 4.33333]] + }, + "@road_centerlines_(tunnels)_pedestrian_SLD1_line_color" : "#FDFDFD", + "@road_centerlines_(tunnels)_pedestrian_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.6], [17, 1.6]] + }, + "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_color" : "#D4D4AE", + "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_width" : { + "base" : 1.2, + "stops" : [[11, 1], [14, 1], [17, 1]] + }, + "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_color" : "#FDFDFD", + "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 2.66667], [17, 2.66667]] + }, + "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color" : "#FDFDFD", + "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 1.33333], [17, 1.33333]] + }, + "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_color" : "#acaeb0", + "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.7], [14, 6.66667], [17, 6.66667]] + }, + "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color" : "#acaeb0", + "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4], [17, 6]] + }, + "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_color" : "#FFFFFF", + "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_width" : { + "base" : 1.2, + "stops" : [[9, 1], [14, 4.66667], [17, 4.66667]] + }, + "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color" : "#FFFFFF", + "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.75], [14, 2], [17, 4]] + }, + "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_color" : "#f7b45e", + "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_width" : { + "base" : 1.2, + "stops" : [[8, 1.5], [14, 7.33333], [17, 14.33333]] + }, + "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color" : "#f7b45e", + "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4.66667], [17, 7.66667]] + }, + "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_color" : "#ffebc4", + "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_width" : { + "base" : 1.2, + "stops" : [[8, 0.75], [14, 5.33333], [17, 10.33333]] + }, + "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color" : "#ffebc4", + "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.75], [14, 2.66667], [17, 4.66667]] + }, + "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_color" : "#FF9A42", + "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" : { + "base" : 1.2, + "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] + }, + "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color" : "#FF9A42", + "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" : { + "base" : 1.2, + "stops" : [[9, 1.5], [14, 4.66667], [17, 8.66667]] + }, + "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_color" : "#FFEC80", + "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" : { + "base" : 1.2, + "stops" : [[4, 0.55], [14, 5.33333], [17, 10.33333]] + }, + "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color" : "#FFEC80", + "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" : { + "base" : 1.2, + "stops" : [[9, 0.55], [14, 2.66667], [17, 4.66667]] + }, + "@railroad_SL2_line_color" : "#CFD0D0", + "@railroad_SL2_line_width" : { + "base" : 1.2, + "stops" : [[11, 1.33333], [14, 1.33333], [17, 3.33333]] + }, + "@railroad_SL1_line_color" : "#dbdddb", + "@railroad_SL1_line_width" : { + "base" : 1.2, + "stops" : [[11, 0.75], [14, 0.75], [17, 1.33333]] + }, + "@railroad_SL0_icon_image" : "railroad_SL0", + "@boundaries_admin0_SL1_SLD2_line_color" : "#ddd8e7", + "@boundaries_admin0_SL1_SLD2_line_width" : { + "base" : 1.2, + "stops" : [[1, 1.5], [14, 9.0], [17, 9.0]] + }, + "@boundaries_admin0_SL1_SLD2_1_line_color" : "#b9b5ad", + "@boundaries_admin0_SL1_SLD2_1_line_width" : { + "base" : 1.2, + "stops" : [[1, 1], [14, 9.33333], [17, 9.33333]] + }, + "@boundaries_admin1_SL1_SLD2_line_color" : "#ece9f5", + "@boundaries_admin1_SL1_SLD2_line_width" : { + "base" : 1.0, + "stops" : [[4, 1.0], [14, 5.0], [17, 5.0]] + }, + "@boundaries_admin2_SL1_SLD2_line_color" : "#e6e0f0", + "@boundaries_admin2_SL1_SLD2_line_width" : { + "base" : 1.2, + "stops" : [[8, 0], [14, 0], [17, 0]] + }, + "@boundaries_admin0_SL0_SLD5_line_color" : "#c4bbd8", + "@boundaries_admin0_SL0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[1, 0.5], [14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin1_SL0_SLD5_line_color" : "#d7ccef", + "@boundaries_admin1_SL0_SLD5_line_width" : { + "base" : 1.0, + "stops" : [[4, 0.5], [14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin2_SL0_SLD5_line_color" : "#d1c7e8", + "@boundaries_admin2_SL0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[8, 1.0], [14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin2_SL0_SLD5_line_dasharray" : [8, 5.33333], + "@boundaries_admin3_SLD5_line_color" : "#CCCCCC", + "@boundaries_admin3_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin3_SLD5_line_dasharray" : [6.66667, 4], + "@boundaries_admin4_SLD5_line_color" : "#CCCCCC", + "@boundaries_admin4_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin4_SLD5_line_dasharray" : [6.66667, 4], + "@boundaries_admin5_SLD5_line_color" : "#CCCCCC", + "@boundaries_admin5_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.33333], [17, 1.33333]] + }, + "@boundaries_admin5_SLD5_line_dasharray" : [6.66667, 4], + "@boundaries_disputed_admin0_SLD5_line_color" : "#CCCCCC", + "@boundaries_disputed_admin0_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[1, 1.33333], [14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin0_SLD5_line_dasharray" : [6.0, 3.0], + "@boundaries_disputed_admin1_SLD5_line_color" : "#CCCCCC", + "@boundaries_disputed_admin1_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[4, 1.33333], [14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin1_SLD5_line_dasharray" : [6.0, 3.0], + "@boundaries_disputed_admin2_SLD5_line_color" : "#CCCCCC", + "@boundaries_disputed_admin2_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[10, 1.33333], [14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin2_SLD5_line_dasharray" : [6.0, 3.0], + "@boundaries_disputed_admin3_SLD5_line_color" : "#CCCCCC", + "@boundaries_disputed_admin3_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin3_SLD5_line_dasharray" : [6.0, 3.0], + "@boundaries_disputed_admin4_SLD5_line_color" : "#9DA0A2", + "@boundaries_disputed_admin4_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin4_SLD5_line_dasharray" : [6.0, 3.0], + "@boundaries_disputed_admin5_SLD5_line_color" : "#CCCCCC", + "@boundaries_disputed_admin5_SLD5_line_width" : { + "base" : 1.2, + "stops" : [[14, 1.6], [17, 1.6]] + }, + "@boundaries_disputed_admin5_SLD5_line_dasharray" : [6.0, 3.0], + "@points_of_interest_bus_station_icon_image" : "points_of_interest_bus_station", + "@points_of_interest_rail_station_icon_image" : "points_of_interest_rail_station", + "@populated_places_(large_scale)_icon_image" : "populated_places_(large_scale)", + "@populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital", + "@populated_places_(small_scale)_1,000,000_and_up,_admin1_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin1_capital", + "@populated_places_(small_scale)_1,000,000_and_up,_admin2_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin2_capital", + "@populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place", + "@populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital", + "@populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital", + "@populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place", + "@populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital", + "@populated_places_(small_scale)_100,000_to_299,999,_admin1_capital_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_admin1_capital", + "@populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place", + "@populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital", + "@populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital", + "@populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place", + "@populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital", + "@populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital", + "@populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet", + "@populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital", + "@populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet_icon_image" : "populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet", + "@populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital" + }, + "layers" : [{ + "id" : "background", + "type" : "background", + "paint" : { + "background-color" : "#F6F1E7" + } + },{ + "id" : "waterbody_sea_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody_Sea", + "minzoom" : 0, + "layout" : {}, + "paint" : { + "fill-color" : "@waterbody_sea_1_fill_color" + } + }, { + "id" : "waterbody_sea", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody_Sea", + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@waterbody_sea_fill_color" + } + }, { + "id" : "bathymetry_2", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 0], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_2_fill_color" + } + }, { + "id" : "bathymetry_3", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 1], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_3_fill_color" + } + }, { + "id" : "bathymetry_4", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 2], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_4_fill_color" + } + }, { + "id" : "bathymetry_5", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 3], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_5_fill_color" + } + }, { + "id" : "bathymetry_6", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 4], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_6_fill_color" + } + }, { + "id" : "bathymetry_7", + "type" : "fill", + "source" : "esri", + "source-layer" : "Bathymetry", + "filter" : ["==", "_symbol", 5], + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@bathymetry_7_fill_color" + } + }, { + "id" : "land_land_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Land", + "filter" : ["==", "_symbol", 0], + "minzoom" : 0, + "layout" : {}, + "paint" : { + "fill-color" : "@land_land_1_fill_color", + "fill-translate" : [2,2] + } + },{ + "id" : "land_land", + "type" : "fill", + "source" : "esri", + "source-layer" : "Land", + "filter" : ["==", "_symbol", 0], + "minzoom" : 0, + "layout" : {}, + "paint" : { + "fill-color" : "@land_land_fill_color" + } + }, { + "id" : "land_ice_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Land", + "filter" : ["==", "_symbol", 1], + "minzoom" : 0, + "layout" : {}, + "paint" : { + "fill-color" : "@land_ice_1_fill_color", + "fill-translate" : [2,2] + } + }, { + "id" : "land_ice", + "type" : "fill", + "source" : "esri", + "source-layer" : "Land", + "filter" : ["==", "_symbol", 1], + "minzoom" : 0, + "layout" : {}, + "paint" : { + "fill-color" : "@land_ice_fill_color" + } + },{ + "id" : "urban_areas", + "type" : "fill", + "source" : "esri", + "source-layer" : "Urban Areas", + "minzoom" : 5, + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@urban_areas_fill_color" + } + }, { + "id" : "vectorvegsmallscale_9_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "VectorVegSmallScale", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "maxzoom" : 4, + "layout" : {}, + "paint" : { + "fill-color" : "@vectorvegsmallscale_9_1_fill_color", + "fill-opacity" : 0.15 + } + }, { + "id" : "vectorvegsmallscale_10_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "VectorVegSmallScale", + "filter" : ["==", "_symbol", 1], + "minzoom" : 4, + "maxzoom" : 4, + "layout" : {}, + "paint" : { + "fill-color" : "@vectorvegsmallscale_10_1_fill_color", + "fill-opacity" : 0.15 + } + }, { + "id" : "vectorvegsmallscale_9", + "type" : "fill", + "source" : "esri", + "source-layer" : "VectorVegSmallScale", + "filter" : ["==", "_symbol", 0], + "maxzoom" : 4, + "layout" : {}, + "paint" : { + "fill-color" : "@vectorvegsmallscale_9_fill_color", + "fill-opacity" : 0.2 + } + }, { + "id" : "vectorvegsmallscale_10", + "type" : "fill", + "source" : "esri", + "source-layer" : "VectorVegSmallScale", + "filter" : ["==", "_symbol", 1], + "maxzoom" : 4, + "layout" : {}, + "paint" : { + "fill-color" : "@vectorvegsmallscale_10_fill_color", + "fill-opacity" : 0.2 + } + }, { + "id" : "open_space", + "type" : "fill", + "source" : "esri", + "source-layer" : "Open Space", + "minzoom" : 12, + "layout" : {}, + "paint" : { + "fill-color" : "@open_space_fill_color" + } + }, { + "id" : "admin_0_forest;_admin_0_park", + "type" : "fill", + "source" : "esri", + "source-layer" : "Admin 0 Forest; Admin 0 park", + "minzoom" : 5, + "layout" : {}, + "paint" : { + "fill-color" : "@admin_0_forest;_admin_0_park_fill_color" + } + }, { + "id" : "admin1_park", + "type" : "fill", + "source" : "esri", + "source-layer" : "Admin1 Park", + "minzoom" : 9, + "layout" : {}, + "paint" : { + "fill-color" : "@admin1_park_fill_color" + } + }, { + "id" : "zoo", + "type" : "fill", + "source" : "esri", + "source-layer" : "Zoo", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@zoo_fill_color" + } + }, { + "id" : "military_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Military", + "minzoom" : 6, + "layout" : {}, + "paint" : { + "fill-color" : "@military_SL1_fill_color" + } + }, { + "id" : "military_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Military", + "minzoom" : 6, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@military_SL0_line_color", + "line-width" : "@military_SL0_line_width" + } + }, { + "id" : "port_facility_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "port Facility", + "minzoom" :6, + "layout" : {}, + "paint" : { + "fill-color" : "@port_facility_SL1_fill_color" + } + }, { + "id" : "port_facility_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "port Facility", + "minzoom" :6, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@port_facility_SL0_line_color", + "line-width" : "@port_facility_SL0_line_width" + } + }, { + "id" : "transportation_facility_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Transportation Facility", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@transportation_facility_SL1_fill_color" + } + }, { + "id" : "transportation_facility_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Transportation Facility", + "minzoom" : 13, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@transportation_facility_SL0_line_color", + "line-width" : "@transportation_facility_SL0_line_width" + } + }, { + "id" : "industry_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Industry", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@industry_SL1_fill_color" + } + }, { + "id" : "industry_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Industry", + "minzoom" : 13, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@industry_SL0_line_color", + "line-width" : "@industry_SL0_line_width" + } + }, { + "id" : "tribal_government_facility", + "type" : "fill", + "source" : "esri", + "source-layer" : "Tribal Government Facility", + "minzoom" : 8, + "layout" : {}, + "paint" : { + "fill-color" : "@tribal_government_facility_fill_color" + } + }, { + "id" : "golf_course_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Golf Course", + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@golf_course_SL1_fill_color" + } + }, { + "id" : "golf_course_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Golf Course", + "minzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@golf_course_SL0_line_color", + "line-width" : "@golf_course_SL0_line_width" + } + }, { + "id" : "airport_airport_property_SL1_SLD0", + "type" : "fill", + "source" : "esri", + "source-layer" : "Airport", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : {}, + "paint" : { + "fill-color" : "@airport_airport_property_SL1_SLD0_fill_color" + } + }, { + "id" : "airport_airport_property_SL0_SLD0", + "type" : "line", + "source" : "esri", + "source-layer" : "Airport", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@airport_airport_property_SL0_SLD0_line_color", + "line-width" : "@airport_airport_property_SL0_SLD0_line_width" + } + }, { + "id" : "airport_airport_runway_SLD1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Airport", + "filter" : ["==", "_symbol", 0], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@airport_airport_runway_SLD1_fill_color" + } + }, { + "id" : "commercial_and_retail", + "type" : "fill", + "source" : "esri", + "source-layer" : "Commercial and Retail", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@commercial_and_retail_fill_color" + } + }, { + "id" : "water_supply_and_treatment_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Supply and Treatment", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@water_supply_and_treatment_SL1_fill_color" + } + }, { + "id" : "water_supply_and_treatment_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Supply and Treatment", + "minzoom" : 13, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_supply_and_treatment_SL0_line_color", + "line-width" : "@water_supply_and_treatment_SL0_line_width" + } + }, { + "id" : "mail_and_shipping", + "type" : "fill", + "source" : "esri", + "source-layer" : "Mail and Shipping", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@mail_and_shipping_fill_color" + } + }, { + "id" : "cemetery", + "type" : "fill", + "source" : "esri", + "source-layer" : "Cemetery", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@cemetery_fill_color" + } + }, { + "id" : "park", + "type" : "fill", + "source" : "esri", + "source-layer" : "Park", + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@park_fill_color" + } + }, { + "id" : "banking_and_finance", + "type" : "fill", + "source" : "esri", + "source-layer" : "Banking and Finance", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@banking_and_finance_fill_color" + } + }, { + "id" : "energy;_government;_information_and_communication", + "type" : "fill", + "source" : "esri", + "source-layer" : "Energy; Government; Information and Communication", + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@energy;_government;_information_and_communication_fill_color" + } + }, { + "id" : "building_general;_emergency_response_and_law_enforcement", + "type" : "fill", + "source" : "esri", + "source-layer" : "Building General; Emergency Response and Law Enforcement", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@building_general;_emergency_response_and_law_enforcement_fill_color" + } + }, { + "id" : "public_attraction_and_landmark", + "type" : "fill", + "source" : "esri", + "source-layer" : "Public Attraction and Landmark", + "minzoom" : 13, + "layout" : {}, + "paint" : { + "fill-color" : "@public_attraction_and_landmark_fill_color" + } + }, { + "id" : "education", + "type" : "fill", + "source" : "esri", + "source-layer" : "Education", + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@education_fill_color" + } + }, { + "id" : "health_and_medical_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Health and Medical", + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@health_and_medical_SL1_fill_color" + } + }, { + "id" : "health_and_medical_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Health and Medical", + "minzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@health_and_medical_SL0_line_color", + "line-width" : "@health_and_medical_SL0_line_width" + } + }, { + "id" : "water_body_577k_-_2m_lake_or_pond;_stream_or_river", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Body_577k - 2m", + "filter" : ["==", "_symbol", 0], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@water_body_577k_-_2m_lake_or_pond;_stream_or_river_fill_color" + } + }, { + "id" : "water_body_577k_-_2m_lake_or_pond-intermittent", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Body_577k - 2m", + "filter" : ["==", "_symbol", 1], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : {}, + "paint" : { + "fill-image" : "water_body_577k_-_2m_lake_or_pond-intermittent" + } + }, { + "id" : "water_body_4m_-_9m_lake_or_pond;_stream_or_river", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Body_4m - 9m", + "filter" : ["==", "_symbol", 0], + "minzoom" : 5, + "maxzoom" : 7, + "layout" : {}, + "paint" : { + "fill-color" : "@water_body_4m_-_9m_lake_or_pond;_stream_or_river_fill_color" + } + }, { + "id" : "water_body_4m_-_9m_lake_or_pond-intermittent", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Body_4m - 9m", + "filter" : ["==", "_symbol", 1], + "minzoom" : 5, + "maxzoom" : 7, + "layout" : {}, + "paint" : { + "fill-image" : "water_body_4m_-_9m_lake_or_pond-intermittent" + } + }, { + "id" : "water_body_18m_-_147m_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Water Body_18m - 147m", + "minzoom" : 1, + "maxzoom" : 5, + "layout" : {}, + "paint" : { + "fill-color" : "@water_body_18m_-_147m_SL1_fill_color" + } + }, { + "id" : "water_body_18m_-_147m_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Body_18m - 147m", + "minzoom" : 1, + "maxzoom" : 5, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_body_18m_-_147m_SL0_line_color", + "line-width" : "@water_body_18m_-_147m_SL0_line_width" + } + }, { + "id" : "waterbody_inundated_area_SLD0", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 4], + "minzoom" : 12, + "layout" : {}, + "paint" : { + "fill-color" : "@waterbody_inundated_area_SLD0_fill_color" + } + }, { + "id" : "waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-color" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3_fill_color" + } + }, { + "id" : "waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3", + "type" : "line", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_color", + "line-width" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_width" + } + }, { + "id" : "waterbody_playa_SLD4", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 1], + "minzoom" : 12, + "layout" : {}, + "paint" : { + "fill-image" : "waterbody_playa" + } + }, { + "id" : "waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash_SLD4", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 5], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-image" : "waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash", + "fill-opacity" : 0.35 + } + }, { + "id" : "waterbody_ice_mass_SLD6", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 2], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-image" : "waterbody_ice_mass", + "fill-opacity" : 0.4 + } + }, { + "id" : "waterbody_swamp_or_marsh_SLD6", + "type" : "fill", + "source" : "esri", + "source-layer" : "Waterbody", + "filter" : ["==", "_symbol", 3], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "fill-image" : "waterbody_swamp_or_marsh", + "fill-opacity" : 0.5 + } + }, { + "id" : "water_flowline_577k_-_2m_stream_or_river", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m", + "filter" : ["==", "_symbol", 0], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_577k_-_2m_stream_or_river_line_color", + "line-width" : "@water_flowline_577k_-_2m_stream_or_river_line_width" + } + }, { + "id" : "water_flowline_577k_-_2m_stream_or_river-intermittent", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m", + "filter" : ["==", "_symbol", 1], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_color", + "line-width" : "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_width" + } + }, { + "id" : "water_flowline_577k_-_2m_canal_or_ditch_SL1", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m", + "filter" : ["==", "_symbol", 2], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_color", + "line-width" : "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_width" + } + }, { + "id" : "water_flowline_577k_-_2m_canal_or_ditch_SL0", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m", + "filter" : ["==", "_symbol", 2], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "symbol-placement" : "line", + "symbol-avoid-edges" : true, + "icon-image" : "@water_flowline_577k_-_2m_canal_or_ditch_SL0_icon_image", + "icon-allow-overlap" : true, + "icon-padding" : 1 + }, + "paint" : {} + + }, { + "id" : "water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m", + "filter" : ["==", "_symbol", 3], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_color", + "line-width" : "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_width" + } + }, { + "id" : "water_flowline_4m_-_9m", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_4m - 9m", + "minzoom" : 5, + "maxzoom" : 7, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_4m_-_9m_line_color", + "line-width" : "@water_flowline_4m_-_9m_line_width" + } + }, { + "id" : "water_flowline_18m_-_147m", + "type" : "line", + "source" : "esri", + "source-layer" : "Water Flowline_18m - 147m", + "minzoom" : 4, + "maxzoom" : 5, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@water_flowline_18m_-_147m_line_color", + "line-width" : "@water_flowline_18m_-_147m_line_width" + } + }, { + "id" : "waterline_canal_or_ditch_SL1", + "type" : "line", + "source" : "esri", + "source-layer" : "Waterline", + "filter" : ["==", "_symbol", 0], + "minzoom" : 11, + "layout" : { + "line-cap" : "round" + }, + "paint" : { + "line-color" : "@waterline_canal_or_ditch_SL1_line_color", + "line-width" : "@waterline_canal_or_ditch_SL1_line_width" + } + }, { + "id" : "waterline_canal_or_ditch_SL0", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterline", + "filter" : ["==", "_symbol", 0], + "minzoom" : 11, + "layout" : { + "symbol-placement" : "line", + "symbol-avoid-edges" : true, + "icon-image" : "@waterline_canal_or_ditch_SL0_icon_image", + "icon-allow-overlap" : true, + "icon-padding" : 1 + }, + "paint" : {} + + }, { + "id" : "waterline_stream_or_river-intermittent", + "type" : "line", + "source" : "esri", + "source-layer" : "Waterline", + "filter" : ["==", "_symbol", 1], + "minzoom" : 11, + "layout" : {}, + "paint" : { + "line-color" : "@waterline_stream_or_river-intermittent_line_color", + "line-width" : "@waterline_stream_or_river-intermittent_line_width", + "line-dasharray" : "@waterline_stream_or_river-intermittent_line_dasharray" + } + }, { + "id" : "waterline_stream_or_river;_artificial_path;_connector", + "type" : "line", + "source" : "esri", + "source-layer" : "Waterline", + "filter" : ["==", "_symbol", 2], + "minzoom" : 11, + "layout" : { + "line-cap" : "round" + }, + "paint" : { + "line-color" : "@waterline_stream_or_river;_artificial_path;_connector_line_color", + "line-width" : "@waterline_stream_or_river;_artificial_path;_connector_line_width" + } + }, { + "id" : "landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0", + "type" : "fill", + "source" : "esri", + "source-layer" : "Landscape", + "filter" : ["==", "_symbol", 1], + "minzoom" : 14, + "layout" : {}, + "paint" : { + "fill-color" : "@landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0_fill_color" + } + }, { + "id" : "landscape_grass_SLD1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Landscape", + "filter" : ["==", "_symbol", 2], + "minzoom" : 14, + "layout" : {}, + "paint" : { + "fill-color" : "@landscape_grass_SLD1_fill_color" + } + }, { + "id" : "landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2", + "type" : "fill", + "source" : "esri", + "source-layer" : "Landscape", + "filter" : ["==", "_symbol", 0], + "minzoom" : 14, + "layout" : {}, + "paint" : { + "fill-color" : "@landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2_fill_color" + } + }, { + "id" : "landscape_pool___fountain_SLD3", + "type" : "fill", + "source" : "esri", + "source-layer" : "Landscape", + "filter" : ["==", "_symbol", 3], + "minzoom" : 14, + "layout" : {}, + "paint" : { + "fill-color" : "@landscape_pool___fountain_SLD3_fill_color" + } + }, { + "id" : "sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 3], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0_fill_color" + } + }, { + "id" : "sports_baseball_field;_softball_field_SL1_SLD1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 4], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_baseball_field;_softball_field_SL1_SLD1_fill_color" + } + }, { + "id" : "sports_baseball_field;_softball_field_SL0_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 4], + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@sports_baseball_field;_softball_field_SL0_SLD1_line_color", + "line-width" : "@sports_baseball_field;_softball_field_SL0_SLD1_line_width" + } + }, { + "id" : "sports_golf_fairway_SLD2", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 2], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_golf_fairway_SLD2_fill_color" + } + }, { + "id" : "sports_golf_sand_trap_SLD3", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 0], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_golf_sand_trap_SLD3_fill_color" + } + }, { + "id" : "sports_golf_putting_green___teeing_ground_SL1_SLD4", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 1], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_golf_putting_green___teeing_ground_SL1_SLD4_fill_color" + } + }, { + "id" : "sports_golf_putting_green___teeing_ground_SL0_SLD4", + "type" : "line", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 1], + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_color", + "line-width" : "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_width" + } + }, { + "id" : "sports_golf_water_hazard_SLD5", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 5], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_golf_water_hazard_SLD5_fill_color" + } + }, { + "id" : "sports_athletic_track;_track_-_clay_or_dirt_SLD6", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 7], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_athletic_track;_track_-_clay_or_dirt_SLD6_fill_color" + } + }, { + "id" : "sports_hardcourt_SL1_SLD7", + "type" : "fill", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 6], + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@sports_hardcourt_SL1_SLD7_fill_color" + } + }, { + "id" : "sports_hardcourt_SL0_SLD7", + "type" : "line", + "source" : "esri", + "source-layer" : "Sports", + "filter" : ["==", "_symbol", 6], + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@sports_hardcourt_SL0_SLD7_line_color", + "line-width" : "@sports_hardcourt_SL0_SLD7_line_width" + } + }, { + "id" : "pavement_parking_lot;_parking_lot_other_SLD0", + "type" : "fill", + "source" : "esri", + "source-layer" : "Pavement", + "filter" : ["==", "_symbol", 2], + "minzoom" : 17, + "layout" : {}, + "paint" : { + "fill-color" : "@pavement_parking_lot;_parking_lot_other_SLD0_fill_color" + } + }, { + "id" : "pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Pavement", + "filter" : ["==", "_symbol", 0], + "minzoom" : 17, + "layout" : {}, + "paint" : { + "fill-color" : "@pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1_fill_color" + } + }, { + "id" : "pavement_ipc_garden_path_SL1_SLD2", + "type" : "fill", + "source" : "esri", + "source-layer" : "Pavement", + "filter" : ["==", "_symbol", 1], + "minzoom" : 17, + "layout" : {}, + "paint" : { + "fill-color" : "@pavement_ipc_garden_path_SL1_SLD2_fill_color" + } + }, { + "id" : "pavement_ipc_garden_path_SL0_SLD2", + "type" : "line", + "source" : "esri", + "source-layer" : "Pavement", + "filter" : ["==", "_symbol", 1], + "minzoom" : 17, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@pavement_ipc_garden_path_SL0_SLD2_line_color", + "line-width" : "@pavement_ipc_garden_path_SL0_SLD2_line_width" + } + }, { + "id" : "special_area_of_interest_line", + "type" : "line", + "source" : "esri", + "source-layer" : "Special Area of Interest Line", + "minzoom" : 17, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@special_area_of_interest_line_line_color", + "line-width" : "@special_area_of_interest_line_line_width" + } + }, { + "id" : "building_footprint_SL1_1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Building Footprint", + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@building_footprint_SL1_1_fill_color", + "fill-translate" : [1,1] + } + }, + { + "id" : "building_footprint_SL1", + "type" : "fill", + "source" : "esri", + "source-layer" : "Building Footprint", + "minzoom" : 15, + "layout" : {}, + "paint" : { + "fill-color" : "@building_footprint_SL1_fill_color" + } + }, { + "id" : "building_footprint_SL0", + "type" : "line", + "source" : "esri", + "source-layer" : "Building Footprint", + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@building_footprint_SL0_line_color", + "line-width" : "@building_footprint_SL0_line_width" + } + }, { + "id" : "ferry_inland_water_ferry;_ocean_ferry", + "type" : "line", + "source" : "esri", + "source-layer" : "Ferry", + "filter" : ["==", "_symbol", 0], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@ferry_inland_water_ferry;_ocean_ferry_line_color", + "line-width" : "@ferry_inland_water_ferry;_ocean_ferry_line_width", + "line-dasharray" : "@ferry_inland_water_ferry;_ocean_ferry_line_dasharray" + } + }, { + "id" : "ferry_rail_ferry_SL2", + "type" : "line", + "source" : "esri", + "source-layer" : "Ferry", + "filter" : ["==", "_symbol", 1], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@ferry_rail_ferry_SL2_line_color", + "line-width" : "@ferry_rail_ferry_SL2_line_width" + } + }, { + "id" : "railroad_SL2", + "type" : "line", + "source" : "esri", + "source-layer" : "Railroad", + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@railroad_SL2_line_color", + "line-width" : "@railroad_SL2_line_width" + } + }, { + "id" : "railroad_SL1", + "type" : "line", + "source" : "esri", + "source-layer" : "Railroad", + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@railroad_SL1_line_color", + "line-width" : "@railroad_SL1_line_width" + } + }, { + "id" : "railroad_SL0", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Railroad", + "minzoom" : 11, + "layout" : { + "symbol-placement" : "line", + "symbol-avoid-edges" : true, + "icon-image" : "@railroad_SL0_icon_image", + "icon-allow-overlap" : true, + "icon-padding" : 1 + }, + "paint" : {} + + }, { + "id" : "ferry_rail_ferry_SL1", + "type" : "line", + "source" : "esri", + "source-layer" : "Ferry", + "filter" : ["==", "_symbol", 1], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@ferry_rail_ferry_SL1_line_color", + "line-width" : "@ferry_rail_ferry_SL1_line_width" + } + }, { + "id" : "ferry_rail_ferry_SL0", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Ferry", + "filter" : ["==", "_symbol", 1], + "minzoom" : 11, + "layout" : { + "symbol-placement" : "line", + "symbol-avoid-edges" : true, + "icon-image" : "@ferry_rail_ferry_SL0_icon_image", + "icon-allow-overlap" : true, + "icon-padding" : 1 + }, + "paint" : {} + + }, { + "id" : "road_centerlines_4wd;_recreation_SL1_SLD0", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 9], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_4wd;_recreation_SL1_SLD0_line_color", + "line-width" : "@road_centerlines_4wd;_recreation_SL1_SLD0_line_width" + } + }, { + "id" : "road_centerlines_local_road_SL1_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_local_road_SL1_SLD1_line_color", + "line-width" : "@road_centerlines_local_road_SL1_SLD1_line_width" + } + }, { + "id" : "road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 7], + "minzoom" : 14, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color", + "line-width" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" + } + }, { + "id" : "road_centerlines_pedestrian_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 8], + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_pedestrian_SLD1_line_color", + "line-width" : "@road_centerlines_pedestrian_SLD1_line_width" + } + }, { + "id" : "road_centerlines_4wd;_recreation_SL0_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 9], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_4wd;_recreation_SL0_SLD1_line_color", + "line-width" : "@road_centerlines_4wd;_recreation_SL0_SLD1_line_width" + } + }, { + "id" : "road_centerlines_local_road_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_local_road_SL0_SLD5_line_color", + "line-width" : "@road_centerlines_local_road_SL0_SLD5_line_width" + } + }, { + "id" : "road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 7], + "minzoom" : 14, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color", + "line-width" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" + } + }, { + "id" : "road_centerlines_minor_arterial_SL1_SLD7", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 4], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_minor_arterial_SL1_SLD7_line_color", + "line-width" : "@road_centerlines_minor_arterial_SL1_SLD7_line_width" + } + }, { + "id" : "road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 5], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color", + "line-width" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" + } + }, { + "id" : "road_centerlines_minor_arterial_SL0_SLD9", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 4], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_minor_arterial_SL0_SLD9_line_color", + "line-width" : "@road_centerlines_minor_arterial_SL0_SLD9_line_width" + } + }, { + "id" : "road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 5], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color", + "line-width" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" + } + }, { + "id" : "road_centerlines_major_arterial_SL1_SLD11", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 2], + "minzoom" : 8, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_major_arterial_SL1_SLD11_line_color", + "line-width" : "@road_centerlines_major_arterial_SL1_SLD11_line_width" + } + }, { + "id" : "road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 3], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color", + "line-width" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" + } + }, { + "id" : "road_centerlines_major_arterial_SL0_SLD13", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 2], + "minzoom" : 8, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_major_arterial_SL0_SLD13_line_color", + "line-width" : "@road_centerlines_major_arterial_SL0_SLD13_line_width" + } + }, { + "id" : "road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 3], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color", + "line-width" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" + } + }, { + "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_color", + "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_width", + "line-translate" : [0.5,0.5] + } + }, { + "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_color", + "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" + } + }, { + "id" : "road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color", + "line-width" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" + } + }, { + "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_color", + "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" + } + }, { + "id" : "road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color", + "line-width" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" + } + }, { + "id" : "road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 9], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_color", + "line-width" : "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_local_road_SL1_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_color", + "line-width" : "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 7], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color", + "line-width" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_pedestrian_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 8], + "minzoom" : 15, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_pedestrian_SLD1_line_color", + "line-width" : "@road_centerlines_(tunnels)_pedestrian_SLD1_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 9], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_color", + "line-width" : "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_local_road_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 6], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_color", + "line-width" : "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 7], + "minzoom" : 11, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color", + "line-width" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_minor_arterial_SL1_SLD7", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 4], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_color", + "line-width" : "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 5], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color", + "line-width" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_minor_arterial_SL0_SLD9", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 4], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_color", + "line-width" : "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 5], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color", + "line-width" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_major_arterial_SL1_SLD11", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 2], + "minzoom" : 8, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_color", + "line-width" : "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 3], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color", + "line-width" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_major_arterial_SL0_SLD13", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 2], + "minzoom" : 8, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_color", + "line-width" : "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 3], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color", + "line-width" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_color", + "line-width" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color", + "line-width" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 0], + "minzoom" : 4, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_color", + "line-width" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17", + "type" : "line", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)", + "filter" : ["==", "_symbol", 1], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color", + "line-width" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width", + "line-opacity" : 0.3 + } + }, { + "id" : "boundaries_admin0_SL1_SLD2_1", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 0], + "minzoom" : 1, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin0_SL1_SLD2_1_line_color", + "line-width" : "@boundaries_admin0_SL1_SLD2_1_line_width", + "line-translate" : [0.5,0.5] + } + }, { + "id" : "boundaries_admin0_SL1_SLD2", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 0], + "minzoom" : 1, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin0_SL1_SLD2_line_color", + "line-width" : "@boundaries_admin0_SL1_SLD2_line_width" + } + }, { + "id" : "boundaries_admin1_SL1_SLD2", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 1], + "minzoom" : 4, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin1_SL1_SLD2_line_color", + "line-width" : "@boundaries_admin1_SL1_SLD2_line_width" + } + }, { + "id" : "boundaries_admin2_SL1_SLD2", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 2], + "minzoom" : 9, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin2_SL1_SLD2_line_color", + "line-width" : "@boundaries_admin2_SL1_SLD2_line_width" + } + }, { + "id" : "boundaries_admin0_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 0], + "minzoom" : 1, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin0_SL0_SLD5_line_color", + "line-width" : "@boundaries_admin0_SL0_SLD5_line_width" + } + }, { + "id" : "boundaries_admin1_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 1], + "minzoom" : 4, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin1_SL0_SLD5_line_color", + "line-width" : "@boundaries_admin1_SL0_SLD5_line_width" + } + }, { + "id" : "boundaries_admin2_SL0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 2], + "minzoom" : 9, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin2_SL0_SLD5_line_color", + "line-width" : "@boundaries_admin2_SL0_SLD5_line_width", + "line-dasharray" : "@boundaries_admin2_SL0_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_admin3_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 3], + "minzoom" : 16, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin3_SLD5_line_color", + "line-width" : "@boundaries_admin3_SLD5_line_width", + "line-dasharray" : "@boundaries_admin3_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_admin4_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 4], + "minzoom" : 16, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin4_SLD5_line_color", + "line-width" : "@boundaries_admin4_SLD5_line_width", + "line-dasharray" : "@boundaries_admin4_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_admin5_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 5], + "minzoom" : 16, + "layout" : { + "line-cap" : "round", + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_admin5_SLD5_line_color", + "line-width" : "@boundaries_admin5_SLD5_line_width", + "line-dasharray" : "@boundaries_admin5_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin0_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 8], + "minzoom" : 1, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin0_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin0_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin0_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin1_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 9], + "minzoom" : 4, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin1_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin1_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin1_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin2_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 10], + "minzoom" : 10, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin2_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin2_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin2_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin3_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 11], + "minzoom" : 16, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin3_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin3_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin3_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin4_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 12], + "minzoom" : 16, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin4_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin4_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin4_SLD5_line_dasharray" + } + }, { + "id" : "boundaries_disputed_admin5_SLD5", + "type" : "line", + "source" : "esri", + "source-layer" : "Boundaries", + "filter" : ["==", "_symbol", 13], + "minzoom" : 16, + "layout" : { + "line-join" : "round" + }, + "paint" : { + "line-color" : "@boundaries_disputed_admin5_SLD5_line_color", + "line-width" : "@boundaries_disputed_admin5_SLD5_line_width", + "line-dasharray" : "@boundaries_disputed_admin5_SLD5_line_dasharray" + } + }, { + "id" : "nation_boundary_label_labelsize_=_1", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 14.8, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.2 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 14.8, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "nation_boundary_label_labelsize_=_2", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 13.5, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.2 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 13.5, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "nation_boundary_label_labelsize_=_3", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.2 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 12, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "nation_boundary_label_labelsize_=_4", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.2 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 12, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "nation_boundary_label_labelsize_=_5", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.15 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 12, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "nation_boundary_label_labelsize_=_6", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Nation Boundary_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 3, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-transform" : "uppercase", + "text-letter-spacing" : 0.15 + }, + "paint" : { + "text-color" : "#9d94af", + "text-size" : 12, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + },{ + "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 0], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#2d2a2b", + "text-size" : 12, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin1_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 1], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin1_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#2d2a2b", + "text-size" : 12, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin2_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 2], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin2_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#2d2a2b", + "text-size" : 12, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 3], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#2d2a2b", + "text-size" : 12, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 4], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4d4d4f", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 5], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4d4d4f", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 6], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Bold", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4d4d4f", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 7], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#58595b", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_100,000_to_299,999,_admin1_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 8], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_admin1_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#58595b", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 9], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#58595b", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 10], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 11], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 12], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-justify" : "left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 13], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 14], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 15], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 16], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 17], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (small scale)", + "filter" : ["==", "_symbol", 18], + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left", + "text-offset" : [0.15,0] + }, + "paint" : { + "text-color" : "#4E4E4E", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_1,000,000_and_up", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 0], + "minzoom" : 10, + "maxzoom" : 15, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 14.5, + "text-max-width" : 4, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.17, + "text-line-height" : 0.9, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#968da5", + "text-size" : 14.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_300,000_to_999,999", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 1], + "minzoom" : 10, + "maxzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 14.5, + "text-max-width" : 4, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.17, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#968da5", + "text-size" : 14.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_100,000_to_299,999", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 2], + "minzoom" : 10, + "maxzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.2, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#aaa0bc", + "text-size" : 12, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_30,000_to_99,999", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 3], + "minzoom" : 10, + "maxzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 11.5, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.12, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#aaa0bc", + "text-size" : 11.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_10,000_to_29,999", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 4], + "minzoom" : 10, + "maxzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 11.5, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.12, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#aaa0bc", + "text-size" : 11.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)_0_to_9,999", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "filter" : ["==", "_label_class", 5], + "minzoom" : 14, + "maxzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-anchor" : "top", + "text-max-size" : 14, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 5, + "text-justify" : "center", + "text-transform" : "uppercase", + "text-letter-spacing" : 0.12, + "text-offset" : [0,1] + }, + "paint" : { + "text-color" : "#aaa0bc", + "text-size" : 11.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "points_of_interest_bus_station", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Points of Interest", + "filter" : ["==", "_symbol", 2], + "minzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@points_of_interest_bus_station_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "left" + }, + "paint" : { + "text-color" : "#595959", + "text-size" : 10.0, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "points_of_interest_rail_station", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Points of Interest", + "filter" : ["==", "_symbol", 3], + "minzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@points_of_interest_rail_station_icon_image", + "icon-padding" : 1, + "text-font" : "@Arial Regular", + "text-anchor" : "top", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-justify" : "center", + "text-offset" : [0,1.2] + }, + "paint" : { + "text-color" : "#595959", + "text-size" : 10.0, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "populated_places_(large_scale)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Populated Places (large scale)", + "minzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "icon-image" : "@populated_places_(large_scale)_icon_image", + "icon-padding" : 1 + }, + "paint" : {} + }, { + "id" : "admin1_boundary_label_labelsize_=_1", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 15, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.10 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 15, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_boundary_label_labelsize_=_2", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 13.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.10 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 13.6667, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_boundary_label_labelsize_=_3", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 12.3333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.10 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 12.3333, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_boundary_label_labelsize_=_4", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 12, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.1 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 12, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_boundary_label_labelsize_=_5", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 11, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.1 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 11, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_boundary_label_labelsize_=_6", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Boundary_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 5, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 11, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-letter-spacing" : 0.1 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 11, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 1.0, + "text-halo-blur" : 1.0 + } + },{ + "id" : "admin2_boundary_label_labelsize_=_1,2,3", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin2 Boundary_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 9, + "maxzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 11.3333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 11.3333, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 0.933333 + } + }, { + "id" : "admin2_boundary_label_labelsize_=_4,5,6", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin2 Boundary_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 9, + "maxzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#928aa3", + "text-size" : 10, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 0.933333 + } + },{ + "id" : "airport_label_airport_property", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Airport_label", + "minzoom" : 9, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "education_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Education_label", + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "health_and_medical_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Health and Medical_label", + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin1_park_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin1 Park_label", + "minzoom" : 9, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#418841", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "admin_0_forest;_admin_0_park_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Admin 0 Forest; Admin 0 park_label", + "minzoom" : 5, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 10 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "public_attraction_and_landmark_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Public Attraction and Landmark_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "cemetery_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Cemetery_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "golf_course_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Golf Course_label", + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "zoo_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Zoo_label", + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "park_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Park_label", + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "building_general;_emergency_response_and_law_enforcement_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Building General; Emergency Response and Law Enforcement_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-padding" : 2 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "open_space_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Open Space_label", + "minzoom" : 12, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "transportation_facility_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Transportation Facility_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "port_facility_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "port Facility_label", + "minzoom" :6, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "military_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Military_label", + "minzoom" : 6, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "industry_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Industry_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "tribal_government_facility_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Tribal Government Facility_label", + "minzoom" : 8, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "mail_and_shipping_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Mail and Shipping_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "energy;_government;_information_and_communication_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Energy; Government; Information and Communication_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "commercial_and_retail_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Commercial and Retail_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_supply_and_treatment_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Supply and Treatment_label", + "minzoom" : 13, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "park_in_water_(label_only)_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Park In Water (label only)_label", + "minzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#6699CD", + "text-size" : 10 + } + }, { + "id" : "beach_(label_only)_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Beach (label only)_label", + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#908d89", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_body_577k_-_2m_label_lake_or_pond;lake_or_pond-intermittent", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Body_577k - 2m_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.33333, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 9.33333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_body_577k_-_2m_label_stream_or_river", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Body_577k - 2m_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_body_4m_-_9m_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Body_4m - 9m_label", + "minzoom" : 5, + "maxzoom" : 7, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + },{ + "id" : "water_body_18m_-_147m_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Body_18m - 147m_label", + "minzoom" : 1, + "maxzoom" : 5, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 4, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_small_island_(label_only)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#8C7962", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_bay_or_inlet;_estuary", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_canal_or_ditch", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_(large)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 11.3333, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 11.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_(large)_stream_or_river;_stream_or_river-intermittent;_wash", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 11.3333, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 11.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_large_island_(label_only)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#8C7962", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_(small)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 6], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_sea_label_(small)_stream_or_river;_stream_or_river-intermittent;_wash", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_Sea_label", + "filter" : ["==", "_label_class", 7], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + },{ + "id" : "waterbody_label_small_island_(label_only)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#8C7962", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_bay_or_inlet;_estuary", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_canal_or_ditch", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_(large)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 11.3333, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 11.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_(large)_stream_or_river;_stream_or_river-intermittent;_wash", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 11.3333, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 11.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_large_island_(label_only)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#8C7962", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_(small)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 6], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterbody_label_(small)_stream_or_river;_stream_or_river-intermittent;_wash", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterbody_label", + "filter" : ["==", "_label_class", 7], + "minzoom" : 11, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 5, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_flowline_577k_-_2m_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Flowline_577k - 2m_label", + "minzoom" : 7, + "maxzoom" : 11, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1, + "text-offset" : [0,-0.6] + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 9.33333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_flowline_4m_-_9m_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Flowline_4m - 9m_label", + "minzoom" : 5, + "maxzoom" : 7, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1, + "text-offset" : [0,-0.6] + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 9.33333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "water_flowline_18m_-_147m_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Water Flowline_18m - 147m_label", + "minzoom" : 4, + "maxzoom" : 5, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1, + "text-offset" : [0,-0.6] + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 9.33333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "waterline_label_canal_or_ditch", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Waterline_label", + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1, + "text-offset" : [0,-0.6] + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "building_footprint_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Building Footprint_label", + "minzoom" : 15, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "trails_and_paths_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Trails and Paths_label", + "minzoom" : 15, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#666666", + "text-size" : 9.33333, + "text-halo-color" : "#FDFDFD", + "text-halo-width" : 0.933333 + } + }, { + "id" : "ferry_label_ferries", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Ferry_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#6091c3", + "text-size" : 10.0, + "text-halo-color" : "#BFD9F2", + "text-halo-width" : 0.933333 + } + }, { + "id" : "ferry_label_rail_ferries", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Ferry_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 9.5, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#9d9d9d", + "text-size" : 9.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.933333 + } + }, { + "id" : "exits_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Exits", + "minzoom" : 15, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-anchor" : "center", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "exits_default_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_freeway_motorway;_highway_major_road", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#787878", + "text-size" : 10.6667, + "text-halo-color" : "#FFEC80", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_freeway_motorway;_highway_major_road_(alt_name)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#787878", + "text-size" : 10.5, + "text-halo-color" : "#FFEC80", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_major_arterial", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#878787", + "text-size" : 10.5, + "text-halo-color" : "#FFEBC4", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_major_arterial_(alt_name)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#878787", + "text-size" : 10.5, + "text-halo-color" : "#FFEBC4", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_minor_arterial", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#6d6d6d", + "text-size" : 10.0, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1 + } + }, { + "id" : "road_centerlines_label_local_road;_service_road;_4wd;_collector;_recreation;_resource", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#909090", + "text-size" : 9.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_pedestrian", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 6], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#909090", + "text-size" : 9.0, + "text-halo-color" : "#FDFDFD", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_label_primary_hwy_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 7], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_primary_hwy_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_primary_hwy_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 8], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_primary_hwy_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_primary_hwy_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 9], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_primary_hwy_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_primary_hwy_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 10], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_primary_hwy_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 11], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 12], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 13], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 14], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 15], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_secondary_hwy_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 16], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_secondary_hwy_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_u-shaped_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 17], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 18], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_white_green", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 19], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_white_green", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_u-shaped_white_green_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 20], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_white_green_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_u-shaped_green_leaf", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 21], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_green_leaf", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667, + "text-halo-blur" : 1.0 + } + }, { + "id" : "road_centerlines_label_u-shaped_green_leaf_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 22], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_green_leaf_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667, + "text-halo-blur" : 1.0 + } + }, { + "id" : "road_centerlines_label_u-shaped_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 23], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_yellow_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 24], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_yellow_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 25], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 26], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 27], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_u-shaped_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 28], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_u-shaped_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_v-shaped_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 29], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_v-shaped_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_v-shaped_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 30], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_v-shaped_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_stacked_rectangle_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 31], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_stacked_rectangle_white_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_stacked_rectangle_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 32], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_stacked_rectangle_white_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_rectangle_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 33], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_white_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 34], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_white_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 35], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_blue_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_rectangle_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 36], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_blue_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_rectangle_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 37], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_red_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 38], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_red_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 39], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_yellow_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 40], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_yellow_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 41], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_green_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 42], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_green_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_green_yellow", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 43], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_green_yellow_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_green_yellow_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 44], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_green_yellow_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.2], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_inverse_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 45], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_inverse_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_pentagon_inverse_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 46], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_inverse_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_pentagon_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 47], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 48], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 49], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_pentagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 50], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_pentagon_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 51], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_yellow_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 52], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_yellow_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 53], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 54], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_pentagon_green_yellow", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 55], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_green_yellow", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_pentagon_green_yellow_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 56], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_pentagon_green_yellow_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_label_hexagon_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 57], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 58], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 59], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 60], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 61], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 62], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 63], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 64], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_orange_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 65], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_orange_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_hexagon_orange_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 66], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_hexagon_orange_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 67], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#5B708F", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 68], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#5B708F", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 69], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#B66D58", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 70], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#B66D58", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 71], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#718574", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 72], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#718574", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_brown_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 73], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_brown_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#81695E", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_rectangle_hexagon_brown_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 74], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_rectangle_hexagon_brown_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#81695E", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_octagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 75], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_octagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_label_octagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines_label", + "filter" : ["==", "_label_class", 76], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_octagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.1], + "text-padding" : 50 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_freeway_motorway;_highway_major_road", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#787878", + "text-size" : 10.6667, + "text-halo-color" : "#FFEC80", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_freeway_motorway;_highway_major_road_(alt_name)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#787878", + "text-size" : 10.5, + "text-halo-color" : "#FFEC80", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_major_arterial", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#878787", + "text-size" : 10.5, + "text-halo-color" : "#FFEBC4", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_major_arterial_(alt_name)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Bold", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#878787", + "text-size" : 10.5, + "text-halo-color" : "#FFEBC4", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_minor_arterial", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 10, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#6d6d6d", + "text-size" : 10.0, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 1 + } + }, { + "id" : "road_centerlines_(tunnels)_label_local_road;_service_road;_4wd;_collector;_recreation;_resource", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 5], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#909090", + "text-size" : 9.5, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pedestrian", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 6], + "minzoom" : 12, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 10.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#909090", + "text-size" : 9.0, + "text-halo-color" : "#FDFDFD", + "text-halo-width" : 0.666667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_primary_hwy_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 7], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_primary_hwy_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_primary_hwy_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 8], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_primary_hwy_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_primary_hwy_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 9], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_primary_hwy_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_primary_hwy_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 10], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_primary_hwy_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 11], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 12], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 13], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 14], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 15], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_secondary_hwy_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 16], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 17], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 18], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_white_green", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 19], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_green", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_white_green_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 20], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_green_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_green_leaf", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 21], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_green_leaf", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667, + "text-halo-blur" : 1.0 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_green_leaf_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 22], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_green_leaf_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.666667, + "text-halo-blur" : 1.0 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 23], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_yellow_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 24], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_yellow_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 25], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 26], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 27], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_u-shaped_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 28], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_u-shaped_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_v-shaped_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 29], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_v-shaped_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_v-shaped_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 30], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_v-shaped_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_stacked_rectangle_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 31], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_stacked_rectangle_white_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_stacked_rectangle_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 32], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_stacked_rectangle_white_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#343434", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 33], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_white_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 34], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_white_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 35], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_blue_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 36], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_blue_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 37], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_red_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 38], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_red_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 39], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_yellow_black_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 40], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_yellow_black_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 41], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_green_white_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 42], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_green_white_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_green_yellow", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 43], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_green_yellow_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_green_yellow_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 44], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_green_yellow_(alt)_{_len}", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_inverse_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 45], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_inverse_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_inverse_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 46], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_inverse_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 47], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 48], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 49], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 50], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_yellow_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 51], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_yellow_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_yellow_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 52], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_yellow_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 53], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 54], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_green_yellow", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 55], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_green_yellow", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_pentagon_green_yellow_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 56], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 9.33333, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_pentagon_green_yellow_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFF73", + "text-size" : 9.33333 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_white_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 57], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_white_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_white_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 58], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_white_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 59], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 60], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 61], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 62], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FFFFFF", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 63], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 64], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_orange_black", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 65], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_orange_black", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_hexagon_orange_black_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 66], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_hexagon_orange_black_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#000000", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_blue_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 67], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_blue_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#5B708F", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_blue_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 68], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_blue_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#5B708F", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_red_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 69], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_red_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#B66D58", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_red_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 70], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_red_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#B66D58", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 71], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#718574", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 72], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#718574", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_brown_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 73], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_brown_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#81695E", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_brown_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 74], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_brown_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#81695E", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_octagon_green_white", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 75], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_octagon_green_white", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "road_centerlines_(tunnels)_label_octagon_green_white_(alt)", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Road Centerlines (Tunnels)_label", + "filter" : ["==", "_label_class", 76], + "minzoom" : 6, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 125, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-max-size" : 8.66667, + "text-max-width" : 8, + "text-field" : "{_name}", + "icon-image" : "road_centerlines_(tunnels)_octagon_green_white_(alt)", + "icon-rotation-alignment" : "viewport", + "text-rotation-alignment" : "viewport", + "text-offset" : [0, 0.3], + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#FDFDFD", + "text-size" : 8.66667 + } + }, { + "id" : "railroad_label_default", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Railroad_label", + "minzoom" : 14, + "layout" : { + "symbol-placement" : "line", + "symbol-min-distance" : 200, + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#9d9d9d", + "text-size" : 9.5, + "text-halo-color" : "#F6F1E7", + "text-halo-width" : 0.933333 + } + }, { + "id" : "points_of_interest_black_(poi)_label;_ferry_terminal", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Points of Interest", + "filter" : ["==", "_label_class", 0], + "minzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-anchor" : "center", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "points_of_interest_green_(park)_label", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Points of Interest", + "filter" : ["==", "_label_class", 1], + "minzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-anchor" : "center", + "text-max-size" : 10, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#408340", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "points_of_interest_bus_station;_rail_station", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Points of Interest", + "filter" : ["==", "_label_class", 2], + "minzoom" : 16, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Regular", + "text-anchor" : "bottom-left", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1 + }, + "paint" : { + "text-color" : "#545454", + "text-size" : 10, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "marine_waterbodies_label_1", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Marine Waterbodies_label", + "filter" : ["==", "_label_class", 0], + "minzoom" : 2, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 15.3333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-max-width" : 5, + "text-letter-spacing" : 0.3, + "text-line-height" : 1.6 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 15.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "marine_waterbodies_label_2", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Marine Waterbodies_label", + "filter" : ["==", "_label_class", 1], + "minzoom" : 2, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 13.3333, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-max-width" : 5, + "text-letter-spacing" : 0.2, + "text-line-height" : 1.5 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 13.3333, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "marine_waterbodies_label_3", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Marine Waterbodies_label", + "filter" : ["==", "_label_class", 2], + "minzoom" : 2, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 12.0, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-max-width" : 5, + "text-letter-spacing" : 0.2, + "text-line-height" : 1.4 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 12.0, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "marine_waterbodies_label_4", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Marine Waterbodies_label", + "filter" : ["==", "_label_class", 3], + "minzoom" : 2, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-max-width" : 5, + "text-letter-spacing" : 0.15, + "text-line-height" : 1.2 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + }, { + "id" : "marine_waterbodies_label_5", + "type" : "symbol", + "source" : "esri", + "source-layer" : "Marine Waterbodies_label", + "filter" : ["==", "_label_class", 4], + "minzoom" : 2, + "maxzoom" : 10, + "layout" : { + "symbol-avoid-edges" : true, + "text-font" : "@Arial Italic", + "text-max-size" : 10.6667, + "text-max-width" : 8, + "text-field" : "{_name}", + "text-allow-overlap" : false, + "text-padding" : 1, + "text-max-width" : 5 + }, + "paint" : { + "text-color" : "#497AAB", + "text-size" : 10.6667, + "text-halo-color" : "#FFFFFF", + "text-halo-width" : 0.7, + "text-halo-blur" : 1.0 + } + } + ] +} From 0d90c5d40f48a3285dc149f046cc14d12ade6b44 Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 13:22:36 -0600 Subject: [PATCH 10/27] adding the mb gl dev code to the demo --- demo/mapbox-gl-dev.js | 23346 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 23346 insertions(+) create mode 100644 demo/mapbox-gl-dev.js diff --git a/demo/mapbox-gl-dev.js b/demo/mapbox-gl-dev.js new file mode 100644 index 00000000000..d25d3624b97 --- /dev/null +++ b/demo/mapbox-gl-dev.js @@ -0,0 +1,23346 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 65535) { + this.current = new ElementGroup(this.vertexBuffer.index, + this.elementBuffer && this.elementBuffer.index, + this.secondElementBuffer && this.secondElementBuffer.index); + this.groups.push(this.current); + } +}; + +function ElementGroup(vertexStartIndex, elementStartIndex, secondElementStartIndex) { + // the offset into the vertex buffer of the first vertex in this group + this.vertexStartIndex = vertexStartIndex; + this.elementStartIndex = elementStartIndex; + this.secondElementStartIndex = secondElementStartIndex; + this.elementLength = 0; + this.vertexLength = 0; + this.secondElementLength = 0; +} + +},{}],13:[function(require,module,exports){ +'use strict'; + +var rbush = require('rbush'); +var Point = require('point-geometry'); +var vt = require('vector-tile'); +var util = require('../util/util'); + +module.exports = FeatureTree; + +function FeatureTree(coord, overscaling) { + this.x = coord.x; + this.y = coord.y; + this.z = coord.z - Math.log(overscaling) / Math.LN2; + this.rtree = rbush(9); + this.toBeInserted = []; +} + +FeatureTree.prototype.insert = function(bbox, layers, feature) { + bbox.layers = layers; + bbox.feature = feature; + this.toBeInserted.push(bbox); +}; + +// bulk insert into tree +FeatureTree.prototype._load = function() { + this.rtree.load(this.toBeInserted); + this.toBeInserted = []; +}; + +// Finds features in this tile at a particular position. +FeatureTree.prototype.query = function(args, callback) { + if (this.toBeInserted.length) this._load(); + + var params = args.params || {}, + radius = (params.radius || 0) * 4096 / args.scale, + x = args.x, + y = args.y, + result = []; + + var matching = this.rtree.search([ x - radius, y - radius, x + radius, y + radius ]); + for (var i = 0; i < matching.length; i++) { + var feature = matching[i].feature, + layers = matching[i].layers, + type = vt.VectorTileFeature.types[feature.type]; + + if (params.$type && type !== params.$type) + continue; + if (!geometryContainsPoint(feature.loadGeometry(), type, new Point(x, y), radius)) + continue; + + var geoJSON = feature.toGeoJSON(this.x, this.y, this.z); + for (var l = 0; l < layers.length; l++) { + var layer = layers[l]; + + if (params.layer && layer !== params.layer.id) + continue; + + result.push(util.extend({layer: layer}, geoJSON)); + } + } + + callback(null, result); +}; + +function geometryContainsPoint(rings, type, p, radius) { + return type === 'Point' ? pointContainsPoint(rings, p, radius) : + type === 'LineString' ? lineContainsPoint(rings, p, radius) : + type === 'Polygon' ? polyContainsPoint(rings, p) || lineContainsPoint(rings, p, radius) : false; +} + +// Code from http://stackoverflow.com/a/1501725/331379. +function distToSegmentSquared(p, v, w) { + var l2 = v.distSqr(w); + if (l2 === 0) return p.distSqr(v); + var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; + if (t < 0) return p.distSqr(v); + if (t > 1) return p.distSqr(w); + return p.distSqr(w.sub(v)._mult(t)._add(v)); +} + +function lineContainsPoint(rings, p, radius) { + var r = radius * radius; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + for (var j = 1; j < ring.length; j++) { + // Find line segments that have a distance <= radius^2 to p + // In that case, we treat the line as "containing point p". + var v = ring[j - 1], w = ring[j]; + if (distToSegmentSquared(p, v, w) < r) return true; + } + } + return false; +} + +// point in polygon ray casting algorithm +function polyContainsPoint(rings, p) { + var c = false, + ring, p1, p2; + + for (var k = 0; k < rings.length; k++) { + ring = rings[k]; + for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + c = !c; + } + } + } + return c; +} + +function pointContainsPoint(rings, p, radius) { + var r = radius * radius; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + for (var j = 0; j < ring.length; j++) { + if (ring[j].distSqr(p) <= r) return true; + } + } + return false; +} + +},{"../util/util":103,"point-geometry":134,"rbush":135,"vector-tile":138}],14:[function(require,module,exports){ +'use strict'; + +var ElementGroups = require('./element_groups'); + +module.exports = FillBucket; + +function FillBucket(buffers) { + this.buffers = buffers; + this.elementGroups = new ElementGroups(buffers.fillVertex, buffers.fillElement, buffers.outlineElement); +} + +FillBucket.prototype.addFeatures = function() { + var features = this.features; + for (var i = 0; i < features.length; i++) { + var feature = features[i]; + this.addFeature(feature.loadGeometry()); + } +}; + +FillBucket.prototype.addFeature = function(lines) { + for (var i = 0; i < lines.length; i++) { + this.addFill(lines[i]); + } +}; + +FillBucket.prototype.addFill = function(vertices) { + if (vertices.length < 3) { + //console.warn('a fill must have at least three vertices'); + return; + } + + // Calculate the total number of vertices we're going to produce so that we + // can resize the buffer beforehand, or detect whether the current line + // won't fit into the buffer anymore. + // In order to be able to use the vertex buffer for drawing the antialiased + // outlines, we separate all polygon vertices with a degenerate (out-of- + // viewplane) vertex. + + var len = vertices.length; + + // Check whether this geometry buffer can hold all the required vertices. + this.elementGroups.makeRoomFor(len + 1); + var elementGroup = this.elementGroups.current; + + var fillVertex = this.buffers.fillVertex; + var fillElement = this.buffers.fillElement; + var outlineElement = this.buffers.outlineElement; + + // We're generating triangle fans, so we always start with the first coordinate in this polygon. + var firstIndex = fillVertex.index - elementGroup.vertexStartIndex, + prevIndex, currentIndex, currentVertex; + + for (var i = 0; i < vertices.length; i++) { + currentIndex = fillVertex.index - elementGroup.vertexStartIndex; + currentVertex = vertices[i]; + + fillVertex.add(currentVertex.x, currentVertex.y); + elementGroup.vertexLength++; + + // Only add triangles that have distinct vertices. + if (i >= 2 && (currentVertex.x !== vertices[0].x || currentVertex.y !== vertices[0].y)) { + fillElement.add(firstIndex, prevIndex, currentIndex); + elementGroup.elementLength++; + } + + if (i >= 1) { + outlineElement.add(prevIndex, currentIndex); + elementGroup.secondElementLength++; + } + + prevIndex = currentIndex; + } +}; + +},{"./element_groups":12}],15:[function(require,module,exports){ +'use strict'; + +var ElementGroups = require('./element_groups'); + +module.exports = LineBucket; + +/** + * @class LineBucket + * @private + */ +function LineBucket(buffers, layoutProperties) { + this.buffers = buffers; + this.elementGroups = new ElementGroups(buffers.lineVertex, buffers.lineElement); + this.layoutProperties = layoutProperties; +} + +LineBucket.prototype.addFeatures = function() { + var features = this.features; + for (var i = 0; i < features.length; i++) { + var feature = features[i]; + this.addFeature(feature.loadGeometry()); + } +}; + +LineBucket.prototype.addFeature = function(lines) { + var layoutProperties = this.layoutProperties; + for (var i = 0; i < lines.length; i++) { + this.addLine(lines[i], + layoutProperties['line-join'], + layoutProperties['line-cap'], + layoutProperties['line-miter-limit'], + layoutProperties['line-round-limit']); + } +}; + +LineBucket.prototype.addLine = function(vertices, join, cap, miterLimit, roundLimit) { + + var len = vertices.length; + // If the line has duplicate vertices at the end, adjust length to remove them. + while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) { + len--; + } + + if (vertices.length < 2) { + //console.warn('a line must have at least two vertices'); + return; + } + + if (join === 'bevel') miterLimit = 1.05; + + var firstVertex = vertices[0], + lastVertex = vertices[len - 1], + closed = firstVertex.equals(lastVertex); + + // we could be more precise, but it would only save a negligible amount of space + this.elementGroups.makeRoomFor(len * 10); + + if (len === 2 && closed) { + // console.warn('a line may not have coincident points'); + return; + } + + var beginCap = cap, + endCap = closed ? 'butt' : cap, + flip = 1, + distance = 0, + startOfLine = true, + currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB; + + // the last three vertices added + this.e1 = this.e2 = this.e3 = -1; + + if (closed) { + currentVertex = vertices[len - 2]; + nextNormal = firstVertex.sub(currentVertex)._unit()._perp(); + } + + for (var i = 0; i < len; i++) { + + nextVertex = closed && i === len - 1 ? + vertices[1] : // if the line is closed, we treat the last vertex like the first + vertices[i + 1]; // just the next vertex + + // if two consecutive vertices exist, skip the current one + if (nextVertex && vertices[i].equals(nextVertex)) continue; + + if (nextNormal) prevNormal = nextNormal; + if (currentVertex) prevVertex = currentVertex; + + currentVertex = vertices[i]; + + // Calculate how far along the line the currentVertex is + if (prevVertex) distance += currentVertex.dist(prevVertex); + + // Calculate the normal towards the next vertex in this line. In case + // there is no next vertex, pretend that the line is continuing straight, + // meaning that we are just using the previous normal. + nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; + + // If we still don't have a previous normal, this is the beginning of a + // non-closed line, so we're doing a straight "join". + prevNormal = prevNormal || nextNormal; + + // Determine the normal of the join extrusion. It is the angle bisector + // of the segments between the previous line and the next line. + var joinNormal = prevNormal.add(nextNormal)._unit(); + + /* joinNormal prevNormal + * ↖ ↑ + * .________. prevVertex + * | + * nextNormal ← | currentVertex + * | + * nextVertex ! + * + */ + + // Calculate the length of the miter (the ratio of the miter to the width). + // Find the cosine of the angle between the next and join normals + // using dot product. The inverse of that is the miter length. + var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; + var miterLength = 1 / cosHalfAngle; + + // The join if a middle vertex, otherwise the cap. + var middleVertex = prevVertex && nextVertex; + var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap; + + if (middleVertex && currentJoin === 'round') { + if (miterLength < roundLimit) { + currentJoin = 'miter'; + } else if (miterLength <= 2) { + currentJoin = 'fakeround'; + } + } + + if (currentJoin === 'miter' && miterLength > miterLimit) { + currentJoin = 'bevel'; + } + + if (currentJoin === 'bevel') { + // The maximum extrude length is 128 / 63 = 2 times the width of the line + // so if miterLength >= 2 we need to draw a different type of bevel where. + if (miterLength > 2) currentJoin = 'flipbevel'; + + // If the miterLength is really small and the line bevel wouldn't be visible, + // just draw a miter join to save a triangle. + if (miterLength < miterLimit) currentJoin = 'miter'; + } + + if (currentJoin === 'miter') { + joinNormal._mult(miterLength); + this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false); + + } else if (currentJoin === 'flipbevel') { + // miter is too big, flip the direction to make a beveled join + + if (miterLength > 100) { + // Almost parallel lines + joinNormal = nextNormal.clone(); + + } else { + var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1; + var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); + joinNormal._perp()._mult(bevelLength * direction); + } + this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false); + flip = -flip; + + } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { + var lineTurnsLeft = flip * (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0; + var offset = -Math.sqrt(miterLength * miterLength - 1); + if (lineTurnsLeft) { + offsetB = 0; + offsetA = offset; + } else { + offsetA = 0; + offsetB = offset; + } + + // Close previous segment with a bevel + if (!startOfLine) { + this.addCurrentVertex(currentVertex, flip, distance, prevNormal, offsetA, offsetB, false); + } + + if (currentJoin === 'fakeround') { + // The join angle is sharp enough that a round join would be visible. + // Bevel joins fill the gap between segments with a single pie slice triangle. + // Create a round join by adding multiple pie slices. The join isn't actually round, but + // it looks like it is at the sizes we render lines at. + + // Add more triangles for sharper angles. + // This math is just a good enough approximation. It isn't "correct". + var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8); + var approxFractionalJoinNormal; + + for (var m = 0; m < n; m++) { + approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit(); + this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft); + } + + this.addPieSliceVertex(currentVertex, flip, distance, joinNormal, lineTurnsLeft); + + for (var k = n - 1; k >= 0; k--) { + approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit(); + this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft); + } + } + + // Start next segment + if (nextVertex) { + this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -offsetA, -offsetB, false); + } + + } else if (currentJoin === 'butt') { + if (!startOfLine) { + // Close previous segment with a butt + this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false); + } + + // Start next segment with a butt + if (nextVertex) { + this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false); + } + + } else if (currentJoin === 'square') { + + if (!startOfLine) { + // Close previous segment with a square cap + this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, false); + + // The segment is done. Unset vertices to disconnect segments. + this.e1 = this.e2 = -1; + flip = 1; + } + + // Start next segment + if (nextVertex) { + this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, false); + } + + } else if (currentJoin === 'round') { + + if (!startOfLine) { + // Close previous segment with butt + this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false); + + // Add round cap or linejoin at end of segment + this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, true); + + // The segment is done. Unset vertices to disconnect segments. + this.e1 = this.e2 = -1; + flip = 1; + } + + + // Start next segment with a butt + if (nextVertex) { + // Add round cap before first segment + this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, true); + + this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false); + } + } + + startOfLine = false; + } + + +}; + +/** + * Add two vertices to the buffers. + * + * @param {Object} currentVertex the line vertex to add buffer vertices for + * @param {number} flip -1 if the vertices should be flipped, 1 otherwise + * @param {number} distance the distance from the beggining of the line to the vertex + * @param {number} endLeft extrude to shift the left vertex along the line + * @param {number} endRight extrude to shift the left vertex along the line + * @param {boolean} round whether this is a round cap + * @private + */ +LineBucket.prototype.addCurrentVertex = function(currentVertex, flip, distance, normal, endLeft, endRight, round) { + var tx = round ? 1 : 0; + var extrude; + + var lineVertex = this.buffers.lineVertex; + var lineElement = this.buffers.lineElement; + var elementGroup = this.elementGroups.current; + var vertexStartIndex = this.elementGroups.current.vertexStartIndex; + + extrude = normal.mult(flip); + if (endLeft) extrude._sub(normal.perp()._mult(endLeft)); + this.e3 = lineVertex.add(currentVertex, extrude, tx, 0, distance) - vertexStartIndex; + if (this.e1 >= 0 && this.e2 >= 0) { + lineElement.add(this.e1, this.e2, this.e3); + elementGroup.elementLength++; + } + this.e1 = this.e2; + this.e2 = this.e3; + + extrude = normal.mult(-flip); + if (endRight) extrude._sub(normal.perp()._mult(endRight)); + this.e3 = lineVertex.add(currentVertex, extrude, tx, 1, distance) - vertexStartIndex; + if (this.e1 >= 0 && this.e2 >= 0) { + lineElement.add(this.e1, this.e2, this.e3); + elementGroup.elementLength++; + } + this.e1 = this.e2; + this.e2 = this.e3; + + elementGroup.vertexLength += 2; +}; + +/** + * Add a single new vertex and a triangle using two previous vertices. + * This adds a pie slice triangle near a join to simulate round joins + * + * @param {Object} currentVertex the line vertex to add buffer vertices for + * @param {number} flip -1 if the vertices should be flipped, 1 otherwise + * @param {number} distance the distance from the beggining of the line to the vertex + * @param {Object} extrude the offset of the new vertex from the currentVertex + * @param {boolean} whether the line is turning left or right at this angle + * @private + */ +LineBucket.prototype.addPieSliceVertex = function(currentVertex, flip, distance, extrude, lineTurnsLeft) { + var lineVertex = this.buffers.lineVertex; + var lineElement = this.buffers.lineElement; + var elementGroup = this.elementGroups.current; + var vertexStartIndex = this.elementGroups.current.vertexStartIndex; + + var ty = lineTurnsLeft; + extrude = extrude.mult(flip * (lineTurnsLeft ? -1 : 1)); + + this.e3 = lineVertex.add(currentVertex, extrude, 0, ty, distance) - vertexStartIndex; + elementGroup.vertexLength += 1; + + if (this.e1 >= 0 && this.e2 >= 0) { + lineElement.add(this.e1, this.e2, this.e3); + elementGroup.elementLength++; + } + + + if (lineTurnsLeft) { + this.e2 = this.e3; + } else { + this.e1 = this.e3; + } +}; + +},{"./element_groups":12}],16:[function(require,module,exports){ +'use strict'; + +var ElementGroups = require('./element_groups'); +var Anchor = require('../symbol/anchor'); +var getAnchors = require('../symbol/get_anchors'); +var resolveTokens = require('../util/token'); +var Quads = require('../symbol/quads'); +var Shaping = require('../symbol/shaping'); +var resolveText = require('../symbol/resolve_text'); +var resolveIcons = require('../symbol/resolve_icons'); +var mergeLines = require('../symbol/mergelines'); +var shapeText = Shaping.shapeText; +var shapeIcon = Shaping.shapeIcon; +var getGlyphQuads = Quads.getGlyphQuads; +var getIconQuads = Quads.getIconQuads; +var clipLine = require('../symbol/clip_line'); +var Point = require('point-geometry'); + +var CollisionFeature = require('../symbol/collision_feature'); + +module.exports = SymbolBucket; + +function SymbolBucket(buffers, layoutProperties, overscaling, zoom, collisionDebug) { + this.buffers = buffers; + this.layoutProperties = layoutProperties; + this.overscaling = overscaling; + this.zoom = zoom; + this.collisionDebug = collisionDebug; + var tileSize = 512 * overscaling; + var tileExtent = 4096; + this.tilePixelRatio = tileExtent / tileSize; + this.compareText = {}; + this.symbolInstances = []; + +} + +SymbolBucket.prototype.needsPlacement = true; + +SymbolBucket.prototype.addFeatures = function(collisionTile) { + var layout = this.layoutProperties; + var features = this.features; + var textFeatures = this.textFeatures; + + var horizontalAlign = 0.5, + verticalAlign = 0.5; + + switch (layout['text-anchor']) { + case 'right': + case 'top-right': + case 'bottom-right': + horizontalAlign = 1; + break; + case 'left': + case 'top-left': + case 'bottom-left': + horizontalAlign = 0; + break; + } + + switch (layout['text-anchor']) { + case 'bottom': + case 'bottom-right': + case 'bottom-left': + verticalAlign = 1; + break; + case 'top': + case 'top-right': + case 'top-left': + verticalAlign = 0; + break; + } + + var justify = layout['text-justify'] === 'right' ? 1 : + layout['text-justify'] === 'left' ? 0 : + 0.5; + + var oneEm = 24; + var lineHeight = layout['text-line-height'] * oneEm; + var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0; + var spacing = layout['text-letter-spacing'] * oneEm; + var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm]; + var fontstack = layout['text-font']; + + var geometries = []; + for (var g = 0; g < features.length; g++) { + geometries.push(features[g].loadGeometry()); + } + + if (layout['symbol-placement'] === 'line') { + // Merge adjacent lines with the same text to improve labelling. + // It's better to place labels on one long line than on many short segments. + var merged = mergeLines(features, textFeatures, geometries); + + geometries = merged.geometries; + features = merged.features; + textFeatures = merged.textFeatures; + } + + var shapedText, shapedIcon; + + for (var k = 0; k < features.length; k++) { + if (!geometries[k]) continue; + + if (textFeatures[k]) { + shapedText = shapeText(textFeatures[k], this.stacks[fontstack], maxWidth, + lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset); + } else { + shapedText = null; + } + + if (layout['icon-image']) { + var iconName = resolveTokens(features[k].properties, layout['icon-image']); + var image = this.icons[iconName]; + shapedIcon = shapeIcon(image, layout); + + if (image) { + if (this.sdfIcons === undefined) { + this.sdfIcons = image.sdf; + } else if (this.sdfIcons !== image.sdf) { + console.warn('Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket'); + } + } + } else { + shapedIcon = null; + } + + if (shapedText || shapedIcon) { + this.addFeature(geometries[k], shapedText, shapedIcon); + } + } + + this.placeFeatures(collisionTile, this.buffers, this.collisionDebug); +}; + +SymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon) { + var layout = this.layoutProperties; + + var glyphSize = 24; + + var fontScale = layout['text-max-size'] / glyphSize, + textBoxScale = this.tilePixelRatio * fontScale, + iconBoxScale = this.tilePixelRatio * layout['icon-max-size'], + symbolMinDistance = this.tilePixelRatio * layout['symbol-min-distance'], + avoidEdges = layout['symbol-avoid-edges'], + textPadding = layout['text-padding'] * this.tilePixelRatio, + iconPadding = layout['icon-padding'] * this.tilePixelRatio, + textMaxAngle = layout['text-max-angle'] / 180 * Math.PI, + textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', + iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', + mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || + layout['text-ignore-placement'] || layout['icon-ignore-placement'], + isLine = layout['symbol-placement'] === 'line', + textRepeatDistance = symbolMinDistance / 2; + + if (isLine) { + lines = clipLine(lines, 0, 0, 4096, 4096); + } + + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + + // Calculate the anchor points around which you want to place labels + var anchors = isLine ? + getAnchors(line, symbolMinDistance, textMaxAngle, shapedText, shapedIcon, glyphSize, textBoxScale, this.overscaling) : + [ new Anchor(line[0].x, line[0].y, 0) ]; + + // For each potential label, create the placement features used to check for collisions, and the quads use for rendering. + for (var j = 0, len = anchors.length; j < len; j++) { + var anchor = anchors[j]; + + if (shapedText && isLine) { + if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) { + continue; + } + } + + var inside = !(anchor.x < 0 || anchor.x > 4096 || anchor.y < 0 || anchor.y > 4096); + + if (avoidEdges && !inside) continue; + + // Normally symbol layers are drawn across tile boundaries. Only symbols + // with their anchors within the tile boundaries are added to the buffers + // to prevent symbols from being drawn twice. + // + // Symbols in layers with overlap are sorted in the y direction so that + // symbols lower on the canvas are drawn on top of symbols near the top. + // To preserve this order across tile boundaries these symbols can't + // be drawn across tile boundaries. Instead they need to be included in + // the buffers for both tiles and clipped to tile boundaries at draw time. + var addToBuffers = inside || mayOverlap; + + this.symbolInstances.push(new SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers, + textBoxScale, textPadding, textAlongLine, + iconBoxScale, iconPadding, iconAlongLine)); + } + } +}; + +// Check if any other anchors with the same text are closer than repeatDistance +SymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) { + var compareText = this.compareText; + if (!(text in compareText)) { + compareText[text] = []; + } else { + var otherAnchors = compareText[text]; + for (var k = otherAnchors.length - 1; k >= 0; k--) { + if (anchor.dist(otherAnchors[k]) < repeatDistance) { + // If it's within repeatDistance of one anchor, stop looking + return true; + } + } + } + // If anchor is not within repeatDistance of any other anchor, add to array + compareText[text].push(anchor); + return false; +}; + +SymbolBucket.prototype.placeFeatures = function(collisionTile, buffers, collisionDebug) { + + // Calculate which labels can be shown and when they can be shown and + // create the bufers used for rendering. + + this.buffers = buffers; + + var elementGroups = this.elementGroups = { + text: new ElementGroups(buffers.glyphVertex, buffers.glyphElement), + icon: new ElementGroups(buffers.iconVertex, buffers.iconElement), + sdfIcons: this.sdfIcons + }; + + var layout = this.layoutProperties; + var maxScale = collisionTile.maxScale; + + var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; + var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; + + var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || + layout['text-ignore-placement'] || layout['icon-ignore-placement']; + + // Sort symbols by their y position on the canvas so that they lower symbols + // are drawn on top of higher symbols. + // Don't sort symbols that won't overlap because it isn't necessary and + // because it causes more labels to pop in and out when rotating. + if (mayOverlap) { + var angle = collisionTile.angle; + var sin = Math.sin(angle), + cos = Math.cos(angle); + + this.symbolInstances.sort(function(a, b) { + var aRotated = sin * a.x + cos * a.y; + var bRotated = sin * b.x + cos * b.y; + return bRotated - aRotated; + }); + } + + for (var p = 0; p < this.symbolInstances.length; p++) { + var symbolInstance = this.symbolInstances[p]; + var hasText = symbolInstance.hasText; + var hasIcon = symbolInstance.hasIcon; + + var iconWithoutText = layout['text-optional'] || !hasText, + textWithoutIcon = layout['icon-optional'] || !hasIcon; + + + // Calculate the scales at which the text and icon can be placed without collision. + + var glyphScale = hasText && !layout['text-allow-overlap'] ? + collisionTile.placeCollisionFeature(symbolInstance.textCollisionFeature) : + collisionTile.minScale; + + var iconScale = hasIcon && !layout['icon-allow-overlap'] ? + collisionTile.placeCollisionFeature(symbolInstance.iconCollisionFeature) : + collisionTile.minScale; + + + // Combine the scales for icons and text. + + if (!iconWithoutText && !textWithoutIcon) { + iconScale = glyphScale = Math.max(iconScale, glyphScale); + } else if (!textWithoutIcon && glyphScale) { + glyphScale = Math.max(iconScale, glyphScale); + } else if (!iconWithoutText && iconScale) { + iconScale = Math.max(iconScale, glyphScale); + } + + + // Insert final placement into collision tree and add glyphs/icons to buffers + + if (hasText) { + if (!layout['text-ignore-placement']) { + collisionTile.insertCollisionFeature(symbolInstance.textCollisionFeature, glyphScale); + } + if (glyphScale <= maxScale) { + this.addSymbols(buffers.glyphVertex, buffers.glyphElement, elementGroups.text, + symbolInstance.glyphQuads, glyphScale, layout['text-keep-upright'], textAlongLine, + collisionTile.angle); + } + } + + if (hasIcon) { + if (!layout['icon-ignore-placement']) { + collisionTile.insertCollisionFeature(symbolInstance.iconCollisionFeature, iconScale); + } + if (iconScale <= maxScale) { + this.addSymbols(buffers.iconVertex, buffers.iconElement, elementGroups.icon, + symbolInstance.iconQuads, iconScale, layout['icon-keep-upright'], iconAlongLine, + collisionTile.angle); + } + } + + } + + if (collisionDebug) this.addToDebugBuffers(collisionTile); +}; + +SymbolBucket.prototype.addSymbols = function(vertex, element, elementGroups, quads, scale, keepUpright, alongLine, placementAngle) { + + elementGroups.makeRoomFor(4 * quads.length); + var elementGroup = elementGroups.current; + + var zoom = this.zoom; + var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0); + + for (var k = 0; k < quads.length; k++) { + + var symbol = quads[k], + angle = symbol.angle; + + // drop upside down versions of glyphs + var a = (angle + placementAngle + Math.PI) % (Math.PI * 2); + if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue; + + var tl = symbol.tl, + tr = symbol.tr, + bl = symbol.bl, + br = symbol.br, + tex = symbol.tex, + anchorPoint = symbol.anchorPoint, + + minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom), + maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25); + + if (maxZoom <= minZoom) continue; + + // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels + if (minZoom === placementZoom) minZoom = 0; + + var triangleIndex = vertex.index - elementGroup.vertexStartIndex; + + vertex.add(anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom); + vertex.add(anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom); + vertex.add(anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom); + vertex.add(anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom); + elementGroup.vertexLength += 4; + + element.add(triangleIndex, triangleIndex + 1, triangleIndex + 2); + element.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3); + elementGroup.elementLength += 2; + } + +}; + +SymbolBucket.prototype.getDependencies = function(tile, actor, callback) { + var firstdone = false; + this.getTextDependencies(tile, actor, done); + this.getIconDependencies(tile, actor, done); + function done(err) { + if (err || firstdone) return callback(err); + firstdone = true; + } +}; + +SymbolBucket.prototype.getIconDependencies = function(tile, actor, callback) { + if (this.layoutProperties['icon-image']) { + var features = this.features; + var icons = resolveIcons(features, this.layoutProperties); + + if (icons.length) { + actor.send('get icons', { icons: icons }, setIcons.bind(this)); + } else { + callback(); + } + } else { + callback(); + } + + function setIcons(err, newicons) { + if (err) return callback(err); + this.icons = newicons; + callback(); + } +}; + +SymbolBucket.prototype.getTextDependencies = function(tile, actor, callback) { + var features = this.features; + var fontstack = this.layoutProperties['text-font']; + + var stacks = this.stacks = tile.stacks; + if (stacks[fontstack] === undefined) { + stacks[fontstack] = {}; + } + var stack = stacks[fontstack]; + + var data = resolveText(features, this.layoutProperties, stack); + this.textFeatures = data.textFeatures; + + actor.send('get glyphs', { + uid: tile.uid, + fontstack: fontstack, + codepoints: data.codepoints + }, function(err, newstack) { + if (err) return callback(err); + + for (var codepoint in newstack) { + stack[codepoint] = newstack[codepoint]; + } + + callback(); + }); +}; + +SymbolBucket.prototype.addToDebugBuffers = function(collisionTile) { + + this.elementGroups.collisionBox = new ElementGroups(this.buffers.collisionBoxVertex); + this.elementGroups.collisionBox.makeRoomFor(0); + var buffer = this.buffers.collisionBoxVertex; + var angle = -collisionTile.angle; + var yStretch = collisionTile.yStretch; + + for (var j = 0; j < this.symbolInstances.length; j++) { + for (var i = 0; i < 2; i++) { + var feature = this.symbolInstances[j][i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature']; + if (!feature) continue; + var boxes = feature.boxes; + + for (var b = 0; b < boxes.length; b++) { + var box = boxes[b]; + var anchorPoint = box.anchorPoint; + + var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle); + var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle); + var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle); + var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle); + + var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2)); + var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2)); + + buffer.add(anchorPoint, tl, maxZoom, placementZoom); + buffer.add(anchorPoint, tr, maxZoom, placementZoom); + buffer.add(anchorPoint, tr, maxZoom, placementZoom); + buffer.add(anchorPoint, br, maxZoom, placementZoom); + buffer.add(anchorPoint, br, maxZoom, placementZoom); + buffer.add(anchorPoint, bl, maxZoom, placementZoom); + buffer.add(anchorPoint, bl, maxZoom, placementZoom); + buffer.add(anchorPoint, tl, maxZoom, placementZoom); + + this.elementGroups.collisionBox.current.vertexLength += 8; + } + } + } +}; + +function SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers, + textBoxScale, textPadding, textAlongLine, + iconBoxScale, iconPadding, iconAlongLine) { + + this.x = anchor.x; + this.y = anchor.y; + this.hasText = !!shapedText; + this.hasIcon = !!shapedIcon; + + if (this.hasText) { + this.glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layout, textAlongLine) : []; + this.textCollisionFeature = new CollisionFeature(line, anchor, shapedText, textBoxScale, textPadding, textAlongLine); + } + + if (this.hasIcon) { + this.iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layout, iconAlongLine) : []; + this.iconCollisionFeature = new CollisionFeature(line, anchor, shapedIcon, iconBoxScale, iconPadding, iconAlongLine); + } +} + +},{"../symbol/anchor":59,"../symbol/clip_line":62,"../symbol/collision_feature":64,"../symbol/get_anchors":66,"../symbol/mergelines":69,"../symbol/quads":70,"../symbol/resolve_icons":71,"../symbol/resolve_text":72,"../symbol/shaping":73,"../util/token":102,"./element_groups":12,"point-geometry":134}],17:[function(require,module,exports){ +'use strict'; + +module.exports = Coordinate; + +/** + * A coordinate is a column, row, zoom combination, often used + * as the data component of a tile. + * + * @param {number} column + * @param {number} row + * @param {number} zoom + * @private + */ +function Coordinate(column, row, zoom) { + this.column = column; + this.row = row; + this.zoom = zoom; +} + +Coordinate.prototype = { + + /** + * Create a clone of this coordinate that can be mutated without + * changing the original coordinate + * + * @returns {Coordinate} clone + * @private + * var coord = new Coordinate(0, 0, 0); + * var c2 = coord.clone(); + * // since coord is cloned, modifying a property of c2 does + * // not modify it. + * c2.zoom = 2; + */ + clone: function() { + return new Coordinate(this.column, this.row, this.zoom); + }, + + /** + * Zoom this coordinate to a given zoom level. This returns a new + * coordinate object, not mutating the old one. + * + * @param {number} zoom + * @returns {Coordinate} zoomed coordinate + * @private + * @example + * var coord = new Coordinate(0, 0, 0); + * var c2 = coord.zoomTo(1); + * c2 // equals new Coordinate(0, 0, 1); + */ + zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); }, + + /** + * Subtract the column and row values of this coordinate from those + * of another coordinate. The other coordinat will be zoomed to the + * same level as `this` before the subtraction occurs + * + * @param {Coordinate} c other coordinate + * @returns {Coordinate} result + * @private + */ + sub: function(c) { return this.clone()._sub(c); }, + + _zoomTo: function(zoom) { + var scale = Math.pow(2, zoom - this.zoom); + this.column *= scale; + this.row *= scale; + this.zoom = zoom; + return this; + }, + + _sub: function(c) { + c = c.zoomTo(this.zoom); + this.column -= c.column; + this.row -= c.row; + return this; + } +}; + +},{}],18:[function(require,module,exports){ +'use strict'; + +module.exports = LatLng; + +var wrap = require('../util/util').wrap; + +/** + * Create a latitude, longitude object from a given latitude and longitude pair in degrees. + * + * @class LatLng + * @classdesc A representation of a latitude and longitude point, in degrees. + * @param {number} lat latitude + * @param {number} lng longitude + * @example + * var latlng = new mapboxgl.LatLng(37.76, -122.44); + */ +function LatLng(lat, lng) { + if (isNaN(lat) || isNaN(lng)) { + throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); + } + this.lat = +lat; + this.lng = +lng; +} + +/** + * Return a new `LatLng` object whose longitude is wrapped to the range (-180, 180). + * + * @returns {LatLng} wrapped LatLng object + * @example + * var point = mapboxgl.LatLng(0, 200); + * var wrapped = point.wrap(); + * wrapped.lng; // = -160 + */ +LatLng.prototype.wrap = function () { + return new LatLng(this.lat, wrap(this.lng, -180, 180)); +}; + +/** + * Convert an array to a `LatLng` object, or return an existing `LatLng` object + * unchanged. + * + * @param {Array|LatLng} input `input` to convert + * @returns {LatLng} LatLng object or original input + * @example + * var ll = mapboxgl.LatLng.convert([10, 10]); + * var ll2 = new mapboxgl.LatLng(10, 10); + * ll // = ll2 + */ +LatLng.convert = function (input) { + if (input instanceof LatLng) { + return input; + } + if (Array.isArray(input)) { + return new LatLng(input[0], input[1]); + } + return input; +}; + +},{"../util/util":103}],19:[function(require,module,exports){ +'use strict'; + +module.exports = LatLngBounds; + +var LatLng = require('./lat_lng'); + +/** + * Creates a bounding box from the given pair of points. If parameteres are omitted, a `null` bounding box is created. + * + * @class LatLngBounds + * @classdesc A representation of rectangular box on the earth, defined by its southwest and northeast points in latitude and longitude. + * @param {LatLng} sw southwest + * @param {LatLng} ne northeast + * @example + * var sw = new mapboxgl.LatLng(0, 0); + * var ne = new mapboxgl.LatLng(10, -10); + * var bounds = new mapboxgl.LatLngBounds(sw, ne); + * + */ +function LatLngBounds(sw, ne) { + if (!sw) return; + + var latlngs = ne ? [sw, ne] : sw; + + for (var i = 0, len = latlngs.length; i < len; i++) { + this.extend(latlngs[i]); + } +} + +LatLngBounds.prototype = { + + /** + * Extend the bounds to include a given LatLng or LatLngBounds. + * + * @param {LatLng|LatLngBounds} obj object to extend to + * @returns {LatLngBounds} `this` + */ + extend: function(obj) { + var sw = this._sw, + ne = this._ne, + sw2, ne2; + + if (obj instanceof LatLng) { + sw2 = obj; + ne2 = obj; + + } else if (obj instanceof LatLngBounds) { + sw2 = obj._sw; + ne2 = obj._ne; + + if (!sw2 || !ne2) return this; + + } else { + return obj ? this.extend(LatLng.convert(obj) || LatLngBounds.convert(obj)) : this; + } + + if (!sw && !ne) { + this._sw = new LatLng(sw2.lat, sw2.lng); + this._ne = new LatLng(ne2.lat, ne2.lng); + + } else { + sw.lat = Math.min(sw2.lat, sw.lat); + sw.lng = Math.min(sw2.lng, sw.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + } + + return this; + }, + + /** + * Get the point equidistant from this box's corners + * @returns {LatLng} centerpoint + * @example + * var bounds = new mapboxgl.LatLngBounds( + * new mapboxgl.LatLng(10, 10), + * new mapboxgl.LatLng(-10, -10); + * bounds.getCenter(); // equals mapboxgl.LatLng(0, 0) + */ + getCenter: function() { + return new LatLng((this._sw.lat + this._ne.lat) / 2, (this._sw.lng + this._ne.lng) / 2); + }, + + /** + * Get southwest corner + * @returns {LatLng} southwest + */ + getSouthWest: function() { return this._sw; }, + + /** + * Get northeast corner + * @returns {LatLng} northeast + */ + getNorthEast: function() { return this._ne; }, + + /** + * Get northwest corner + * @returns {LatLng} northwest + */ + getNorthWest: function() { return new LatLng(this.getNorth(), this.getWest()); }, + + /** + * Get southeast corner + * @returns {LatLng} southeast + */ + getSouthEast: function() { return new LatLng(this.getSouth(), this.getEast()); }, + + /** + * Get west edge longitude + * @returns {number} west + */ + getWest: function() { return this._sw.lng; }, + + /** + * Get south edge latitude + * @returns {number} south + */ + getSouth: function() { return this._sw.lat; }, + + /** + * Get east edge longitude + * @returns {number} east + */ + getEast: function() { return this._ne.lng; }, + + /** + * Get north edge latitude + * @returns {number} north + */ + getNorth: function() { return this._ne.lat; } +}; + +/** + * constructs LatLngBounds from an array if necessary + * @param {LatLngBounds|*} a any input + * @returns {LatLngBounds|false} + * @example + * // calls LatLng.convert internally to + * // support arrays as latlng values + * LatLngBounds.convert([[-10, -10], [10, 10]]); + */ +LatLngBounds.convert = function (a) { + if (!a || a instanceof LatLngBounds) return a; + return new LatLngBounds(a); +}; + +},{"./lat_lng":18}],20:[function(require,module,exports){ +'use strict'; + +var LatLng = require('./lat_lng'), + Point = require('point-geometry'), + Coordinate = require('./coordinate'), + wrap = require('../util/util').wrap, + interp = require('../util/interpolate'), + vec4 = require('gl-matrix').vec4, + mat4 = require('gl-matrix').mat4; + +module.exports = Transform; + +/* + * A single transform, generally used for a single tile to be + * scaled, rotated, and zoomed. + * + * @param {number} minZoom + * @param {number} maxZoom + * @private + */ +function Transform(minZoom, maxZoom) { + this.tileSize = 512; // constant + + this._minZoom = minZoom || 0; + this._maxZoom = maxZoom || 22; + + this.latRange = [-85.05113, 85.05113]; + + this.width = 0; + this.height = 0; + this.zoom = 0; + this.center = new LatLng(0, 0); + this.angle = 0; + this._altitude = 1.5; + this._pitch = 0; +} + +Transform.prototype = { + get minZoom() { return this._minZoom; }, + set minZoom(zoom) { + this._minZoom = zoom; + this.zoom = Math.max(this.zoom, zoom); + }, + + get maxZoom() { return this._maxZoom; }, + set maxZoom(zoom) { + this._maxZoom = zoom; + this.zoom = Math.min(this.zoom, zoom); + }, + + get worldSize() { + return this.tileSize * this.scale; + }, + + get centerPoint() { + return this.size._div(2); + }, + + get size() { + return new Point(this.width, this.height); + }, + + get bearing() { + return -this.angle / Math.PI * 180; + }, + set bearing(bearing) { + this.angle = -wrap(bearing, -180, 180) * Math.PI / 180; + }, + + get pitch() { + return this._pitch / Math.PI * 180; + }, + set pitch(pitch) { + this._pitch = Math.min(60, pitch) / 180 * Math.PI; + }, + + get altitude() { + return this._altitude; + }, + set altitude(altitude) { + this._altitude = Math.max(0.75, altitude); + }, + + get zoom() { return this._zoom; }, + set zoom(zoom) { + zoom = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); + this._zoom = zoom; + this.scale = this.zoomScale(zoom); + this.tileZoom = Math.floor(zoom); + this.zoomFraction = zoom - this.tileZoom; + this._constrain(); + }, + + zoomScale: function(zoom) { return Math.pow(2, zoom); }, + scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; }, + + project: function(latlng, worldSize) { + return new Point( + this.lngX(latlng.lng, worldSize), + this.latY(latlng.lat, worldSize)); + }, + + unproject: function(point, worldSize) { + return new LatLng( + this.yLat(point.y, worldSize), + this.xLng(point.x, worldSize)); + }, + + get x() { return this.lngX(this.center.lng); }, + get y() { return this.latY(this.center.lat); }, + + get point() { return new Point(this.x, this.y); }, + + /** + * lat/lon <-> absolute pixel coords conversion + * @param {number} lon + * @param {number} [worldSize=this.worldSize] + * @returns {number} pixel coordinate + * @private + */ + lngX: function(lon, worldSize) { + return (180 + lon) * (worldSize || this.worldSize) / 360; + }, + /** + * latitude to absolute y coord + * + * @param {number} lat + * @param {number} [worldSize=this.worldSize] + * @returns {number} pixel coordinate + * @private + */ + latY: function(lat, worldSize) { + var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); + return (180 - y) * (worldSize || this.worldSize) / 360; + }, + + xLng: function(x, worldSize) { + return x * 360 / (worldSize || this.worldSize) - 180; + }, + yLat: function(y, worldSize) { + var y2 = 180 - y * 360 / (worldSize || this.worldSize); + return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; + }, + + panBy: function(offset) { + var point = this.centerPoint._add(offset); + this.center = this.pointLocation(point); + this._constrain(); + }, + + setLocationAtPoint: function(latlng, point) { + var c = this.locationCoordinate(latlng); + var coordAtPoint = this.pointCoordinate(point); + var coordCenter = this.pointCoordinate(this.centerPoint); + + var translate = coordAtPoint._sub(c); + this.center = this.coordinateLocation(coordCenter._sub(translate)); + + this._constrain(); + }, + + setZoomAround: function(zoom, center) { + var p; + if (center) p = this.locationPoint(center); + this.zoom = zoom; + if (center) this.setLocationAtPoint(center, p); + }, + + setBearingAround: function(bearing, center) { + var p; + if (center) p = this.locationPoint(center); + this.bearing = bearing; + if (center) this.setLocationAtPoint(center, p); + }, + + /** + * Given a location, return the screen point that corresponds to it + * @param {LatLng} latlng location + * @returns {Point} screen point + * @private + */ + locationPoint: function(latlng) { + return this.coordinatePoint(this.locationCoordinate(latlng)); + }, + + /** + * Given a point on screen, return its latlng + * @param {Point} p screen point + * @returns {LatLng} latlng location + * @private + */ + pointLocation: function(p) { + return this.coordinateLocation(this.pointCoordinate(p)); + }, + + /** + * Given a geographical latlng, return an unrounded + * coordinate that represents it at this transform's zoom level and + * worldsize. + * @param {LatLng} latlng + * @returns {Coordinate} + * @private + */ + locationCoordinate: function(latlng) { + var k = this.zoomScale(this.tileZoom) / this.worldSize; + return new Coordinate( + this.lngX(latlng.lng) * k, + this.latY(latlng.lat) * k, + this.tileZoom); + }, + + /** + * Given a Coordinate, return its geographical position. + * @param {Coordinate} coord + * @returns {LatLng} latlng + * @private + */ + coordinateLocation: function(coord) { + var worldSize = this.zoomScale(coord.zoom); + return new LatLng( + this.yLat(coord.row, worldSize), + this.xLng(coord.column, worldSize)); + }, + + pointCoordinate: function(p, targetZ) { + + if (targetZ === undefined) targetZ = 0; + + var matrix = this.coordinatePointMatrix(this.tileZoom); + var inverted = mat4.invert(new Float64Array(16), matrix); + + if (!inverted) throw "failed to invert matrix"; + + // since we don't know the correct projected z value for the point, + // unproject two points to get a line and then find the point on that + // line with z=0 + + var coord0 = vec4.transformMat4([], [p.x, p.y, 0, 1], inverted); + var coord1 = vec4.transformMat4([], [p.x, p.y, 1, 1], inverted); + + var w0 = coord0[3]; + var w1 = coord1[3]; + var x0 = coord0[0] / w0; + var x1 = coord1[0] / w1; + var y0 = coord0[1] / w0; + var y1 = coord1[1] / w1; + var z0 = coord0[2] / w0; + var z1 = coord1[2] / w1; + + + var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); + + return new Coordinate( + interp(x0, x1, t), + interp(y0, y1, t), + this.tileZoom); + }, + + /** + * Given a coordinate, return the screen point that corresponds to it + * @param {Coordinate} coord + * @returns {Point} screen point + * @private + */ + coordinatePoint: function(coord) { + var matrix = this.coordinatePointMatrix(coord.zoom); + var p = vec4.transformMat4([], [coord.column, coord.row, 0, 1], matrix); + return new Point(p[0] / p[3], p[1] / p[3]); + }, + + coordinatePointMatrix: function(z) { + var proj = this.getProjMatrix(); + var scale = this.worldSize / this.zoomScale(z); + mat4.scale(proj, proj, [scale, scale, 1]); + mat4.multiply(proj, this.getPixelMatrix(), proj); + return proj; + }, + + /** + * converts gl coordinates -1..1 to pixels 0..width + * @returns {Object} matrix + * @private + */ + getPixelMatrix: function() { + var m = mat4.create(); + mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]); + mat4.translate(m, m, [1, -1, 0]); + return m; + }, + + _constrain: function() { + if (!this.center) return; + + var minY, maxY, minX, maxX, sy, sx, x2, y2, + size = this.size; + + if (this.latRange) { + minY = this.latY(this.latRange[1]); + maxY = this.latY(this.latRange[0]); + sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; + } + + if (this.lngRange) { + minX = this.lngX(this.lngRange[0]); + maxX = this.lngX(this.lngRange[1]); + sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; + } + + // how much the map should scale to fit the screen into given latitude/longitude ranges + var s = Math.max(sx || 0, sy || 0); + + if (s) { + this.center = this.unproject(new Point( + sx ? (maxX + minX) / 2 : this.x, + sy ? (maxY + minY) / 2 : this.y)); + this.zoom += this.scaleZoom(s); + return; + } + + if (this.latRange) { + var y = this.y, + h2 = size.y / 2; + + if (y - h2 < minY) y2 = minY + h2; + if (y + h2 > maxY) y2 = maxY - h2; + } + + if (this.lngRange) { + var x = this.x, + w2 = size.x / 2; + + if (x - w2 < minX) x2 = minX + w2; + if (x + w2 > maxX) x2 = maxX - w2; + } + + // pan the map if the screen goes off the range + if (x2 !== undefined || y2 !== undefined) { + this.center = this.unproject(new Point( + x2 !== undefined ? x2 : this.x, + y2 !== undefined ? y2 : this.y)); + } + }, + + getProjMatrix: function() { + var m = new Float64Array(16); + + // Find the distance from the center point to the center top in altitude units using law of sines. + var halfFov = Math.atan(0.5 / this.altitude); + var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov); + // Calculate z value of the farthest fragment that should be rendered. + var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude; + + mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ); + + mat4.translate(m, m, [0, 0, -this.altitude]); + + // After the rotateX, z values are in pixel units. Convert them to + // altitude unites. 1 altitude unit = the screen height. + mat4.scale(m, m, [1, -1, 1 / this.height]); + + mat4.rotateX(m, m, this._pitch); + mat4.rotateZ(m, m, this.angle); + mat4.translate(m, m, [-this.x, -this.y, 0]); + return m; + } +}; + +},{"../util/interpolate":99,"../util/util":103,"./coordinate":17,"./lat_lng":18,"gl-matrix":116,"point-geometry":134}],21:[function(require,module,exports){ +'use strict'; + +// Font data From Hershey Simplex Font +// http://paulbourke.net/dataformats/hershey/ +var simplexFont = { + " ": [16, []], + "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], + "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], + "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], + "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], + "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], + "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], + "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], + ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], + "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], + "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], + ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], + "-": [26, [4, 9, 22, 9]], + ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + "/": [22, [20, 25, 2, -7]], + "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], + "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], + "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], + "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], + "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], + "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], + "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], + "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], + "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], + "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], + ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], + "<": [24, [20, 18, 4, 9, 20, 0]], + "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], + ">": [24, [4, 18, 20, 9, 4, 0]], + "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], + "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], + "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], + "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], + "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], + "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], + "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], + "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], + "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], + "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], + "I": [8, [4, 21, 4, 0]], + "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], + "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], + "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], + "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], + "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], + "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], + "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], + "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], + "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], + "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], + "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], + "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], + "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], + "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], + "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], + "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], + "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], + "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], + "\\": [14, [0, 21, 14, -3]], + "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], + "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], + "_": [16, [0, -2, 16, -2]], + "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], + "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], + "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], + "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], + "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], + "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], + "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], + "l": [8, [4, 21, 4, 0]], + "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], + "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], + "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], + "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], + "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], + "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], + "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], + "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], + "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], + "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], + "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], + "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], + "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], + "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], + "|": [8, [4, 25, 4, -7]], + "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], + "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] +}; + +module.exports = function textVertices(text, left, baseline, scale) { + scale = scale || 1; + + var strokes = [], + i, len, j, len2, glyph, x, y, prev; + + for (i = 0, len = text.length; i < len; i++) { + glyph = simplexFont[text[i]]; + if (!glyph) continue; + prev = null; + + for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { + if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { + prev = null; + + } else { + x = left + glyph[1][j] * scale; + y = baseline - glyph[1][j + 1] * scale; + if (prev) { + strokes.push(prev.x, prev.y, x, y); + } + prev = {x: x, y: y}; + } + } + left += glyph[0] * scale; + } + + return strokes; +}; + +},{}],22:[function(require,module,exports){ +'use strict'; + +/** + * mapboxgl is a A WebGL JavaScript interactive maps library that can render + * [Mapbox vector tiles](https://www.mapbox.com/blog/vector-tiles/). + * + * @module mapboxgl + * @summary WebGL JavaScript map library + */ + +// jshint -W079 +var mapboxgl = module.exports = {}; + +mapboxgl.Map = require('./ui/map'); +mapboxgl.Navigation = require('./ui/control/navigation'); +mapboxgl.Attribution = require('./ui/control/attribution'); +mapboxgl.Popup = require('./ui/popup'); + +mapboxgl.GeoJSONSource = require('./source/geojson_source'); +mapboxgl.VideoSource = require('./source/video_source'); + +mapboxgl.Style = require('./style/style'); + +mapboxgl.LatLng = require('./geo/lat_lng'); +mapboxgl.LatLngBounds = require('./geo/lat_lng_bounds'); +mapboxgl.Point = require('point-geometry'); + +mapboxgl.Evented = require('./util/evented'); +mapboxgl.util = require('./util/util'); + +mapboxgl.supported = require('./util/browser').supported; + +var ajax = require('./util/ajax'); +mapboxgl.util.getJSON = ajax.getJSON; +mapboxgl.util.getArrayBuffer = ajax.getArrayBuffer; + +var config = require('./util/config'); +mapboxgl.config = config; + +Object.defineProperty(mapboxgl, 'accessToken', { + get: function() { return config.ACCESS_TOKEN; }, + set: function(token) { config.ACCESS_TOKEN = token; } +}); + +},{"./geo/lat_lng":18,"./geo/lat_lng_bounds":19,"./source/geojson_source":36,"./source/video_source":44,"./style/style":52,"./ui/control/attribution":76,"./ui/control/navigation":78,"./ui/map":88,"./ui/popup":89,"./util/ajax":91,"./util/browser":92,"./util/config":96,"./util/evented":97,"./util/util":103,"point-geometry":134}],23:[function(require,module,exports){ +'use strict'; + +var mat3 = require('gl-matrix').mat3; + +module.exports = drawBackground; + +function drawBackground(painter, layer, posMatrix) { + var gl = painter.gl; + var color = layer.paint['background-color']; + var image = layer.paint['background-image']; + var opacity = layer.paint['background-opacity']; + var shader; + + var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null; + var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null; + + if (imagePosA && imagePosB) { + // Draw texture fill + shader = painter.patternShader; + gl.switchShader(shader, posMatrix); + gl.uniform1i(shader.u_image, 0); + gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); + gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); + gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); + gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); + gl.uniform1f(shader.u_opacity, opacity); + + var transform = painter.transform; + var sizeA = imagePosA.size; + var sizeB = imagePosB.size; + var center = transform.locationCoordinate(transform.center); + var scale = 1 / Math.pow(2, transform.zoomFraction); + + gl.uniform1f(shader.u_mix, image.t); + + var matrixA = mat3.create(); + mat3.scale(matrixA, matrixA, [ + 1 / (sizeA[0] * image.fromScale), + 1 / (sizeA[1] * image.fromScale) + ]); + mat3.translate(matrixA, matrixA, [ + (center.column * transform.tileSize) % (sizeA[0] * image.fromScale), + (center.row * transform.tileSize) % (sizeA[1] * image.fromScale) + ]); + mat3.rotate(matrixA, matrixA, -transform.angle); + mat3.scale(matrixA, matrixA, [ + scale * transform.width / 2, + -scale * transform.height / 2 + ]); + + var matrixB = mat3.create(); + mat3.scale(matrixB, matrixB, [ + 1 / (sizeB[0] * image.toScale), + 1 / (sizeB[1] * image.toScale) + ]); + mat3.translate(matrixB, matrixB, [ + (center.column * transform.tileSize) % (sizeB[0] * image.toScale), + (center.row * transform.tileSize) % (sizeB[1] * image.toScale) + ]); + mat3.rotate(matrixB, matrixB, -transform.angle); + mat3.scale(matrixB, matrixB, [ + scale * transform.width / 2, + -scale * transform.height / 2 + ]); + + gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA); + gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB); + + painter.spriteAtlas.bind(gl, true); + + } else { + // Draw filling rectangle. + shader = painter.fillShader; + gl.switchShader(shader, posMatrix); + gl.disableVertexAttribArray(shader.a_color); + gl.vertexAttrib4fv(shader.a_color, color); + } + + gl.disable(gl.STENCIL_TEST); + gl.bindBuffer(gl.ARRAY_BUFFER, painter.backgroundBuffer); + gl.vertexAttribPointer(shader.a_pos, painter.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.backgroundBuffer.itemCount); + gl.enable(gl.STENCIL_TEST); + + gl.stencilMask(0x00); + gl.stencilFunc(gl.EQUAL, 0x80, 0x80); +} + +},{"gl-matrix":116}],24:[function(require,module,exports){ +'use strict'; + +module.exports = drawPlacementDebug; + +function drawPlacementDebug(painter, layer, posMatrix, tile) { + + var elementGroups = tile.elementGroups[layer.ref || layer.id].collisionBox; + if (!elementGroups) return; + + var gl = painter.gl; + var buffer = tile.buffers.collisionBoxVertex; + var shader = painter.collisionBoxShader; + + gl.enable(gl.STENCIL_TEST); + + gl.switchShader(shader, posMatrix); + buffer.bind(gl, shader); + gl.lineWidth(1); + + var stride = 12; + gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, stride, 0); + gl.vertexAttribPointer(shader.a_extrude, 2, gl.SHORT, false, stride, 4); + gl.vertexAttribPointer(shader.a_data, 2, gl.UNSIGNED_BYTE, false, stride, 8); + + gl.uniform1f(shader.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z)); + gl.uniform1f(shader.u_zoom, painter.transform.zoom * 10); + gl.uniform1f(shader.u_maxzoom, (tile.coord.z + 1) * 10); + + var begin = elementGroups.groups[0].vertexStartIndex; + var len = elementGroups.groups[0].vertexLength; + gl.drawArrays(gl.LINES, begin, len); + + gl.disable(gl.STENCIL_TEST); +} + +},{}],25:[function(require,module,exports){ +'use strict'; + +var textVertices = require('../lib/debugtext'); +var browser = require('../util/browser'); + +module.exports = drawDebug; + +function drawDebug(painter, tile) { + var gl = painter.gl; + + // Blend to the front, not the back. + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + + gl.switchShader(painter.debugShader, tile.posMatrix); + + // draw bounding rectangle + gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugBuffer); + gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugBuffer.itemSize, gl.SHORT, false, 0, 0); + gl.uniform4f(painter.debugShader.u_color, 1, 0, 0, 1); + gl.lineWidth(4); + gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.itemCount); + + var vertices = textVertices(tile.coord.toString(), 50, 200, 5); + + gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugTextBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Int16Array(vertices), gl.STREAM_DRAW); + gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugTextBuffer.itemSize, gl.SHORT, false, 0, 0); + gl.lineWidth(8 * browser.devicePixelRatio); + gl.uniform4f(painter.debugShader.u_color, 1, 1, 1, 1); + gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize); + gl.lineWidth(2 * browser.devicePixelRatio); + gl.uniform4f(painter.debugShader.u_color, 0, 0, 0, 1); + gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize); + + // Revert blending mode to blend to the back. + gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); +} + +},{"../lib/debugtext":21,"../util/browser":92}],26:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var mat3 = require('gl-matrix').mat3; + +module.exports = drawFill; + +function drawFill(painter, layer, posMatrix, tile) { + // No data + if (!tile.buffers) return; + var elementGroups = tile.elementGroups[layer.ref || layer.id]; + if (!elementGroups) return; + + var gl = painter.gl; + var translatedPosMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['fill-translate'], layer.paint['fill-translate-anchor']); + + var color = layer.paint['fill-color']; + + var vertex, elements, group, count; + + // Draw the stencil mask. + + // We're only drawing to the first seven bits (== support a maximum of + // 127 overlapping polygons in one place before we get rendering errors). + gl.stencilMask(0x3F); + gl.clear(gl.STENCIL_BUFFER_BIT); + + // Draw front facing triangles. Wherever the 0x80 bit is 1, we are + // increasing the lower 7 bits by one if the triangle is a front-facing + // triangle. This means that all visible polygons should be in CCW + // orientation, while all holes (see below) are in CW orientation. + gl.stencilFunc(gl.NOTEQUAL, 0x80, 0x80); + + // When we do a nonzero fill, we count the number of times a pixel is + // covered by a counterclockwise polygon, and subtract the number of + // times it is "uncovered" by a clockwise polygon. + gl.stencilOpSeparate(gl.FRONT, gl.INCR_WRAP, gl.KEEP, gl.KEEP); + gl.stencilOpSeparate(gl.BACK, gl.DECR_WRAP, gl.KEEP, gl.KEEP); + + // When drawing a shape, we first draw all shapes to the stencil buffer + // and incrementing all areas where polygons are + gl.colorMask(false, false, false, false); + + // Draw the actual triangle fan into the stencil buffer. + gl.switchShader(painter.fillShader, translatedPosMatrix); + + // Draw all buffers + vertex = tile.buffers.fillVertex; + vertex.bind(gl); + elements = tile.buffers.fillElement; + elements.bind(gl); + + var offset, elementOffset; + + gl.disableVertexAttribArray(painter.fillShader.a_color); + + for (var i = 0; i < elementGroups.groups.length; i++) { + group = elementGroups.groups[i]; + offset = group.vertexStartIndex * vertex.itemSize; + gl.vertexAttribPointer(painter.fillShader.a_pos, 2, gl.SHORT, false, 4, offset + 0); + + count = group.elementLength * 3; + elementOffset = group.elementStartIndex * elements.itemSize; + gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); + } + + // Now that we have the stencil mask in the stencil buffer, we can start + // writing to the color buffer. + gl.colorMask(true, true, true, true); + + // From now on, we don't want to update the stencil buffer anymore. + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + gl.stencilMask(0x0); + + var strokeColor = layer.paint['fill-outline-color']; + + // Because we're drawing top-to-bottom, and we update the stencil mask + // below, we have to draw the outline first (!) + if (layer.paint['fill-antialias'] === true && !(layer.paint['fill-image'] && !strokeColor)) { + gl.switchShader(painter.outlineShader, translatedPosMatrix); + gl.lineWidth(2 * browser.devicePixelRatio); + + if (strokeColor) { + // If we defined a different color for the fill outline, we are + // going to ignore the bits in 0x3F and just care about the global + // clipping mask. + gl.stencilFunc(gl.EQUAL, 0x80, 0x80); + } else { + // Otherwise, we only want to draw the antialiased parts that are + // *outside* the current shape. This is important in case the fill + // or stroke color is translucent. If we wouldn't clip to outside + // the current shape, some pixels from the outline stroke overlapped + // the (non-antialiased) fill. + gl.stencilFunc(gl.EQUAL, 0x80, 0xBF); + } + + gl.uniform2f(painter.outlineShader.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); + + // Draw all buffers + vertex = tile.buffers.fillVertex; + elements = tile.buffers.outlineElement; + elements.bind(gl); + + gl.disableVertexAttribArray(painter.outlineShader.a_color); + gl.vertexAttrib4fv(painter.outlineShader.a_color, strokeColor ? strokeColor : color); + + for (var k = 0; k < elementGroups.groups.length; k++) { + group = elementGroups.groups[k]; + offset = group.vertexStartIndex * vertex.itemSize; + gl.vertexAttribPointer(painter.outlineShader.a_pos, 2, gl.SHORT, false, 4, offset + 0); + + count = group.secondElementLength * 2; + elementOffset = group.secondElementStartIndex * elements.itemSize; + gl.drawElements(gl.LINES, count, gl.UNSIGNED_SHORT, elementOffset); + } + } + + var image = layer.paint['fill-image']; + var opacity = layer.paint['fill-opacity'] || 1; + var shader; + + if (image) { + // Draw texture fill + var imagePosA = painter.spriteAtlas.getPosition(image.from, true); + var imagePosB = painter.spriteAtlas.getPosition(image.to, true); + if (!imagePosA || !imagePosB) return; + + shader = painter.patternShader; + gl.switchShader(shader, posMatrix); + gl.uniform1i(shader.u_image, 0); + gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); + gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); + gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); + gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); + gl.uniform1f(shader.u_opacity, opacity); + gl.uniform1f(shader.u_mix, image.t); + + var factor = (tile.tileExtent / tile.tileSize) / Math.pow(2, painter.transform.tileZoom - tile.coord.z); + + var matrixA = mat3.create(); + mat3.scale(matrixA, matrixA, [ + 1 / (imagePosA.size[0] * factor * image.fromScale), + 1 / (imagePosA.size[1] * factor * image.fromScale) + ]); + + var matrixB = mat3.create(); + mat3.scale(matrixB, matrixB, [ + 1 / (imagePosB.size[0] * factor * image.toScale), + 1 / (imagePosB.size[1] * factor * image.toScale) + ]); + + gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA); + gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB); + + painter.spriteAtlas.bind(gl, true); + + } else { + // Draw filling rectangle. + shader = painter.fillShader; + gl.switchShader(shader, posMatrix); + gl.disableVertexAttribArray(shader.a_color); + gl.vertexAttrib4fv(shader.a_color, color); + } + + // Only draw regions that we marked + gl.stencilFunc(gl.NOTEQUAL, 0x0, 0x3F); + gl.bindBuffer(gl.ARRAY_BUFFER, painter.tileExtentBuffer); + gl.vertexAttribPointer(shader.a_pos, painter.tileExtentBuffer.itemSize, gl.SHORT, false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.itemCount); + + gl.stencilMask(0x00); + gl.stencilFunc(gl.EQUAL, 0x80, 0x80); +} + +},{"../util/browser":92,"gl-matrix":116}],27:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var mat2 = require('gl-matrix').mat2; + +/** + * Draw a line. Under the hood this will read elements from + * a tile, dash textures from a lineAtlas, and style properties from a layer. + * @param {Object} painter + * @param {Object} layer + * @param {Object} posMatrix + * @param {Tile} tile + * @returns {undefined} draws with the painter + * @private + */ +module.exports = function drawLine(painter, layer, posMatrix, tile) { + // No data + if (!tile.buffers) return; + var elementGroups = tile.elementGroups[layer.ref || layer.id]; + if (!elementGroups) return; + + var gl = painter.gl; + + // don't draw zero-width lines + if (layer.paint['line-width'] <= 0) return; + + // the distance over which the line edge fades out. + // Retina devices need a smaller distance to avoid aliasing. + var antialiasing = 1 / browser.devicePixelRatio; + + var blur = layer.paint['line-blur'] + antialiasing; + var edgeWidth = layer.paint['line-width'] / 2; + var inset = -1; + var offset = 0; + var shift = 0; + + if (layer.paint['line-gap-width'] > 0) { + inset = layer.paint['line-gap-width'] / 2 + antialiasing * 0.5; + edgeWidth = layer.paint['line-width']; + + // shift outer lines half a pixel towards the middle to eliminate the crack + offset = inset - antialiasing / 2; + } + + var outset = offset + edgeWidth + antialiasing / 2 + shift; + + var color = layer.paint['line-color']; + var ratio = painter.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize); + var vtxMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']); + + var tr = painter.transform; + + + var antialiasingMatrix = mat2.create(); + mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]); + mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle); + + // calculate how much longer the real world distance is at the top of the screen + // than at the middle of the screen. + var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude)); + var x = tr.height / 2 * Math.tan(tr._pitch); + var extra = (topedgelength + x) / topedgelength - 1; + + // how much the tile is overscaled by + var overscaling = tile.tileSize / painter.transform.tileSize; + + var shader; + + + var dasharray = layer.paint['line-dasharray']; + var image = layer.paint['line-image']; + + if (dasharray) { + + shader = painter.linesdfpatternShader; + gl.switchShader(shader, vtxMatrix, tile.exMatrix); + + gl.uniform1f(shader.u_ratio, ratio); + + var posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round'); + var posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round'); + painter.lineAtlas.bind(gl); + + var patternratio = Math.pow(2, Math.floor(Math.log(painter.transform.scale) / Math.LN2) - tile.coord.z) / 8 * overscaling; + var scaleA = [patternratio / posA.width / dasharray.fromScale, -posA.height / 2]; + var gammaA = painter.lineAtlas.width / (dasharray.fromScale * posA.width * 256 * browser.devicePixelRatio) / 2; + var scaleB = [patternratio / posB.width / dasharray.toScale, -posB.height / 2]; + var gammaB = painter.lineAtlas.width / (dasharray.toScale * posB.width * 256 * browser.devicePixelRatio) / 2; + + gl.uniform2fv(shader.u_patternscale_a, scaleA); + gl.uniform1f(shader.u_tex_y_a, posA.y); + gl.uniform2fv(shader.u_patternscale_b, scaleB); + gl.uniform1f(shader.u_tex_y_b, posB.y); + + gl.uniform1i(shader.u_image, 0); + gl.uniform1f(shader.u_sdfgamma, Math.max(gammaA, gammaB)); + gl.uniform1f(shader.u_mix, dasharray.t); + + } else if (image) { + var imagePosA = painter.spriteAtlas.getPosition(image.from, true); + var imagePosB = painter.spriteAtlas.getPosition(image.to, true); + if (!imagePosA || !imagePosB) return; + var factor = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.tileZoom - tile.coord.z) * overscaling; + + painter.spriteAtlas.bind(gl, true); + + shader = painter.linepatternShader; + gl.switchShader(shader, vtxMatrix, tile.exMatrix); + + gl.uniform1f(shader.u_ratio, ratio); + + gl.uniform2fv(shader.u_pattern_size_a, [imagePosA.size[0] * factor * image.fromScale, imagePosB.size[1] ]); + gl.uniform2fv(shader.u_pattern_size_b, [imagePosB.size[0] * factor * image.toScale, imagePosB.size[1] ]); + gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); + gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); + gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); + gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); + gl.uniform1f(shader.u_fade, image.t); + + gl.disableVertexAttribArray(shader.a_opacity); + gl.vertexAttrib1f(shader.a_opacity, layer.paint['line-opacity']); + + } else { + shader = painter.lineShader; + gl.switchShader(shader, vtxMatrix, tile.exMatrix); + + gl.uniform1f(shader.u_ratio, ratio); + gl.uniform1f(shader.u_extra, extra); + gl.uniformMatrix2fv(shader.u_antialiasingmatrix, false, antialiasingMatrix); + } + + // linepattern does not have a color attribute + if (shader.a_color !== undefined) { + gl.disableVertexAttribArray(shader.a_color); + gl.vertexAttrib4fv(shader.a_color, color); + } + + gl.disableVertexAttribArray(shader.a_linewidth); + gl.vertexAttrib2f(shader.a_linewidth, outset, inset); + + gl.disableVertexAttribArray(shader.a_blur); + gl.vertexAttrib1f(shader.a_blur, blur); + + var vertex = tile.buffers.lineVertex; + vertex.bind(gl); + var element = tile.buffers.lineElement; + element.bind(gl); + + for (var i = 0; i < elementGroups.groups.length; i++) { + var group = elementGroups.groups[i]; + var vtxOffset = group.vertexStartIndex * vertex.itemSize; + gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, vtxOffset + 0); + gl.vertexAttribPointer(shader.a_data, 4, gl.BYTE, false, 8, vtxOffset + 4); + + var count = group.elementLength * 3; + var elementOffset = group.elementStartIndex * element.itemSize; + gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); + } +}; + +},{"../util/browser":92,"gl-matrix":116}],28:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); + +module.exports = drawRaster; + +function drawRaster(painter, layer, posMatrix, tile) { + var gl = painter.gl; + + gl.disable(gl.STENCIL_TEST); + + var shader = painter.rasterShader; + gl.switchShader(shader, posMatrix); + + // color parameters + gl.uniform1f(shader.u_brightness_low, layer.paint['raster-brightness-min']); + gl.uniform1f(shader.u_brightness_high, layer.paint['raster-brightness-max']); + gl.uniform1f(shader.u_saturation_factor, saturationFactor(layer.paint['raster-saturation'])); + gl.uniform1f(shader.u_contrast_factor, contrastFactor(layer.paint['raster-contrast'])); + gl.uniform3fv(shader.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate'])); + + var parentTile = tile.source && tile.source._pyramid.findLoadedParent(tile.coord, 0, {}), + opacities = getOpacities(tile, parentTile, layer, painter.transform); + + var parentScaleBy, parentTL; + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + + if (parentTile) { + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(gl.TEXTURE_2D, parentTile.texture); + + parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z); + parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1]; + } else { + opacities[1] = 0; + } + + // cross-fade parameters + gl.uniform2fv(shader.u_tl_parent, parentTL || [0, 0]); + gl.uniform1f(shader.u_scale_parent, parentScaleBy || 1); + gl.uniform1f(shader.u_buffer_scale, 1); + gl.uniform1f(shader.u_opacity0, opacities[0]); + gl.uniform1f(shader.u_opacity1, opacities[1]); + gl.uniform1i(shader.u_image0, 0); + gl.uniform1i(shader.u_image1, 1); + + gl.bindBuffer(gl.ARRAY_BUFFER, tile.boundsBuffer || painter.tileExtentBuffer); + + gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, 0); + gl.vertexAttribPointer(shader.a_texture_pos, 2, gl.SHORT, false, 8, 4); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + gl.enable(gl.STENCIL_TEST); +} + +function spinWeights(angle) { + angle *= Math.PI / 180; + var s = Math.sin(angle); + var c = Math.cos(angle); + return [ + (2 * c + 1) / 3, + (-Math.sqrt(3) * s - c + 1) / 3, + (Math.sqrt(3) * s - c + 1) / 3 + ]; +} + +function contrastFactor(contrast) { + return contrast > 0 ? + 1 / (1 - contrast) : + 1 + contrast; +} + +function saturationFactor(saturation) { + return saturation > 0 ? + 1 - 1 / (1.001 - saturation) : + -saturation; +} + +function getOpacities(tile, parentTile, layer, transform) { + if (!tile.source) return [1, 0]; + + var now = new Date().getTime(); + + var fadeDuration = layer.paint['raster-fade-duration']; + var sinceTile = (now - tile.timeAdded) / fadeDuration; + var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; + + var idealZ = tile.source._pyramid.coveringZoomLevel(transform); + var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false; + + var opacity = []; + if (!parentTile || parentFurther) { + // if no parent or parent is older + opacity[0] = util.clamp(sinceTile, 0, 1); + opacity[1] = 1 - opacity[0]; + } else { + // parent is younger, zooming out + opacity[0] = util.clamp(1 - sinceParent, 0, 1); + opacity[1] = 1 - opacity[0]; + } + + var op = layer.paint['raster-opacity']; + opacity[0] *= op; + opacity[1] *= op; + + return opacity; +} + +},{"../util/util":103}],29:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var mat4 = require('gl-matrix').mat4; + +var drawCollisionDebug = require('./draw_collision_debug'); + +module.exports = drawSymbols; + +function drawSymbols(painter, layer, posMatrix, tile) { + // No data + if (!tile.buffers) return; + var elementGroups = tile.elementGroups[layer.ref || layer.id]; + if (!elementGroups) return; + + var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] || + layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']); + + var gl = painter.gl; + + if (drawAcrossEdges) { + // Disable the stencil test so that labels aren't clipped to tile boundaries. + // + // Layers with features that may be drawn overlapping aren't clipped. These + // layers are sorted in the y direction, and to draw the correct ordering near + // tile edges the icons are included in both tiles and clipped when drawing. + gl.disable(gl.STENCIL_TEST); + } + + if (elementGroups.text.groups.length) { + drawSymbol(painter, layer, posMatrix, tile, elementGroups.text, 'text', true); + } + if (elementGroups.icon.groups.length) { + drawSymbol(painter, layer, posMatrix, tile, elementGroups.icon, 'icon', elementGroups.sdfIcons); + } + + drawCollisionDebug(painter, layer, posMatrix, tile); + + if (drawAcrossEdges) { + gl.enable(gl.STENCIL_TEST); + } +} + +var defaultSizes = { + icon: 1, + text: 24 +}; + +function drawSymbol(painter, layer, posMatrix, tile, elementGroups, prefix, sdf) { + var gl = painter.gl; + + posMatrix = painter.translateMatrix(posMatrix, tile, layer.paint[prefix + '-translate'], layer.paint[prefix + '-translate-anchor']); + + var tr = painter.transform; + var alignedWithMap = layer.layout[prefix + '-rotation-alignment'] === 'map'; + var skewed = alignedWithMap; + var exMatrix, s, gammaScale; + + if (skewed) { + exMatrix = mat4.create(); + s = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.zoom - tile.coord.z); + gammaScale = 1 / Math.cos(tr._pitch); + } else { + exMatrix = mat4.clone(tile.exMatrix); + s = painter.transform.altitude; + gammaScale = 1; + } + mat4.scale(exMatrix, exMatrix, [s, s, 1]); + + // If layer.paint.size > layer.layout[prefix + '-max-size'] then labels may collide + var fontSize = layer.paint[prefix + '-size']; + var fontScale = fontSize / defaultSizes[prefix]; + mat4.scale(exMatrix, exMatrix, [ fontScale, fontScale, 1 ]); + + // calculate how much longer the real world distance is at the top of the screen + // than at the middle of the screen. + var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude)); + var x = tr.height / 2 * Math.tan(tr._pitch); + var extra = (topedgelength + x) / topedgelength - 1; + + var text = prefix === 'text'; + var shader, vertex, elements, texsize; + + if (!text && !painter.style.sprite.loaded()) + return; + + gl.activeTexture(gl.TEXTURE0); + + if (sdf) { + shader = painter.sdfShader; + } else { + shader = painter.iconShader; + } + + if (text) { + painter.glyphAtlas.updateTexture(gl); + vertex = tile.buffers.glyphVertex; + elements = tile.buffers.glyphElement; + texsize = [painter.glyphAtlas.width / 4, painter.glyphAtlas.height / 4]; + } else { + painter.spriteAtlas.bind(gl, alignedWithMap || painter.options.rotating || + painter.options.zooming || fontScale !== 1 || sdf || painter.transform.pitch); + vertex = tile.buffers.iconVertex; + elements = tile.buffers.iconElement; + texsize = [painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4]; + } + + gl.switchShader(shader, posMatrix, exMatrix); + gl.uniform1i(shader.u_texture, 0); + gl.uniform2fv(shader.u_texsize, texsize); + gl.uniform1i(shader.u_skewed, skewed); + gl.uniform1f(shader.u_extra, extra); + + // adjust min/max zooms for variable font sies + var zoomAdjust = Math.log(fontSize / layer.layout[prefix + '-max-size']) / Math.LN2 || 0; + + gl.uniform1f(shader.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level + + var f = painter.frameHistory.getFadeProperties(300); + gl.uniform1f(shader.u_fadedist, f.fadedist * 10); + gl.uniform1f(shader.u_minfadezoom, Math.floor(f.minfadezoom * 10)); + gl.uniform1f(shader.u_maxfadezoom, Math.floor(f.maxfadezoom * 10)); + gl.uniform1f(shader.u_fadezoom, (painter.transform.zoom + f.bump) * 10); + + var group, offset, count, elementOffset; + + elements.bind(gl); + + if (sdf) { + var sdfPx = 8; + var blurOffset = 1.19; + var haloOffset = 6; + var gamma = 0.105 * defaultSizes[prefix] / fontSize / browser.devicePixelRatio; + + gl.disableVertexAttribArray(shader.a_gamma); + gl.vertexAttrib1f(shader.a_gamma, gamma * gammaScale); + + gl.disableVertexAttribArray(shader.a_color); + gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-color']); + + gl.disableVertexAttribArray(shader.a_buffer); + gl.vertexAttrib1f(shader.a_buffer, (256 - 64) / 256); + + for (var i = 0; i < elementGroups.groups.length; i++) { + group = elementGroups.groups[i]; + offset = group.vertexStartIndex * vertex.itemSize; + vertex.bind(gl, shader, offset); + + count = group.elementLength * 3; + elementOffset = group.elementStartIndex * elements.itemSize; + gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); + } + + if (layer.paint[prefix + '-halo-color']) { + + // vertex attrib arrays disabled above + gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-halo-color']); + gl.vertexAttrib1f(shader.a_buffer, (haloOffset - layer.paint[prefix + '-halo-width'] / fontScale) / sdfPx); + gl.vertexAttrib1f(shader.a_gamma, (layer.paint[prefix + '-halo-blur'] * blurOffset / fontScale / sdfPx + gamma) * gammaScale); + + for (var j = 0; j < elementGroups.groups.length; j++) { + group = elementGroups.groups[j]; + offset = group.vertexStartIndex * vertex.itemSize; + vertex.bind(gl, shader, offset); + + count = group.elementLength * 3; + elementOffset = group.elementStartIndex * elements.itemSize; + gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); + } + } + } else { + gl.disableVertexAttribArray(shader.a_opacity); + gl.vertexAttrib1f(shader.a_opacity, layer.paint['icon-opacity']); + + for (var k = 0; k < elementGroups.groups.length; k++) { + group = elementGroups.groups[k]; + offset = group.vertexStartIndex * vertex.itemSize; + vertex.bind(gl, shader, offset); + + count = group.elementLength * 3; + elementOffset = group.elementStartIndex * elements.itemSize; + gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); + } + } +} + +},{"../util/browser":92,"./draw_collision_debug":24,"gl-matrix":116}],30:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var mat4 = require('gl-matrix').mat4; + +module.exports = drawVertices; + +function drawVertices(painter, layer, posMatrix, tile) { + var gl = painter.gl; + + if (!tile || !tile.buffers) return; + var elementGroups = tile.elementGroups[layer.ref || layer.id]; + if (!elementGroups) return; + + // Blend to the front, not the back. + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + + // Draw all buffers + if (layer.type === 'fill') { + drawPoints(tile.buffers.fillVertex, elementGroups.groups, posMatrix, 4); + } else if (layer.type === 'symbol') { + drawPoints(tile.buffers.iconVertex, elementGroups.icon.groups, posMatrix, 16); + drawPoints(tile.buffers.glyphVertex, elementGroups.text.groups, posMatrix, 16); + } else if (layer.type === 'line') { + var newPosMatrix = mat4.clone(posMatrix); + mat4.scale(newPosMatrix, newPosMatrix, [0.5, 0.5, 1]); + drawPoints(tile.buffers.lineVertex, elementGroups.groups, newPosMatrix, 8); + } + + function drawPoints(vertex, groups, matrix, stride) { + gl.switchShader(painter.dotShader, matrix); + + gl.uniform1f(painter.dotShader.u_size, 4 * browser.devicePixelRatio); + gl.uniform1f(painter.dotShader.u_blur, 0.25); + gl.uniform4fv(painter.dotShader.u_color, [0.1, 0, 0, 0.1]); + + vertex.bind(gl, painter.dotShader, 0); + for (var i = 0; i < groups.length; i++) { + var group = groups[i]; + var begin = group.vertexStartIndex; + var count = group.vertexLength; + gl.vertexAttribPointer(painter.dotShader.a_pos, 2, gl.SHORT, false, stride, 0); + gl.drawArrays(gl.POINTS, begin, count); + } + } + + // Revert blending mode to blend to the back. + gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); +} + +},{"../util/browser":92,"gl-matrix":116}],31:[function(require,module,exports){ +'use strict'; + +module.exports = FrameHistory; + +function FrameHistory() { + this.frameHistory = []; +} + +FrameHistory.prototype.getFadeProperties = function(duration) { + if (duration === undefined) duration = 300; + var currentTime = (new Date()).getTime(); + + // Remove frames until only one is outside the duration, or until there are only three + while (this.frameHistory.length > 3 && this.frameHistory[1].time + duration < currentTime) { + this.frameHistory.shift(); + } + + if (this.frameHistory[1].time + duration < currentTime) { + this.frameHistory[0].z = this.frameHistory[1].z; + } + + var frameLen = this.frameHistory.length; + if (frameLen < 3) console.warn('there should never be less than three frames in the history'); + + // Find the range of zoom levels we want to fade between + var startingZ = this.frameHistory[0].z, + lastFrame = this.frameHistory[frameLen - 1], + endingZ = lastFrame.z, + lowZ = Math.min(startingZ, endingZ), + highZ = Math.max(startingZ, endingZ); + + // Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one duration + var zoomDiff = lastFrame.z - this.frameHistory[1].z, + timeDiff = lastFrame.time - this.frameHistory[1].time; + var fadedist = zoomDiff / (timeDiff / duration); + + if (isNaN(fadedist)) console.warn('fadedist should never be NaN'); + + // At end of a zoom when the zoom stops changing continue pretending to zoom at that speed + // bump is how much farther it would have been if it had continued zooming at the same rate + var bump = (currentTime - lastFrame.time) / duration * fadedist; + + return { + fadedist: fadedist, + minfadezoom: lowZ, + maxfadezoom: highZ, + bump: bump + }; +}; + +// Record frame history that will be used to calculate fading params +FrameHistory.prototype.record = function(zoom) { + var currentTime = (new Date()).getTime(); + + // first frame ever + if (!this.frameHistory.length) { + this.frameHistory.push({time: 0, z: zoom }, {time: 0, z: zoom }); + } + + if (this.frameHistory.length === 2 || this.frameHistory[this.frameHistory.length - 1].z !== zoom) { + this.frameHistory.push({ + time: currentTime, + z: zoom + }); + } +}; + +},{}],32:[function(require,module,exports){ +'use strict'; + +var shaders = require('./shaders'); +var util = require('../util/util'); + +exports.extend = function(context) { + var origLineWidth = context.lineWidth, + lineWidthRange = context.getParameter(context.ALIASED_LINE_WIDTH_RANGE); + + context.lineWidth = function(width) { + origLineWidth.call(context, util.clamp(width, lineWidthRange[0], lineWidthRange[1])); + }; + + context.getShader = function(name, type) { + var kind = type === this.FRAGMENT_SHADER ? 'fragment' : 'vertex'; + if (!shaders[name] || !shaders[name][kind]) { + throw new Error("Could not find shader " + name); + } + + var shader = this.createShader(type); + var shaderSource = shaders[name][kind]; + + if (typeof orientation === 'undefined') { + // only use highp precision on mobile browsers + shaderSource = shaderSource.replace(/ highp /g, ' '); + } + + this.shaderSource(shader, shaderSource); + this.compileShader(shader); + if (!this.getShaderParameter(shader, this.COMPILE_STATUS)) { + throw new Error(this.getShaderInfoLog(shader)); + } + return shader; + }; + + context.initializeShader = function(name, attributes, uniforms) { + var shader = { + program: this.createProgram(), + fragment: this.getShader(name, this.FRAGMENT_SHADER), + vertex: this.getShader(name, this.VERTEX_SHADER), + attributes: [] + }; + this.attachShader(shader.program, shader.vertex); + this.attachShader(shader.program, shader.fragment); + + // Disabling attrib location 0 causes weird behaviour. To avoid the problem, we assign + // 'a_pos' to attrib location 0 making the assumptions that + // + // - `a_pos` is never disabled + // - every shader has an `a_pos` attribute + // + // see: https://developer.mozilla.org/en-US/docs/Web/WebGL/WebGL_best_practices + this.bindAttribLocation(shader.program, 0, 'a_pos'); + + this.linkProgram(shader.program); + + if (!this.getProgramParameter(shader.program, this.LINK_STATUS)) { + console.error(this.getProgramInfoLog(shader.program)); + } else { + for (var i = 0; i < attributes.length; i++) { + shader[attributes[i]] = this.getAttribLocation(shader.program, attributes[i]); + shader.attributes.push(shader[attributes[i]]); + } + for (var k = 0; k < uniforms.length; k++) { + shader[uniforms[k]] = this.getUniformLocation(shader.program, uniforms[k]); + } + } + + return shader; + }; + + // Switches to a different shader program. + context.switchShader = function(shader, posMatrix, exMatrix) { + if (!posMatrix) { + console.trace('posMatrix does not have required argument'); + } + + if (this.currentShader !== shader) { + this.useProgram(shader.program); + + // Disable all attribute arrays used by the previous shader and enable all the attribute + // arrays used by the next shader. Ideally we would do a better job diffing these to + // minimize operations (as we did in previously) but it is hard to keep track of state + // in spaghetti shader boilerplate code and hard to debug when things go wrong. + var previous = this.currentShader ? this.currentShader.attributes : []; + for (var i = 0; i < previous.length; i++) { + this.disableVertexAttribArray(previous[i]); + } + var next = shader.attributes; + for (var j = 0; j < next.length; j++) { + this.enableVertexAttribArray(next[j]); + } + + this.currentShader = shader; + } + + // Update the matrices if necessary. Note: This relies on object identity! + // This means changing the matrix values without the actual matrix object + // will FAIL to update the matrix properly. + if (shader.posMatrix !== posMatrix) { + this.uniformMatrix4fv(shader.u_matrix, false, posMatrix); + shader.posMatrix = posMatrix; + } + if (exMatrix && shader.exMatrix !== exMatrix && shader.u_exmatrix) { + this.uniformMatrix4fv(shader.u_exmatrix, false, exMatrix); + shader.exMatrix = exMatrix; + } + }; + + context.vertexAttrib2fv = function(attribute, values) { + context.vertexAttrib2f(attribute, values[0], values[1]); + }; + + context.vertexAttrib3fv = function(attribute, values) { + context.vertexAttrib3f(attribute, values[0], values[1], values[2]); + }; + + context.vertexAttrib4fv = function(attribute, values) { + context.vertexAttrib4f(attribute, values[0], values[1], values[2], values[3]); + }; + + return context; +}; + +},{"../util/util":103,"./shaders":35}],33:[function(require,module,exports){ +'use strict'; + +module.exports = LineAtlas; + +/** + * Much like a GlyphAtlas, a LineAtlas lets us reuse rendered dashed lines + * by writing many of them to a texture and then fetching their positions + * using .getDash. + * + * @param {number} width + * @param {number} height + * @private + */ +function LineAtlas(width, height) { + this.width = width; + this.height = height; + this.nextRow = 0; + + this.bytes = 4; + this.data = new Uint8Array(this.width * this.height * this.bytes); + + this.positions = {}; +} + +LineAtlas.prototype.setSprite = function(sprite) { + this.sprite = sprite; +}; + +/** + * Get or create a dash line pattern. + * + * @param {Array} dasharray + * @param {boolean} round whether to add circle caps in between dash segments + * @returns {Object} position of dash texture in { y, height, width } + * @private + */ +LineAtlas.prototype.getDash = function(dasharray, round) { + var key = dasharray.join(",") + round; + + if (!this.positions[key]) { + this.positions[key] = this.addDash(dasharray, round); + } + return this.positions[key]; +}; + +LineAtlas.prototype.addDash = function(dasharray, round) { + + var n = round ? 7 : 0; + var height = 2 * n + 1; + var offset = 128; + + if (this.nextRow + height > this.height) { + console.warn('LineAtlas out of space'); + return null; + } + + var length = 0; + for (var i = 0; i < dasharray.length; i++) { + length += dasharray[i]; + } + + var stretch = this.width / length; + var halfWidth = stretch / 2; + + // If dasharray has an odd length, both the first and last parts + // are dashes and should be joined seamlessly. + var oddLength = dasharray.length % 2 === 1; + + for (var y = -n; y <= n; y++) { + var row = this.nextRow + n + y; + var index = this.width * row; + + var left = oddLength ? -dasharray[dasharray.length - 1] : 0; + var right = dasharray[0]; + var partIndex = 1; + + for (var x = 0; x < this.width; x++) { + + while (right < x / stretch) { + left = right; + right = right + dasharray[partIndex]; + + if (oddLength && partIndex === dasharray.length - 1) { + right += dasharray[0]; + } + + partIndex++; + } + + var distLeft = Math.abs(x - left * stretch); + var distRight = Math.abs(x - right * stretch); + var dist = Math.min(distLeft, distRight); + var inside = (partIndex % 2) === 1; + var signedDistance; + + if (round) { + // Add circle caps + var distMiddle = n ? y / n * (halfWidth + 1) : 0; + if (inside) { + var distEdge = halfWidth - Math.abs(distMiddle); + signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); + } else { + signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); + } + } else { + signedDistance = (inside ? 1 : -1) * dist; + } + + this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); + } + } + + var pos = { + y: (this.nextRow + n + 0.5) / this.height, + height: 2 * n / this.height, + width: length + }; + + this.nextRow += height; + this.dirty = true; + + return pos; +}; + +LineAtlas.prototype.bind = function(gl) { + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); + + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + + if (this.dirty) { + this.dirty = false; + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); + } + } +}; + +LineAtlas.prototype.debug = function() { + + var canvas = document.createElement('canvas'); + + document.body.appendChild(canvas); + canvas.style.position = 'absolute'; + canvas.style.top = 0; + canvas.style.left = 0; + canvas.style.background = '#ff0'; + + canvas.width = this.width; + canvas.height = this.height; + + var ctx = canvas.getContext('2d'); + var data = ctx.getImageData(0, 0, this.width, this.height); + for (var i = 0; i < this.data.length; i++) { + if (this.sdf) { + var k = i * 4; + data.data[k] = data.data[k + 1] = data.data[k + 2] = 0; + data.data[k + 3] = this.data[i]; + } else { + data.data[i] = this.data[i]; + } + } + ctx.putImageData(data, 0, 0); +}; + +},{}],34:[function(require,module,exports){ +'use strict'; + +var glutil = require('./gl_util'); +var browser = require('../util/browser'); +var mat4 = require('gl-matrix').mat4; +var FrameHistory = require('./frame_history'); + +/* + * Initialize a new painter object. + * + * @param {Canvas} gl an experimental-webgl drawing context + */ +module.exports = Painter; +function Painter(gl, transform) { + this.gl = glutil.extend(gl); + this.transform = transform; + + this.reusableTextures = {}; + this.preFbos = {}; + + this.frameHistory = new FrameHistory(); + + this.setup(); +} + +/* + * Update the GL viewport, projection matrix, and transforms to compensate + * for a new width and height value. + */ +Painter.prototype.resize = function(width, height) { + var gl = this.gl; + + this.width = width * browser.devicePixelRatio; + this.height = height * browser.devicePixelRatio; + gl.viewport(0, 0, this.width, this.height); + +}; + + +Painter.prototype.setup = function() { + var gl = this.gl; + + gl.verbose = true; + + // We are blending the new pixels *behind* the existing pixels. That way we can + // draw front-to-back and use then stencil buffer to cull opaque pixels early. + gl.enable(gl.BLEND); + gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); + + gl.enable(gl.STENCIL_TEST); + + // Initialize shaders + this.debugShader = gl.initializeShader('debug', + ['a_pos'], + ['u_matrix', 'u_pointsize', 'u_color']); + + this.gaussianShader = gl.initializeShader('gaussian', + ['a_pos'], + ['u_matrix', 'u_image', 'u_offset']); + + this.rasterShader = gl.initializeShader('raster', + ['a_pos', 'a_texture_pos'], + ['u_matrix', 'u_brightness_low', 'u_brightness_high', 'u_saturation_factor', 'u_spin_weights', 'u_contrast_factor', 'u_opacity0', 'u_opacity1', 'u_image0', 'u_image1', 'u_tl_parent', 'u_scale_parent', 'u_buffer_scale']); + + this.lineShader = gl.initializeShader('line', + ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'], + ['u_matrix', 'u_ratio', 'u_extra', 'u_antialiasingmatrix']); + + this.linepatternShader = gl.initializeShader('linepattern', + ['a_pos', 'a_data', 'a_linewidth', 'a_blur', 'a_opacity'], + ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_pattern_size_a', 'u_pattern_size_b', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_fade']); + + this.linesdfpatternShader = gl.initializeShader('linesdfpattern', + ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'], + ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_patternscale_a', 'u_tex_y_a', 'u_patternscale_b', 'u_tex_y_b', 'u_image', 'u_sdfgamma', 'u_mix']); + + this.dotShader = gl.initializeShader('dot', + ['a_pos'], + ['u_matrix', 'u_size', 'u_color', 'u_blur']); + + this.sdfShader = gl.initializeShader('sdf', + ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_color', 'a_buffer', 'a_gamma'], + ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']); + + this.iconShader = gl.initializeShader('icon', + ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_opacity'], + ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']); + + this.outlineShader = gl.initializeShader('outline', + ['a_pos', 'a_color'], + ['u_matrix', 'u_world'] + ); + + this.patternShader = gl.initializeShader('pattern', + ['a_pos'], + ['u_matrix', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_mix', 'u_patternmatrix_a', 'u_patternmatrix_b', 'u_opacity', 'u_image'] + ); + + this.fillShader = gl.initializeShader('fill', + ['a_pos', 'a_color'], + ['u_matrix'] + ); + + this.collisionBoxShader = gl.initializeShader('collisionbox', + ['a_pos', 'a_extrude', 'a_data'], + ['u_matrix', 'u_scale', 'u_zoom', 'u_maxzoom'] + ); + + this.identityMatrix = mat4.create(); + + // The backgroundBuffer is used when drawing to the full *canvas* + this.backgroundBuffer = gl.createBuffer(); + this.backgroundBuffer.itemSize = 2; + this.backgroundBuffer.itemCount = 4; + gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Int16Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW); + + this.setExtent(4096); + + // The debugTextBuffer is used to draw tile IDs for debugging + this.debugTextBuffer = gl.createBuffer(); + this.debugTextBuffer.itemSize = 2; +}; + +/** + * Rebind the necessary buffers to render at a different extent than + * the current one. No-ops if the extent is not changing. + * + * @param {number} newExtent + * @example + * this.setExtent(4096); + * @private + */ +Painter.prototype.setExtent = function(newExtent) { + if (!newExtent || newExtent === this.tileExtent) return; + + this.tileExtent = newExtent; + + var gl = this.gl; + + // The tileExtentBuffer is used when drawing to a full *tile* + this.tileExtentBuffer = gl.createBuffer(); + this.tileExtentBuffer.itemSize = 4; + this.tileExtentBuffer.itemCount = 4; + gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + new Int16Array([ + // tile coord x, tile coord y, texture coord x, texture coord y + 0, 0, 0, 0, + this.tileExtent, 0, 32767, 0, + 0, this.tileExtent, 0, 32767, + this.tileExtent, this.tileExtent, 32767, 32767 + ]), + gl.STATIC_DRAW); + + // The debugBuffer is used to draw tile outlines for debugging + this.debugBuffer = gl.createBuffer(); + this.debugBuffer.itemSize = 2; + this.debugBuffer.itemCount = 5; + gl.bindBuffer(gl.ARRAY_BUFFER, this.debugBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + new Int16Array([ + 0, 0, this.tileExtent - 1, 0, this.tileExtent - 1, this.tileExtent - 1, 0, this.tileExtent - 1, 0, 0]), + gl.STATIC_DRAW); +}; + +/* + * Reset the color buffers of the drawing canvas. + */ +Painter.prototype.clearColor = function() { + var gl = this.gl; + gl.clearColor(0, 0, 0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); +}; + +/* + * Reset the drawing canvas by clearing the stencil buffer so that we can draw + * new tiles at the same location, while retaining previously drawn pixels. + */ +Painter.prototype.clearStencil = function() { + var gl = this.gl; + gl.clearStencil(0x0); + gl.stencilMask(0xFF); + gl.clear(gl.STENCIL_BUFFER_BIT); +}; + +Painter.prototype.drawClippingMask = function(tile) { + var gl = this.gl; + gl.switchShader(this.fillShader, tile.posMatrix); + gl.colorMask(false, false, false, false); + + // Clear the entire stencil buffer, except for the 7th bit, which stores + // the global clipping mask that allows us to avoid drawing in regions of + // tiles we've already painted in. + gl.clearStencil(0x0); + gl.stencilMask(0xBF); + gl.clear(gl.STENCIL_BUFFER_BIT); + + // The stencil test will fail always, meaning we set all pixels covered + // by this geometry to 0x80. We use the highest bit 0x80 to mark the regions + // we want to draw in. All pixels that have this bit *not* set will never be + // drawn in. + gl.stencilFunc(gl.EQUAL, 0xC0, 0x40); + gl.stencilMask(0xC0); + gl.stencilOp(gl.REPLACE, gl.KEEP, gl.KEEP); + + // Draw the clipping mask + gl.disableVertexAttribArray(this.fillShader.a_color); + gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer); + gl.vertexAttribPointer(this.fillShader.a_pos, this.tileExtentBuffer.itemSize, gl.SHORT, false, 8, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount); + + gl.stencilFunc(gl.EQUAL, 0x80, 0x80); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE); + gl.stencilMask(0x00); + gl.colorMask(true, true, true, true); + gl.enableVertexAttribArray(this.fillShader.a_color); +}; + +// Overridden by headless tests. +Painter.prototype.prepareBuffers = function() {}; +Painter.prototype.bindDefaultFramebuffer = function() { + var gl = this.gl; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); +}; + +var draw = { + symbol: require('./draw_symbol'), + line: require('./draw_line'), + fill: require('./draw_fill'), + raster: require('./draw_raster'), + background: require('./draw_background'), + debug: require('./draw_debug'), + vertices: require('./draw_vertices') +}; + +Painter.prototype.render = function(style, options) { + this.style = style; + this.options = options; + + this.lineAtlas = style.lineAtlas; + + this.spriteAtlas = style.spriteAtlas; + this.spriteAtlas.setSprite(style.sprite); + + this.glyphAtlas = style.glyphAtlas; + this.glyphAtlas.bind(this.gl); + + this.frameHistory.record(this.transform.zoom); + + this.prepareBuffers(); + this.clearColor(); + + for (var i = style._groups.length - 1; i >= 0; i--) { + var group = style._groups[i]; + var source = style.sources[group.source]; + + if (source) { + this.clearStencil(); + source.render(group, this); + + } else if (group.source === undefined) { + this.drawLayers(group, this.identityMatrix); + } + } +}; + +Painter.prototype.drawTile = function(tile, layers) { + this.setExtent(tile.tileExtent); + this.drawClippingMask(tile); + this.drawLayers(layers, tile.posMatrix, tile); + + if (this.options.debug) { + draw.debug(this, tile); + } +}; + +Painter.prototype.drawLayers = function(layers, matrix, tile) { + for (var i = layers.length - 1; i >= 0; i--) { + var layer = layers[i]; + + if (layer.hidden) + continue; + + draw[layer.type](this, layer, matrix, tile); + + if (this.options.vertices) { + draw.vertices(this, layer, matrix, tile); + } + } +}; + +// Draws non-opaque areas. This is for debugging purposes. +Painter.prototype.drawStencilBuffer = function() { + var gl = this.gl; + gl.switchShader(this.fillShader, this.identityMatrix); + + // Blend to the front, not the back. + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + gl.stencilMask(0x00); + gl.stencilFunc(gl.EQUAL, 0x80, 0x80); + + // Drw the filling quad where the stencil buffer isn't set. + gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer); + gl.vertexAttribPointer(this.fillShader.a_pos, this.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0); + gl.disableVertexAttribArray(this.fillShader.a_color); + gl.vertexAttrib4fv(this.fillShader.a_color, [0, 0, 0, 0.5]); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount); + + // Revert blending mode to blend to the back. + gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); +}; + +Painter.prototype.translateMatrix = function(matrix, tile, translate, anchor) { + if (!translate[0] && !translate[1]) return matrix; + + if (anchor === 'viewport') { + var sinA = Math.sin(-this.transform.angle); + var cosA = Math.cos(-this.transform.angle); + translate = [ + translate[0] * cosA - translate[1] * sinA, + translate[0] * sinA + translate[1] * cosA + ]; + } + + var tilePixelRatio = this.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize); + var translation = [ + translate[0] / tilePixelRatio, + translate[1] / tilePixelRatio, + 0 + ]; + + var translatedMatrix = new Float32Array(16); + mat4.translate(translatedMatrix, matrix, translation); + return translatedMatrix; +}; + +Painter.prototype.saveTexture = function(texture) { + var textures = this.reusableTextures[texture.size]; + if (!textures) { + this.reusableTextures[texture.size] = [texture]; + } else { + textures.push(texture); + } +}; + + +Painter.prototype.getTexture = function(size) { + var textures = this.reusableTextures[size]; + return textures && textures.length > 0 ? textures.pop() : null; +}; + +},{"../util/browser":92,"./draw_background":23,"./draw_debug":25,"./draw_fill":26,"./draw_line":27,"./draw_raster":28,"./draw_symbol":29,"./draw_vertices":30,"./frame_history":31,"./gl_util":32,"gl-matrix":116}],35:[function(require,module,exports){ +'use strict'; + +var glify = undefined; + +module.exports = { + "debug": {"vertex":"precision mediump float;attribute vec2 a_pos;uniform float u_pointsize;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);gl_PointSize=u_pointsize;}","fragment":"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"}, + "dot": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}","fragment":"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"}, + "fill": {"vertex":"precision mediump float;uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec4 a_color;varying vec4 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=2.;a=a_color;}","fragment":"precision mediump float;varying vec4 a;void main(){gl_FragColor=a;}"}, + "gaussian": {"vertex":"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_offset;varying vec2 a[3];void main(){gl_Position=u_matrix*vec4(a_pos,0,1);vec2 b=gl_Position.xy/2.+.5;a[0]=b;a[1]=b+u_offset*1.1824255238063563;a[2]=b-u_offset*1.1824255238063563;}","fragment":"precision mediump float;uniform sampler2D u_image;varying vec2 a[3];void main(){vec4 b=vec4(0);b+=texture2D(u_image,a[0])*.40261994689424746;b+=texture2D(u_image,a[1])*.2986900265528763;b+=texture2D(u_image,a[2])*.2986900265528763;gl_FragColor=b;}"}, + "line": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,e;varying float b,d,f;varying vec4 c;void main(){vec2 g,h;g=a_data.xy;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;vec4 i=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+i.xy/u_ratio,0,1);float j,k,l;j=gl_Position.y/gl_Position.w;k=length(g)/length(u_antialiasingmatrix*g);l=1./(1.-j*u_extra);d=l*k;c=a_color;e=a_linewidth;f=a_blur;}","fragment":"precision mediump float;uniform vec2 u_dasharray;varying vec4 c;varying vec2 a,e;varying float b,d,f;void main(){float g,h,i;g=length(a)*e.s;h=f*d;i=clamp(min(g-(e.t-h),e.s-g)/h,0.,1.);gl_FragColor=c*i;}"}, + "linepattern": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data;attribute float a_blur,a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio;varying vec2 a,c;varying float b,d,e;void main(){vec2 f,h,i,j;f=a_data.xy;float g=a_data.z*128.+a_data.w;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;i=f*.015873016;j=a_linewidth.s*i;gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=g;c=a_linewidth;d=a_blur;e=a_opacity;}","fragment":"precision mediump float;uniform float u_point,u_fade;uniform vec2 u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,c;varying float b,d,e;void main(){float f,g,h,i,j,k;f=length(a)*c.s;g=clamp(min(f-(c.t-d),c.s-f)/d,0.,1.);h=mod(b/u_pattern_size_a.x,1.);i=mod(b/u_pattern_size_b.x,1.);j=.5+a.y*c.s/u_pattern_size_a.y;k=.5+a.y*c.s/u_pattern_size_b.y;vec2 l,m;l=mix(u_pattern_tl_a,u_pattern_br_a,vec2(h,j));m=mix(u_pattern_tl_b,u_pattern_br_b,vec2(i,k));vec4 n=mix(texture2D(u_image,l),texture2D(u_image,m),u_fade);g*=e;gl_FragColor=n*g;}"}, + "linesdfpattern": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio,u_tex_y_a,u_tex_y_b;uniform vec2 u_patternscale_a,u_patternscale_b;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){vec2 g,i;g=a_data.xy;float h=a_data.z*128.+a_data.w;i=mod(a_pos,2.);i.y=sign(i.y-.5);a=i;vec4 j=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=vec2(h*u_patternscale_a.x,i.y*u_patternscale_a.y+u_tex_y_a);c=vec2(h*u_patternscale_b.x,i.y*u_patternscale_b.y+u_tex_y_b);d=a_color;e=a_linewidth;f=a_blur;}","fragment":"precision mediump float;uniform sampler2D u_image;uniform float u_sdfgamma,u_mix;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){float g,h,i,j,k;g=length(a)*e.s;h=clamp(min(g-(e.t-f),e.s-g)/f,0.,1.);i=texture2D(u_image,b).a;j=texture2D(u_image,c).a;k=mix(i,j,u_mix);h*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,k);gl_FragColor=d*h;}"}, + "outline": {"vertex":"precision mediump float;attribute vec2 a_pos;attribute vec4 a_color;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec4 a;varying vec2 b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);b=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;a=a_color;}","fragment":"precision mediump float;varying vec4 a;varying vec2 b;void main(){float c,d;c=length(b-gl_FragCoord.xy);d=smoothstep(1.,0.,c);gl_FragColor=a*d;}"}, + "pattern": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}","fragment":"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"}, + "raster": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}","fragment":"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"}, + "icon": {"vertex":"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;attribute float a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=a_opacity;}","fragment":"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"}, + "sdf": {"vertex":"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2,a_color;attribute float a_buffer,a_gamma;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){vec2 g,i;g=a_data1.xy;float h,j,k,l,m,n,o;h=a_data1[2];i=a_data2.st;j=i[0];k=i[1];l=2.-step(j,u_zoom)-(1.-step(k,u_zoom));m=clamp((u_fadezoom-h)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=m;else b=1.-m;if(u_maxfadezoom=h)b=1.;l+=step(b,0.);if(u_skewed){vec4 n=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+n.xy,0,1);gl_Position.z+=l*gl_Position.w;}else{vec4 n=u_exmatrix*vec4(a_offset/64.,l,0);gl_Position=u_matrix*vec4(a_pos,0,1)+n;}n=gl_Position.y/gl_Position.w;o=1./(1.-n*u_extra);c=o;a=g/u_texsize;d=a_color;e=a_buffer;f=a_gamma;}","fragment":"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){float g,h,i;g=f*c;h=texture2D(u_texture,a).a;i=smoothstep(e-g,e+g,h)*b;gl_FragColor=d*i;}"}, + "collisionbox": {"vertex":"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}","fragment":"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"} +}; + +},{}],36:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Evented = require('../util/evented'); +var TilePyramid = require('./tile_pyramid'); +var Source = require('./source'); +var urlResolve = require('resolve-url'); + +module.exports = GeoJSONSource; + +/** + * Create a GeoJSON data source instance given an options object + * @class GeoJSONSource + * @param {Object} [options] + * @param {Object|string} options.data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files. + * @param {number} [options.maxzoom=14] Maximum zoom to preserve detail at. + * @param {number} [options.buffer] Tile buffer on each side. + * @param {number} [options.tolerance] Simplification tolerance (higher means simpler). + * @example + * var sourceObj = new mapboxgl.GeoJSONSource({ + * data: { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [ + * -76.53063297271729, + * 39.18174077994108 + * ] + * } + * }] + * } + * }); + * map.addSource('some id', sourceObj); // add + * map.removeSource('some id'); // remove + */ +function GeoJSONSource(options) { + options = options || {}; + + this._data = options.data; + + if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom; + + this.geojsonVtOptions = { maxZoom: this.maxzoom }; + if (options.buffer !== undefined) this.geojsonVtOptions.buffer = options.buffer; + if (options.tolerance !== undefined) this.geojsonVtOptions.tolerance = options.tolerance; + + this._pyramid = new TilePyramid({ + tileSize: 512, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + cacheSize: 20, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this) + }); +} + +GeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */{ + minzoom: 0, + maxzoom: 14, + _dirty: true, + + /** + * Update source geojson data and rerender map + * + * @param {Object|string} data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files. + * @returns {GeoJSONSource} this + */ + setData: function(data) { + this._data = data; + this._dirty = true; + + this.fire('change'); + + if (this.map) + this.update(this.map.transform); + + return this; + }, + + onAdd: function(map) { + this.map = map; + }, + + loaded: function() { + return this._loaded && this._pyramid.loaded(); + }, + + update: function(transform) { + if (this._dirty) { + this._updateData(); + } + + if (this._loaded) { + this._pyramid.update(this.used, transform); + } + }, + + reload: function() { + if (this._loaded) { + this._pyramid.reload(); + } + }, + + render: Source._renderTiles, + featuresAt: Source._vectorFeaturesAt, + + _updateData: function() { + this._dirty = false; + var data = this._data; + if (typeof data === 'string') { + data = urlResolve(window.location.href, data); + } + this.workerID = this.dispatcher.send('parse geojson', { + data: data, + tileSize: 512, + source: this.id, + geojsonVtOptions: this.geojsonVtOptions + }, function(err) { + + if (err) { + this.fire('error', {error: err}); + return; + } + this._loaded = true; + this._pyramid.reload(); + + this.fire('change'); + }.bind(this)); + }, + + _loadTile: function(tile) { + var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; + var params = { + uid: tile.uid, + coord: tile.coord, + zoom: tile.coord.z, + maxZoom: this.maxzoom, + tileSize: 512, + source: this.id, + overscaling: overscaling, + angle: this.map.transform.angle, + pitch: this.map.transform.pitch, + collisionDebug: this.map.collisionDebug + }; + + tile.workerID = this.dispatcher.send('load geojson tile', params, function(err, data) { + + tile.unloadVectorData(this.map.painter); + + if (tile.aborted) + return; + + if (err) { + this.fire('tile.error', {tile: tile}); + return; + } + + tile.loadVectorData(data); + this.fire('tile.load', {tile: tile}); + + }.bind(this), this.workerID); + }, + + _abortTile: function(tile) { + tile.aborted = true; + }, + + _addTile: function(tile) { + this.fire('tile.add', {tile: tile}); + }, + + _removeTile: function(tile) { + this.fire('tile.remove', {tile: tile}); + }, + + _unloadTile: function(tile) { + tile.unloadVectorData(this.map.painter); + this.glyphAtlas.removeGlyphs(tile.uid); + this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID); + } +}); + +},{"../util/evented":97,"../util/util":103,"./source":39,"./tile_pyramid":42,"resolve-url":136}],37:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var VectorTileFeature = require('vector-tile').VectorTileFeature; + +module.exports = GeoJSONWrapper; + +// conform to vectortile api +function GeoJSONWrapper(features) { + this.features = features; + this.length = features.length; +} + +GeoJSONWrapper.prototype.feature = function(i) { + return new FeatureWrapper(this.features[i]); +}; + +function FeatureWrapper(feature) { + this.type = feature.type; + this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry; + this.properties = feature.tags; + this.extent = 4096; +} + +FeatureWrapper.prototype.loadGeometry = function() { + var rings = this.rawGeometry; + this.geometry = []; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i], + newRing = []; + for (var j = 0; j < ring.length; j++) { + newRing.push(new Point(ring[j][0], ring[j][1])); + } + this.geometry.push(newRing); + } + return this.geometry; +}; + +FeatureWrapper.prototype.bbox = function() { + if (!this.geometry) this.loadGeometry(); + + var rings = this.geometry, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + + for (var j = 0; j < ring.length; j++) { + var coord = ring[j]; + + x1 = Math.min(x1, coord.x); + x2 = Math.max(x2, coord.x); + y1 = Math.min(y1, coord.y); + y2 = Math.max(y2, coord.y); + } + } + + return [x1, y1, x2, y2]; +}; + +FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; + +},{"point-geometry":134,"vector-tile":138}],38:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var Evented = require('../util/evented'); +var Source = require('./source'); +var normalizeURL = require('../util/mapbox').normalizeTileURL; + +module.exports = RasterTileSource; + +function RasterTileSource(options) { + util.extend(this, util.pick(options, ['url', 'tileSize'])); + + Source._loadTileJSON.call(this, options); +} + +RasterTileSource.prototype = util.inherit(Evented, { + minzoom: 0, + maxzoom: 22, + roundZoom: true, + tileSize: 512, + _loaded: false, + + onAdd: function(map) { + this.map = map; + }, + + loaded: function() { + return this._pyramid && this._pyramid.loaded(); + }, + + update: function(transform) { + if (this._pyramid) { + this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration); + } + }, + + reload: function() { + // noop + }, + + render: Source._renderTiles, + + _loadTile: function(tile) { + ajax.getImage(normalizeURL(tile.coord.url(this.tiles), this.url), function(err, img) { + if (tile.aborted) + return; + + if (err) { + this.fire('tile.error', {tile: tile}); + return; + } + + var gl = this.map.painter.gl; + tile.texture = this.map.painter.getTexture(img.width); + if (tile.texture) { + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img); + } else { + tile.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + tile.texture.size = img.width; + } + gl.generateMipmap(gl.TEXTURE_2D); + + tile.timeAdded = new Date().getTime(); + this.map.animationLoop.set(this.style.rasterFadeDuration); + + tile.source = this; + tile.loaded = true; + + this.fire('tile.load', {tile: tile}); + }.bind(this)); + }, + + _abortTile: function(tile) { + tile.aborted = true; + }, + + _addTile: function(tile) { + this.fire('tile.add', {tile: tile}); + }, + + _removeTile: function(tile) { + this.fire('tile.remove', {tile: tile}); + }, + + _unloadTile: function(tile) { + if (tile.texture) this.map.painter.saveTexture(tile.texture); + }, + + featuresAt: function(point, params, callback) { + callback(null, []); + } +}); + +},{"../util/ajax":91,"../util/evented":97,"../util/mapbox":100,"../util/util":103,"./source":39}],39:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var browser = require('../util/browser'); +var TilePyramid = require('./tile_pyramid'); +var TileCoord = require('./tile_coord'); +var normalizeURL = require('../util/mapbox').normalizeSourceURL; + +exports._loadTileJSON = function(options) { + + var loaded = function(err, tileJSON) { + if (err) { + this.fire('error', {error: err}); + return; + } + + util.extend(this, util.pick(tileJSON, + ['tiles', 'minzoom', 'maxzoom', 'attribution'])); + + this._pyramid = new TilePyramid({ + tileSize: this.tileSize, + cacheSize: 20, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + roundZoom: this.roundZoom, + reparseOverscaled: this.reparseOverscaled, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this), + redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined + }); + + // if index is defined, fetch the index json, then extend the pyramid + if (tileJSON.index) { + ajax.getJSON(normalizeURL(tileJSON.index), function (err, index) { + if (err) { + this.fire('error', {error: err}); + return; + } + + util.extend(this._pyramid, index); + this.fire('load'); + + }.bind(this)); + } else { + this.fire('load'); + } + + }.bind(this); + + if (options.url) { + ajax.getJSON(normalizeURL(options.url), loaded); + } else { + browser.frame(loaded.bind(this, null, options)); + } +}; + +exports._renderTiles = function(layers, painter) { + if (!this._pyramid) + return; + + var ids = this._pyramid.renderedIDs(); + for (var i = 0; i < ids.length; i++) { + var tile = this._pyramid.getTile(ids[i]), + // coord is different than tile.coord for wrapped tiles since the actual + // tile object is shared between all the visible copies of that tile. + coord = TileCoord.fromID(ids[i]), + z = coord.z, + x = coord.x, + y = coord.y, + w = coord.w; + + // if z > maxzoom then the tile is actually a overscaled maxzoom tile, + // so calculate the matrix the maxzoom tile would use. + z = Math.min(z, this.maxzoom); + + x += w * (1 << z); + tile.calculateMatrices(z, x, y, painter.transform, painter); + + painter.drawTile(tile, layers); + } +}; + +exports._vectorFeaturesAt = function(coord, params, callback) { + if (!this._pyramid) + return callback(null, []); + + var result = this._pyramid.tileAt(coord); + if (!result) + return callback(null, []); + + this.dispatcher.send('query features', { + uid: result.tile.uid, + x: result.x, + y: result.y, + scale: result.scale, + source: this.id, + params: params + }, callback, result.tile.workerID); +}; + +/* + * Create a tiled data source instance given an options object + * + * @param {Object} options + * @param {string} options.type Either `raster` or `vector`. + * @param {string} options.url A tile source URL. This should either be `mapbox://{mapid}` or a full `http[s]` url that points to a TileJSON endpoint. + * @param {Array} options.tiles An array of tile sources. If `url` is not specified, `tiles` can be used instead to specify tile sources, as in the TileJSON spec. Other TileJSON keys such as `minzoom` and `maxzoom` can be specified in a source object if `tiles` is used. + * @param {string} options.id An optional `id` to assign to the source + * @param {number} [options.tileSize=512] Optional tile size (width and height in pixels, assuming tiles are square). This option is only configurable for raster sources + * @param {number} options.cacheSize Optional max number of tiles to cache at any given time + * @example + * var sourceObj = new mapboxgl.Source.create({ + * type: 'vector', + * url: 'mapbox://mapbox.mapbox-streets-v5' + * }); + * map.addSource('some id', sourceObj); // add + * map.removeSource('some id'); // remove + */ +exports.create = function(source) { + // This is not at file scope in order to avoid a circular require. + var sources = { + vector: require('./vector_tile_source'), + raster: require('./raster_tile_source'), + geojson: require('./geojson_source'), + video: require('./video_source') + }; + + for (var type in sources) { + if (source instanceof sources[type]) { + return source; + } + } + + return new sources[source.type](source); +}; + +},{"../util/ajax":91,"../util/browser":92,"../util/mapbox":100,"../util/util":103,"./geojson_source":36,"./raster_tile_source":38,"./tile_coord":41,"./tile_pyramid":42,"./vector_tile_source":43,"./video_source":44}],40:[function(require,module,exports){ +'use strict'; + +var glmatrix = require('gl-matrix'); +var mat2 = glmatrix.mat2; +var mat4 = glmatrix.mat4; +var util = require('../util/util'); +var BufferSet = require('../data/buffer/buffer_set'); + +module.exports = Tile; + +/** + * A tile object is the combination of a Coordinate, which defines + * its place, as well as a unique ID and data tracking for its content + * + * @param {Coordinate} coord + * @param {number} size + * @private + */ +function Tile(coord, size) { + this.coord = coord; + this.uid = util.uniqueId(); + this.loaded = false; + this.uses = 0; + this.tileSize = size; +} + +Tile.prototype = { + // todo unhardcode + tileExtent: 4096, + + /** + * Calculate the internal posMatrix that this tile uses to display + * itself in a map, given a coordinate as (z, x, y) and a transform + * @param {number} z + * @param {number} x + * @param {number} y + * @param {Object} transform + * @private + */ + calculateMatrices: function(z, x, y, transform) { + + // Initialize model-view matrix that converts from the tile coordinates + // to screen coordinates. + var tileScale = Math.pow(2, z); + var scale = transform.worldSize / tileScale; + + // TODO: remove + this.scale = scale; + + // The position matrix + this.posMatrix = new Float64Array(16); + mat4.identity(this.posMatrix); + mat4.translate(this.posMatrix, this.posMatrix, [x * scale, y * scale, 0]); + + mat4.scale(this.posMatrix, this.posMatrix, [ scale / this.tileExtent, scale / this.tileExtent, 1 ]); + mat4.multiply(this.posMatrix, transform.getProjMatrix(), this.posMatrix); + + // The extrusion matrix. + this.exMatrix = mat4.create(); + mat4.ortho(this.exMatrix, 0, transform.width, transform.height, 0, 0, -1); + //mat4.rotateZ(this.exMatrix, this.exMatrix, -transform.angle); + + // 2x2 matrix for rotating points + this.rotationMatrix = mat2.create(); + mat2.rotate(this.rotationMatrix, this.rotationMatrix, transform.angle); + + this.posMatrix = new Float32Array(this.posMatrix); + }, + + /** + * Given a coordinate position, zoom that coordinate to my zoom and + * scale and return a position in x, y, scale + * @param {Coordinate} coord + * @returns {Object} position + * @private + */ + positionAt: function(coord, sourceMaxZoom) { + coord = coord.zoomTo(Math.min(this.coord.z, sourceMaxZoom)); + return { + x: (coord.column - this.coord.x) * 4096, + y: (coord.row - this.coord.y) * 4096, + scale: this.scale + }; + }, + + /** + * Given a data object with a 'buffers' property, load it into + * this tile's elementGroups and buffers properties and set loaded + * to true. If the data is null, like in the case of an empty + * GeoJSON tile, no-op but still set loaded to true. + * @param {Object} data + * @returns {undefined} + * @private + */ + loadVectorData: function(data) { + this.loaded = true; + + // empty GeoJSON tile + if (!data) return; + + this.buffers = new BufferSet(data.buffers); + this.elementGroups = data.elementGroups; + this.tileExtent = data.extent; + }, + + /** + * given a data object and a GL painter, destroy and re-create + * all of its buffers. + * @param {Object} data + * @param {Object} painter + * @returns {undefined} + * @private + */ + reloadSymbolData: function(data, painter) { + + if (!this.buffers) { + // the tile has been destroyed + return; + } + + this.buffers.glyphVertex.destroy(painter.gl); + this.buffers.glyphElement.destroy(painter.gl); + this.buffers.iconVertex.destroy(painter.gl); + this.buffers.iconElement.destroy(painter.gl); + this.buffers.collisionBoxVertex.destroy(painter.gl); + + var buffers = new BufferSet(data.buffers); + this.buffers.glyphVertex = buffers.glyphVertex; + this.buffers.glyphElement = buffers.glyphElement; + this.buffers.iconVertex = buffers.iconVertex; + this.buffers.iconElement = buffers.iconElement; + this.buffers.collisionBoxVertex = buffers.collisionBoxVertex; + + for (var id in data.elementGroups) { + this.elementGroups[id] = data.elementGroups[id]; + } + }, + + /** + * Make sure that this tile doesn't own any data within a given + * painter, so that it doesn't consume any memory or maintain + * any references to the painter. + * @param {Object} painter gl painter object + * @returns {undefined} + * @private + */ + unloadVectorData: function(painter) { + for (var b in this.buffers) { + this.buffers[b].destroy(painter.gl); + } + this.buffers = null; + } +}; + +},{"../data/buffer/buffer_set":2,"../util/util":103,"gl-matrix":116}],41:[function(require,module,exports){ +'use strict'; + +module.exports = TileCoord; + +function TileCoord(z, x, y, w) { + if (w === undefined) w = 0; + this.z = z; + this.x = x; + this.y = y; + this.w = w; + + // calculate id + w *= 2; + if (w < 0) w = w * -1 - 1; + var dim = 1 << this.z; + this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z; +} + +TileCoord.prototype.toString = function() { + return this.z + "/" + this.x + "/" + this.y; +}; + +// Parse a packed integer id into a TileCoord object +TileCoord.fromID = function(id) { + var z = id % 32, dim = 1 << z; + var xy = ((id - z) / 32); + var x = xy % dim, y = ((xy - x) / dim) % dim; + var w = Math.floor(xy / (dim * dim)); + if (w % 2 !== 0) w = w * -1 - 1; + w /= 2; + return new TileCoord(z, x, y, w); +}; + +// given a list of urls, choose a url template and return a tile URL +TileCoord.prototype.url = function(urls, sourceMaxZoom) { + return urls[(this.x + this.y) % urls.length] + .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) + .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z)) + .replace('{x}', this.x) + .replace('{y}', this.y); +}; + +// Return the coordinate of the parent tile +TileCoord.prototype.parent = function(sourceMaxZoom) { + if (this.z === 0) return null; + + // the id represents an overscaled tile, return the same coordinates with a lower z + if (this.z > sourceMaxZoom) { + return new TileCoord(this.z - 1, this.x, this.y, this.w); + } + + return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w); +}; + +TileCoord.prototype.wrapped = function() { + return new TileCoord(this.z, this.x, this.y, 0); +}; + +// Return the coordinates of the tile's children +TileCoord.prototype.children = function(sourceMaxZoom) { + + if (this.z >= sourceMaxZoom) { + // return a single tile coord representing a an overscaled tile + return [new TileCoord(this.z + 1, this.x, this.y, this.w)]; + } + + var z = this.z + 1; + var x = this.x * 2; + var y = this.y * 2; + return [ + new TileCoord(z, x, y, this.w), + new TileCoord(z, x + 1, y, this.w), + new TileCoord(z, x, y + 1, this.w), + new TileCoord(z, x + 1, y + 1, this.w) + ]; +}; + +// Taken from polymaps src/Layer.js +// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 + +function edge(a, b) { + if (a.row > b.row) { var t = a; a = b; b = t; } + return { + x0: a.column, + y0: a.row, + x1: b.column, + y1: b.row, + dx: b.column - a.column, + dy: b.row - a.row + }; +} + +function scanSpans(e0, e1, ymin, ymax, scanLine) { + var y0 = Math.max(ymin, Math.floor(e1.y0)); + var y1 = Math.min(ymax, Math.ceil(e1.y1)); + + // sort edges by x-coordinate + if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? + (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : + (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { + var t = e0; e0 = e1; e1 = t; + } + + // scan lines! + var m0 = e0.dx / e0.dy; + var m1 = e1.dx / e1.dy; + var d0 = e0.dx > 0; // use y + 1 to compute x0 + var d1 = e1.dx < 0; // use y + 1 to compute x1 + for (var y = y0; y < y1; y++) { + var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; + var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; + scanLine(Math.floor(x1), Math.ceil(x0), y); + } +} + +function scanTriangle(a, b, c, ymin, ymax, scanLine) { + var ab = edge(a, b), + bc = edge(b, c), + ca = edge(c, a); + + var t; + + // sort edges by y-length + if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } + if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } + if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } + + // scan span! scan span! + if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine); + if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine); +} + +TileCoord.cover = function(z, bounds, actualZ) { + var tiles = 1 << z; + var t = {}; + + function scanLine(x0, x1, y) { + var x, wx; + if (y >= 0 && y <= tiles) { + for (x = x0; x < x1; x++) { + wx = (x + tiles) % tiles; + var coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles)); + t[coord.id] = coord; + } + } + } + + // Divide the screen up in two triangles and scan each of them: + // +---/ + // | / | + // /---+ + scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine); + scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine); + + return Object.keys(t).map(function(id) { + return t[id]; + }); +}; + +},{}],42:[function(require,module,exports){ +'use strict'; + +var Tile = require('./tile'); +var TileCoord = require('./tile_coord'); +var Point = require('point-geometry'); +var Cache = require('../util/mru_cache'); +var util = require('../util/util'); + +module.exports = TilePyramid; + +/** + * A tile pyramid is a specialized cache and datastructure + * that contains tiles. It's used by sources to manage their + * data. + * + * @param {Object} options + * @param {number} options.tileSize + * @param {number} options.minzoom + * @param {number} options.maxzoom + * @private + */ +function TilePyramid(options) { + this.tileSize = options.tileSize; + this.minzoom = options.minzoom; + this.maxzoom = options.maxzoom; + this.roundZoom = options.roundZoom; + this.reparseOverscaled = options.reparseOverscaled; + // esri/chelm + this.index = options.index; + + this._load = options.load; + this._abort = options.abort; + this._unload = options.unload; + this._add = options.add; + this._remove = options.remove; + this._redoPlacement = options.redoPlacement; + + this._tiles = {}; + this._cache = new Cache(options.cacheSize, function(tile) { return this._unload(tile); }.bind(this)); +} + +TilePyramid.prototype = { + /** + * Confirm that every tracked tile is loaded. + * @returns {boolean} whether all tiles are loaded. + * @private + */ + loaded: function() { + for (var t in this._tiles) { + if (!this._tiles[t].loaded) + return false; + } + return true; + }, + + /** + * Return all tile ids ordered with z-order, and cast to numbers + * @returns {Array} ids + * @private + */ + orderedIDs: function() { + return Object.keys(this._tiles) + .sort(function(a, b) { return (b % 32) - (a % 32); }) + .map(function(id) { return +id; }); + }, + + renderedIDs: function() { + return this.orderedIDs().filter(function(id) { + return this._tiles[id].loaded && !this._coveredTiles[id]; + }.bind(this)); + }, + + reload: function() { + this._cache.reset(); + for (var i in this._tiles) { + this._load(this._tiles[i]); + } + }, + + /** + * Get a specific tile by id + * @param {string|number} id tile id + * @returns {Object} tile + * @private + */ + getTile: function(id) { + return this._tiles[id]; + }, + + /** + * get the zoom level adjusted for the difference in map and source tilesizes + * @param {Object} transform + * @returns {number} zoom level + * @private + */ + getZoom: function(transform) { + return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2; + }, + + /** + * Return a zoom level that will cover all tiles in a given transform + * @param {Object} transform + * @returns {number} zoom level + * @private + */ + coveringZoomLevel: function(transform) { + return (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); + }, + + /** + * Given a transform, return all coordinates that could cover that + * transform for a covering zoom level. + * @param {Object} transform + * @returns {Array} tiles + * @private + */ + coveringTiles: function(transform) { + var z = this.coveringZoomLevel(transform); + var actualZ = z; + + if (z < this.minzoom) return []; + if (z > this.maxzoom) z = this.maxzoom; + + var tr = transform, + tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z), + centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5); + + return TileCoord.cover(z, [ + tr.pointCoordinate(new Point(0, 0))._zoomTo(z), + tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z), + tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z), + tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z) + ], this.reparseOverscaled ? actualZ : z).sort(function(a, b) { + return centerPoint.dist(a) - centerPoint.dist(b); + }); + }, + + /** + * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; + * adds found tiles to retain object; returns true if children completely cover the tile + * + * @param {Coordinate} coord + * @param {number} maxCoveringZoom + * @param {boolean} retain + * @returns {boolean} whether the operation was complete + * @private + */ + findLoadedChildren: function(coord, maxCoveringZoom, retain) { + var complete = true; + var z = coord.z; + var coords = coord.children(this.maxzoom); + for (var i = 0; i < coords.length; i++) { + var id = coords[i].id; + if (this._tiles[id] && this._tiles[id].loaded) { + retain[id] = true; + } else { + complete = false; + if (z < maxCoveringZoom) { + // Go further down the hierarchy to find more unloaded children. + this.findLoadedChildren(coords[i], maxCoveringZoom, retain); + } + } + } + return complete; + }, + + /** + * Find a loaded parent of the given tile (up to minCoveringZoom); + * adds the found tile to retain object and returns the tile if found + * + * @param {Coordinate} coord + * @param {number} minCoveringZoom + * @param {boolean} retain + * @returns {Tile} tile object + * @private + */ + findLoadedParent: function(coord, minCoveringZoom, retain) { + for (var z = coord.z - 1; z >= minCoveringZoom; z--) { + coord = coord.parent(this.maxzoom); + var tile = this._tiles[coord.id]; + if (tile && tile.loaded) { + retain[coord.id] = true; + return tile; + } + } + }, + + /** + * Removes tiles that are outside the viewport and adds new tiles that + * are inside the viewport. + * @private + */ + update: function(used, transform, fadeDuration) { + var i; + var coord; + var tile; + + // Determine the overzooming/underzooming amounts. + var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); + var minCoveringZoom = util.clamp(zoom - 10, this.minzoom, this.maxzoom); + var maxCoveringZoom = util.clamp(zoom + 1, this.minzoom, this.maxzoom); + + // Retain is a list of tiles that we shouldn't delete, even if they are not + // the most ideal tile for the current viewport. This may include tiles like + // parent or child tiles that are *already* loaded. + var retain = {}; + var now = new Date().getTime(); + + // Covered is a list of retained tiles who's areas are full covered by other, + // better, retained tiles. They are not drawn separately. + this._coveredTiles = {}; + + var required = used ? this.coveringTiles(transform) : []; + for (i = 0; i < required.length; i++) { + coord = required[i]; + tile = this.addTile(coord); + + retain[coord.id] = true; + + if (tile.loaded) + continue; + + // The tile we require is not yet loaded. + // Retain child or parent tiles that cover the same area. + if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) { + this.findLoadedParent(coord, minCoveringZoom, retain); + } + } + + for (var id in retain) { + coord = TileCoord.fromID(id); + tile = this._tiles[id]; + if (tile && tile.timeAdded > now - (fadeDuration || 0)) { + // This tile is still fading in. Find tiles to cross-fade with it. + if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) { + this._coveredTiles[id] = true; + retain[id] = true; + } else { + this.findLoadedParent(coord, minCoveringZoom, retain); + } + } + } + + // Remove the tiles we don't need anymore. + var remove = util.keysDifference(this._tiles, retain); + for (i = 0; i < remove.length; i++) { + this.removeTile(+remove[i]); + } + }, + + /** + * Add a tile, given its coordinate, to the pyramid. + * @param {Coordinate} coord + * @returns {Coordinate} the coordinate. + * @private + */ + addTile: function(coord) { + var tile = this._tiles[coord.id]; + if (tile) + return tile; + + var wrapped = coord.wrapped(); + tile = this._tiles[wrapped.id]; + + if (!tile) { + tile = this._cache.get(wrapped.id); + if (tile && this._redoPlacement) { + this._redoPlacement(tile); + } + } + + if (!tile) { + var zoom = coord.z; + var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1; + tile = new Tile(wrapped, this.tileSize * overscaling); + // esri/chelm + if (this.index) { + tile.parentId = this.indexSearch(coord.id); + } + this._load(tile); + } + + tile.uses++; + this._tiles[coord.id] = tile; + this._add(tile, coord); + + return tile; + }, + + /** + * Remove a tile, given its id, from the pyramid + * @param {string|number} id tile id + * @returns {undefined} nothing + * @private + */ + removeTile: function(id) { + var tile = this._tiles[id]; + if (!tile) + return; + + tile.uses--; + delete this._tiles[id]; + this._remove(tile); + + if (tile.uses > 0) + return; + + if (tile.loaded) { + this._cache.add(tile.coord.wrapped().id, tile); + } else { + this._abort(tile); + this._unload(tile); + } + }, + + /** + * Remove all tiles from this pyramid + * @private + */ + clearTiles: function() { + for (var id in this._tiles) + this.removeTile(id); + this._cache.reset(); + }, + + /** + * For a given coordinate, search through our current tiles and attempt + * to find a tile at that point + * @param {Coordinate} coord + * @returns {Object} tile + * @private + */ + tileAt: function(coord) { + var ids = this.orderedIDs(); + for (var i = 0; i < ids.length; i++) { + var tile = this._tiles[ids[i]]; + var pos = tile.positionAt(coord, this.maxzoom); + if (pos && pos.x >= 0 && pos.x < 4096 && pos.y >= 0 && pos.y < 4096) { + // The click is within the viewport. There is only ever one tile in + // a layer that has this property. + return { + tile: tile, + x: pos.x, + y: pos.y, + scale: pos.scale + }; + } + } + }, + + /** + * For a given tile id find its parent tile from the index + * @param {string|number} id tile id + * @returns {Object} tile + * @private + */ + indexSearch: function (id) { + var tile = TileCoord.fromID(id); + + var ids = []; + + var parentTile = tile; + while (id !== 0) { + parentTile = parentTile.parent(id); + id = parentTile.id; + ids.push(id); + } + + var cursor = this.index, + cursorId = ids.pop(), + index; + + while (ids.length) { + id = ids.pop(); + index = tile.children(cursorId).indexOf(id); + if (cursor) { + if (cursor[index] === 0) { + id = cursorId; + break; + } else if (cursor[index] === 1) { + break; + } else { + cursorId = id; + cursor = cursor[index]; + } + } + } + + return TileCoord.fromID(id).id; + + } + +}; + +},{"../util/mru_cache":101,"../util/util":103,"./tile":40,"./tile_coord":41,"point-geometry":134}],43:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Evented = require('../util/evented'); +var Source = require('./source'); +var TileCoord = require('./tile_coord'); + +module.exports = VectorTileSource; + +function VectorTileSource(options) { + util.extend(this, util.pick(options, ['url', 'tileSize'])); + + if (this.tileSize !== 512) { + throw new Error('vector tile sources must have a tileSize of 512'); + } + + Source._loadTileJSON.call(this, options); +} + +VectorTileSource.prototype = util.inherit(Evented, { + minzoom: 0, + maxzoom: 22, + tileSize: 512, + reparseOverscaled: true, + _loaded: false, + + onAdd: function(map) { + this.map = map; + }, + + loaded: function() { + return this._pyramid && this._pyramid.loaded(); + }, + + update: function(transform) { + if (this._pyramid) { + this._pyramid.update(this.used, transform); + } + }, + + reload: function() { + if (this._pyramid) { + this._pyramid.reload(); + } + }, + + redoPlacement: function() { + if (!this._pyramid) { + return; + } + + var ids = this._pyramid.orderedIDs(); + for (var i = 0; i < ids.length; i++) { + var tile = this._pyramid.getTile(ids[i]); + this._redoTilePlacement(tile); + } + }, + + render: Source._renderTiles, + featuresAt: Source._vectorFeaturesAt, + + _loadTile: function(tile) { + var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; + var params = { + url: tile.coord.url(this.tiles, this.maxzoom), + uid: tile.uid, + coord: tile.coord, + zoom: tile.coord.z, + maxZoom: this.maxzoom, + tileSize: this.tileSize * overscaling, + source: this.id, + overscaling: overscaling, + angle: this.map.transform.angle, + pitch: this.map.transform.pitch, + collisionDebug: this.map.collisionDebug + }; + + // request the tile parentID if it exists + if (tile.parentId) { + console.log(TileCoord.fromID(tile.parentID)) + params.url = TileCoord.fromID(tile.parentID).url(this.tiles, this.maxzoom); + } + + if (tile.workerID) { + this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID); + } else { + tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile)); + } + }, + + _tileLoaded: function(tile, err, data) { + if (tile.aborted) + return; + + if (err) { + this.fire('tile.error', {tile: tile}); + return; + } + + tile.loadVectorData(data); + + if (tile.redoWhenDone) { + tile.redoWhenDone = false; + this._redoTilePlacement(tile); + } + + this.fire('tile.load', {tile: tile}); + }, + + _abortTile: function(tile) { + tile.aborted = true; + this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID); + }, + + _addTile: function(tile) { + this.fire('tile.add', {tile: tile}); + }, + + _removeTile: function(tile) { + this.fire('tile.remove', {tile: tile}); + }, + + _unloadTile: function(tile) { + tile.unloadVectorData(this.map.painter); + this.glyphAtlas.removeGlyphs(tile.uid); + this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID); + }, + + _redoTilePlacement: function(tile) { + + if (!tile.loaded || tile.redoingPlacement) { + tile.redoWhenDone = true; + return; + } + + tile.redoingPlacement = true; + + this.dispatcher.send('redo placement', { + uid: tile.uid, + source: this.id, + angle: this.map.transform.angle, + pitch: this.map.transform.pitch, + collisionDebug: this.map.collisionDebug + }, done.bind(this), tile.workerID); + + function done(_, data) { + tile.reloadSymbolData(data, this.map.painter); + this.fire('tile.load', {tile: tile}); + + tile.redoingPlacement = false; + if (tile.redoWhenDone) { + this._redoTilePlacement(tile); + tile.redoWhenDone = false; + } + } + } +}); + +},{"../util/evented":97,"../util/util":103,"./source":39,"./tile_coord":41}],44:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Tile = require('./tile'); +var LatLng = require('../geo/lat_lng'); +var Point = require('point-geometry'); +var Evented = require('../util/evented'); +var Coordinate = require('../geo/coordinate'); +var ajax = require('../util/ajax'); + +module.exports = VideoSource; + +/** + * Create a Video data source instance given an options object + * @class VideoSource + * @param {Object} [options] + * @param {string|Array} options.url A string or array of URL(s) to video files + * @param {Array} options.coordinates lat,lng coordinates in order clockwise starting at the top left: tl, tr, br, bl + * @example + * var sourceObj = new mapboxgl.VideoSource({ + * url: [ + * 'https://www.mapbox.com/videos/baltimore-smoke.mp4', + * 'https://www.mapbox.com/videos/baltimore-smoke.webm' + * ], + * coordinates: [ + * [39.18579907229748, -76.54335737228394], + * [39.1838364847587, -76.52803659439087], + * [39.17683392507606, -76.5295386314392], + * [39.17876344106642, -76.54520273208618] + * ] + * }); + * map.addSource('some id', sourceObj); // add + * map.removeSource('some id'); // remove + */ +function VideoSource(options) { + this.coordinates = options.coordinates; + + ajax.getVideo(options.url, function(err, video) { + // @TODO handle errors via event. + if (err) return; + + this.video = video; + this.video.loop = true; + + var loopID; + + // start repainting when video starts playing + this.video.addEventListener('playing', function() { + loopID = this.map.style.animationLoop.set(Infinity); + this.map._rerender(); + }.bind(this)); + + // stop repainting when video stops + this.video.addEventListener('pause', function() { + this.map.style.animationLoop.cancel(loopID); + }.bind(this)); + + this._loaded = true; + + if (this.map) { + this.video.play(); + this.createTile(); + this.fire('change'); + } + }.bind(this)); +} + +VideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{ + roundZoom: true, + + /** + * Return the HTML video element. + * + * @returns {Object} + */ + getVideo: function() { + return this.video; + }, + + onAdd: function(map) { + this.map = map; + if (this.video) { + this.video.play(); + this.createTile(); + } + }, + + createTile: function() { + /* + * Calculate which mercator tile is suitable for rendering the video in + * and create a buffer with the corner coordinates. These coordinates + * may be outside the tile, because raster tiles aren't clipped when rendering. + */ + var map = this.map; + var coords = this.coordinates.map(function(latlng) { + var loc = LatLng.convert(latlng); + return map.transform.locationCoordinate(loc).zoomTo(0); + }); + + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < coords.length; i++) { + minX = Math.min(minX, coords[i].column); + minY = Math.min(minY, coords[i].row); + maxX = Math.max(maxX, coords[i].column); + maxY = Math.max(maxY, coords[i].row); + } + + var dx = maxX - minX; + var dy = maxY - minY; + var dMax = Math.max(dx, dy); + var center = new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0) + .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2)); + + var tileExtent = 4096; + var tileCoords = coords.map(function(coord) { + var zoomedCoord = coord.zoomTo(center.zoom); + return new Point( + Math.round((zoomedCoord.column - center.column) * tileExtent), + Math.round((zoomedCoord.row - center.row) * tileExtent)); + }); + + var gl = map.painter.gl; + var maxInt16 = 32767; + var array = new Int16Array([ + tileCoords[0].x, tileCoords[0].y, 0, 0, + tileCoords[1].x, tileCoords[1].y, maxInt16, 0, + tileCoords[3].x, tileCoords[3].y, 0, maxInt16, + tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16 + ]); + + this.tile = new Tile(); + this.tile.buckets = {}; + + this.tile.boundsBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.tile.boundsBuffer); + gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW); + + this.center = center; + }, + + loaded: function() { + return this.video && this.video.readyState >= 2; + }, + + update: function() { + // noop + }, + + reload: function() { + // noop + }, + + render: function(layers, painter) { + if (!this._loaded) return; + if (this.video.readyState < 2) return; // not enough data for current position + + var c = this.center; + this.tile.calculateMatrices(c.zoom, c.column, c.row, this.map.transform, painter); + + var gl = painter.gl; + if (!this.tile.texture) { + this.tile.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video); + } else { + gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); + } + + painter.drawLayers(layers, this.tile.posMatrix, this.tile); + }, + + featuresAt: function(point, params, callback) { + return callback(null, []); + } +}); + +},{"../geo/coordinate":17,"../geo/lat_lng":18,"../util/ajax":91,"../util/evented":97,"../util/util":103,"./tile":40,"point-geometry":134}],45:[function(require,module,exports){ +'use strict'; + +var Actor = require('../util/actor'); +var WorkerTile = require('./worker_tile'); +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var vt = require('vector-tile'); +var Protobuf = require('pbf'); + +var geojsonvt = require('geojson-vt'); +var GeoJSONWrapper = require('./geojson_wrapper'); + +module.exports = function(self) { + return new Worker(self); +}; + +function Worker(self) { + this.self = self; + this.actor = new Actor(self, this); + this.loading = {}; + + this.loaded = {}; + this.layers = []; + this.geoJSONIndexes = {}; +} + +util.extend(Worker.prototype, { + 'set layers': function(layers) { + this.layers = layers; + }, + + 'load tile': function(params, callback) { + var source = params.source, + uid = params.uid; + + if (!this.loading[source]) + this.loading[source] = {}; + + + var tile = this.loading[source][uid] = new WorkerTile(params); + + tile.xhr = ajax.getArrayBuffer(params.url, done.bind(this)); + + function done(err, data) { + delete this.loading[source][uid]; + + if (err) return callback(err); + + tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data))); + if (params.id !== params.parentId && tile.data.layers) { + var tilePos = tile.coord.fromID(params.id); + var parentPos = tile.coord.fromID(params.parentId); + var dz = tilePos.z - parentPos.z; + var xPos = tilePos.x & ((1 << dz) - 1); + var yPos = tilePos.y & ((1 << dz) - 1); + tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); + } else { + tile.parse(tile.data, this.layers, this.actor, callback); + } + + this.loaded[source] = this.loaded[source] || {}; + this.loaded[source][uid] = tile; + } + }, + + 'reload tile': function(params, callback) { + var loaded = this.loaded[params.source], + uid = params.uid; + if (loaded && loaded[uid]) { + var tile = loaded[uid]; + tile.parse(tile.data, this.layers, this.actor, callback); + } + }, + + 'abort tile': function(params) { + var loading = this.loading[params.source], + uid = params.uid; + if (loading && loading[uid]) { + loading[uid].xhr.abort(); + delete loading[uid]; + } + }, + + 'remove tile': function(params) { + var loaded = this.loaded[params.source], + uid = params.uid; + if (loaded && loaded[uid]) { + delete loaded[uid]; + } + }, + + 'redo placement': function(params, callback) { + var loaded = this.loaded[params.source], + loading = this.loading[params.source], + uid = params.uid; + + if (loaded && loaded[uid]) { + var tile = loaded[uid]; + var result = tile.redoPlacement(params.angle, params.pitch, params.collisionDebug); + + if (result.result) { + callback(null, result.result, result.transferables); + } + + } else if (loading && loading[uid]) { + loading[uid].angle = params.angle; + } + }, + + 'parse geojson': function(params, callback) { + var indexData = function(err, data) { + if (err) return callback(err); + this.geoJSONIndexes[params.source] = geojsonvt(data, params.geojsonVtOptions); + callback(null); + }.bind(this); + + // TODO accept params.url for urls instead + + // Not, because of same origin issues, urls must either include an + // explicit origin or absolute path. + // ie: /foo/bar.json or http://example.com/bar.json + // but not ../foo/bar.json + if (typeof params.data === 'string') { + ajax.getJSON(params.data, indexData); + } + else indexData(null, params.data); + }, + + 'load geojson tile': function(params, callback) { + var source = params.source, + coord = params.coord; + + // console.time('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); + + var geoJSONTile = this.geoJSONIndexes[source].getTile(coord.z, coord.x, coord.y); + + // console.timeEnd('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); + + // if (!geoJSONTile) console.log('not found', this.geoJSONIndexes[source], coord); + + if (!geoJSONTile) return callback(null, null); // nothing in the given tile + + var tile = new WorkerTile(params); + tile.parse(new GeoJSONWrapper(geoJSONTile.features), this.layers, this.actor, callback); + + this.loaded[source] = this.loaded[source] || {}; + this.loaded[source][params.uid] = tile; + }, + + 'query features': function(params, callback) { + var tile = this.loaded[params.source] && this.loaded[params.source][params.uid]; + if (tile) { + tile.featureTree.query(params, callback); + } else { + callback(null, []); + } + } +}); + +},{"../util/actor":90,"../util/ajax":91,"../util/util":103,"./geojson_wrapper":37,"./worker_tile":46,"geojson-vt":112,"pbf":132,"vector-tile":138}],46:[function(require,module,exports){ +'use strict'; + +var FeatureTree = require('../data/feature_tree'); +var CollisionTile = require('../symbol/collision_tile'); +var BufferSet = require('../data/buffer/buffer_set'); +var createBucket = require('../data/create_bucket'); + +module.exports = WorkerTile; + +function WorkerTile(params) { + this.coord = params.coord; + this.uid = params.uid; + this.zoom = params.zoom; + this.maxZoom = params.maxZoom; + this.tileSize = params.tileSize; + this.source = params.source; + this.overscaling = params.overscaling; + this.angle = params.angle; + this.pitch = params.pitch; + this.collisionDebug = params.collisionDebug; + + this.stacks = {}; +} + +WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, yPos) { + + this.status = 'parsing'; + + this.featureTree = new FeatureTree(this.coord, this.overscaling); + + var i, k, + tile = this, + layer, + bucket, + buffers = new BufferSet(), + collisionTile = new CollisionTile(this.angle, this.pitch), + buckets = {}, + bucketsInOrder = this.bucketsInOrder = [], + bucketsBySourceLayer = {}; + + // Map non-ref layers to buckets. + for (i = 0; i < layers.length; i++) { + layer = layers[i]; + + if (layer.source !== this.source) + continue; + + if (layer.ref) + continue; + + var minzoom = layer.minzoom; + if (minzoom && this.zoom < minzoom && minzoom < this.maxZoom) + continue; + + var maxzoom = layer.maxzoom; + if (maxzoom && this.zoom >= maxzoom) + continue; + + var visibility = layer.layout.visibility; + if (visibility === 'none') + continue; + + bucket = createBucket(layer, buffers, this.zoom, this.overscaling, this.collisionDebug); + bucket.layers = [layer.id]; + + buckets[bucket.id] = bucket; + bucketsInOrder.push(bucket); + + if (data.layers) { + // vectortile + var sourceLayer = layer['source-layer']; + if (!bucketsBySourceLayer[sourceLayer]) + bucketsBySourceLayer[sourceLayer] = {}; + bucketsBySourceLayer[sourceLayer][bucket.id] = bucket; + } else { + // geojson tile + bucketsBySourceLayer[bucket.id] = bucket; + } + } + + // Index ref layers. + for (i = 0; i < layers.length; i++) { + layer = layers[i]; + + if (layer.source !== this.source) + continue; + + if (!layer.ref) + continue; + + bucket = buckets[layer.ref]; + if (!bucket) + continue; + + bucket.layers.push(layer.id); + } + + var extent = 4096; + + // read each layer, and sort its features into buckets + if (data.layers) { + // vectortile + for (k in bucketsBySourceLayer) { + layer = data.layers[k]; + if (!layer) continue; + if (layer.extent) extent = layer.extent; + sortLayerIntoBuckets(layer, bucketsBySourceLayer[k], dz, xPos, yPos); + } + } else { + // geojson + sortLayerIntoBuckets(data, bucketsBySourceLayer); + } + + function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i); + //MOB + feature.dz = dz; + feature.xPos = xPos; + feature.yPos = yPos; + + for (var key in buckets) { + var bucket = buckets[key]; + if (bucket.filter(feature)) { + bucket.features.push(feature); + } + } + } + } + + var prevPlacementBucket; + var remaining = bucketsInOrder.length; + + /* + * The async parsing here is a bit tricky. + * Some buckets depend on resources that may need to be loaded async (glyphs). + * Some buckets need to be parsed in order (to get collision priorities right). + * + * Dependencies calls are initiated first to get those rolling. + * Buckets that don't need to be parsed in order, aren't to save time. + */ + + for (i = 0; i < bucketsInOrder.length; i++) { + bucket = bucketsInOrder[i]; + + // Link buckets that need to be parsed in order + if (bucket.needsPlacement) { + if (prevPlacementBucket) { + prevPlacementBucket.next = bucket; + } else { + bucket.previousPlaced = true; + } + prevPlacementBucket = bucket; + } + + if (bucket.getDependencies) { + bucket.getDependencies(this, actor, dependenciesDone(bucket)); + } + + // immediately parse buckets where order doesn't matter and no dependencies + if (!bucket.needsPlacement && !bucket.getDependencies) { + parseBucket(tile, bucket); + } + } + + function dependenciesDone(bucket) { + return function(err) { + bucket.dependenciesLoaded = true; + parseBucket(tile, bucket, err); + }; + } + + function parseBucket(tile, bucket, skip) { + if (bucket.getDependencies && !bucket.dependenciesLoaded) return; + if (bucket.needsPlacement && !bucket.previousPlaced) return; + + if (!skip) { + var now = Date.now(); + if (bucket.features.length) bucket.addFeatures(collisionTile); + var time = Date.now() - now; + if (bucket.interactive) { + for (var i = 0; i < bucket.features.length; i++) { + var feature = bucket.features[i]; + tile.featureTree.insert(feature.bbox(), bucket.layers, feature); + } + } + if (typeof self !== 'undefined') { + self.bucketStats = self.bucketStats || {_total: 0}; + self.bucketStats._total += time; + self.bucketStats[bucket.id] = (self.bucketStats[bucket.id] || 0) + time; + } + } + + remaining--; + + if (!remaining) { + done(); + return; + } + + // try parsing the next bucket, if it is ready + if (bucket.next) { + bucket.next.previousPlaced = true; + parseBucket(tile, bucket.next); + } + } + + function done() { + + tile.status = 'done'; + + if (tile.redoPlacementAfterDone) { + var result = tile.redoPlacement(tile.angle, tile.pitch).result; + buffers.glyphVertex = result.buffers.glyphVertex; + buffers.iconVertex = result.buffers.iconVertex; + buffers.collisionBoxVertex = result.buffers.collisionBoxVertex; + } + + var transferables = [], + elementGroups = {}; + + for (k in buffers) { + transferables.push(buffers[k].array); + } + + for (k in buckets) { + elementGroups[k] = buckets[k].elementGroups; + } + + callback(null, { + elementGroups: elementGroups, + buffers: buffers, + extent: extent + }, transferables); + } +}; + +WorkerTile.prototype.redoPlacement = function(angle, pitch, collisionDebug) { + + if (this.status !== 'done') { + this.redoPlacementAfterDone = true; + this.angle = angle; + return {}; + } + + var buffers = new BufferSet(); + var transferables = []; + var elementGroups = {}; + var collisionTile = new CollisionTile(angle, pitch); + + var bucketsInOrder = this.bucketsInOrder; + for (var i = 0; i < bucketsInOrder.length; i++) { + var bucket = bucketsInOrder[i]; + + if (bucket.type === 'symbol') { + bucket.placeFeatures(collisionTile, buffers, collisionDebug); + elementGroups[bucket.id] = bucket.elementGroups; + } + } + + for (var k in buffers) { + transferables.push(buffers[k].array); + } + + return { + result: { + elementGroups: elementGroups, + buffers: buffers + }, + transferables: transferables + }; + +}; + +},{"../data/buffer/buffer_set":2,"../data/create_bucket":11,"../data/feature_tree":13,"../symbol/collision_tile":65}],47:[function(require,module,exports){ +'use strict'; + +module.exports = AnimationLoop; + +function AnimationLoop() { + this.n = 0; + this.times = []; +} + +// Are all animations done? +AnimationLoop.prototype.stopped = function() { + this.times = this.times.filter(function(t) { + return t.time >= (new Date()).getTime(); + }); + return !this.times.length; +}; + +// Add a new animation that will run t milliseconds +// Returns an id that can be used to cancel it layer +AnimationLoop.prototype.set = function(t) { + this.times.push({ id: this.n, time: t + (new Date()).getTime() }); + return this.n++; +}; + +// Cancel an animation +AnimationLoop.prototype.cancel = function(n) { + this.times = this.times.filter(function(t) { + return t.id !== n; + }); +}; + +},{}],48:[function(require,module,exports){ +'use strict'; + +var Evented = require('../util/evented'); +var ajax = require('../util/ajax'); +var browser = require('../util/browser'); + +module.exports = ImageSprite; + +function ImageSprite(base) { + this.base = base; + this.retina = browser.devicePixelRatio > 1; + + base = this.base + (this.retina ? '@2x' : ''); + + ajax.getJSON(base + '.json', function(err, data) { + if (err) { + this.fire('error', {error: err}); + return; + } + + this.data = data; + if (this.img) this.fire('load'); + }.bind(this)); + + ajax.getImage(base + '.png', function(err, img) { + if (err) { + this.fire('error', {error: err}); + return; + } + + // premultiply the sprite + var data = img.getData(); + var newdata = img.data = new Uint8Array(data.length); + for (var i = 0; i < data.length; i += 4) { + var alpha = data[i + 3] / 255; + newdata[i + 0] = data[i + 0] * alpha; + newdata[i + 1] = data[i + 1] * alpha; + newdata[i + 2] = data[i + 2] * alpha; + newdata[i + 3] = data[i + 3]; + } + + this.img = img; + if (this.data) this.fire('load'); + }.bind(this)); +} + +ImageSprite.prototype = Object.create(Evented); + +ImageSprite.prototype.toJSON = function() { + return this.base; +}; + +ImageSprite.prototype.loaded = function() { + return !!(this.data && this.img); +}; + +ImageSprite.prototype.resize = function(/*gl*/) { + if (browser.devicePixelRatio > 1 !== this.retina) { + var newSprite = new ImageSprite(this.base); + newSprite.on('load', function() { + this.img = newSprite.img; + this.data = newSprite.data; + this.retina = newSprite.retina; + }.bind(this)); + } +}; + +function SpritePosition() {} +SpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false }; + +ImageSprite.prototype.getSpritePosition = function(name) { + if (!this.loaded()) return new SpritePosition(); + + var pos = this.data && this.data[name]; + if (pos && this.img) return pos; + + return new SpritePosition(); +}; + +},{"../util/ajax":91,"../util/browser":92,"../util/evented":97}],49:[function(require,module,exports){ +'use strict'; + +var reference = require('./reference'); + +module.exports = {}; + +reference.layout.forEach(function(className) { + var Properties = function(props) { + for (var p in props) { + this[p] = props[p]; + } + }; + + var properties = reference[className]; + for (var prop in properties) { + if (properties[prop].default === undefined) continue; + Properties.prototype[prop] = properties[prop].default; + } + module.exports[className.replace('layout_', '')] = Properties; +}); + +},{"./reference":51}],50:[function(require,module,exports){ +'use strict'; + +var reference = require('./reference'); +var parseCSSColor = require('csscolorparser').parseCSSColor; + +module.exports = {}; + +reference.paint.forEach(function(className) { + var Calculated = function() {}; + + var properties = reference[className]; + for (var p in properties) { + var prop = properties[p], + value = prop.default; + + if (value === undefined) continue; + if (prop.type === 'color') value = parseCSSColor(value); + + Calculated.prototype[p] = value; + } + + Calculated.prototype.hidden = false; + module.exports[className.replace('paint_', '')] = Calculated; +}); + +},{"./reference":51,"csscolorparser":108}],51:[function(require,module,exports){ +module.exports = require('mapbox-gl-style-spec/reference/latest'); + +},{"mapbox-gl-style-spec/reference/latest":129}],52:[function(require,module,exports){ +'use strict'; + +var Evented = require('../util/evented'); +var styleBatch = require('./style_batch'); +var StyleLayer = require('./style_layer'); +var ImageSprite = require('./image_sprite'); +var GlyphSource = require('../symbol/glyph_source'); +var GlyphAtlas = require('../symbol/glyph_atlas'); +var SpriteAtlas = require('../symbol/sprite_atlas'); +var LineAtlas = require('../render/line_atlas'); +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var normalizeURL = require('../util/mapbox').normalizeStyleURL; +var browser = require('../util/browser'); +var Dispatcher = require('../util/dispatcher'); +var AnimationLoop = require('./animation_loop'); +var validate = require('mapbox-gl-style-spec/lib/validate/latest'); + +module.exports = Style; + +function Style(stylesheet, animationLoop) { + this.animationLoop = animationLoop || new AnimationLoop(); + this.dispatcher = new Dispatcher(Math.max(browser.hardwareConcurrency - 1, 1), this); + this.glyphAtlas = new GlyphAtlas(1024, 1024); + this.spriteAtlas = new SpriteAtlas(512, 512); + this.spriteAtlas.resize(browser.devicePixelRatio); + this.lineAtlas = new LineAtlas(256, 512); + + this._layers = {}; + this._order = []; + this._groups = []; + this.sources = {}; + + this.zoomHistory = {}; + + util.bindAll([ + '_forwardSourceEvent', + '_forwardTileEvent', + '_redoPlacement' + ], this); + + var loaded = function(err, stylesheet) { + if (err) { + this.fire('error', {error: err}); + return; + } + + var valid = validate(stylesheet); + if (valid.length) { + valid.forEach(function(e) { + throw new Error(e.message); + }); + } + + this._loaded = true; + this.stylesheet = stylesheet; + + var sources = stylesheet.sources; + for (var id in sources) { + this.addSource(id, sources[id]); + } + + if (stylesheet.sprite) { + this.sprite = new ImageSprite(stylesheet.sprite); + this.sprite.on('load', this.fire.bind(this, 'change')); + } + + this.glyphSource = new GlyphSource(stylesheet.glyphs, this.glyphAtlas); + this._resolve(); + this.fire('load'); + }.bind(this); + + if (typeof stylesheet === 'string') { + ajax.getJSON(normalizeURL(stylesheet), loaded); + } else { + browser.frame(loaded.bind(this, null, stylesheet)); + } +} + +Style.prototype = util.inherit(Evented, { + _loaded: false, + + loaded: function() { + if (!this._loaded) + return false; + + for (var id in this.sources) + if (!this.sources[id].loaded()) + return false; + + if (this.sprite && !this.sprite.loaded()) + return false; + + return true; + }, + + _resolve: function() { + var id, layer; + + this._layers = {}; + this._order = []; + + for (var i = 0; i < this.stylesheet.layers.length; i++) { + layer = new StyleLayer(this.stylesheet.layers[i], this.stylesheet.constants || {}); + this._layers[layer.id] = layer; + this._order.push(layer.id); + } + + // Resolve layout properties. + for (id in this._layers) { + this._layers[id].resolveLayout(); + } + + // Resolve reference and paint properties. + for (id in this._layers) { + this._layers[id].resolveReference(this._layers); + this._layers[id].resolvePaint(); + } + + this._groupLayers(); + this._broadcastLayers(); + }, + + _groupLayers: function() { + var group; + + this._groups = []; + + // Split into groups of consecutive top-level layers with the same source. + for (var i = 0; i < this._order.length; ++i) { + var layer = this._layers[this._order[i]]; + + if (!group || layer.source !== group.source) { + group = []; + group.source = layer.source; + this._groups.push(group); + } + + group.push(layer); + } + }, + + _broadcastLayers: function() { + var ordered = []; + + for (var id in this._layers) { + ordered.push(this._layers[id].json()); + } + + this.dispatcher.broadcast('set layers', ordered); + }, + + _cascade: function(classes, options) { + if (!this._loaded) return; + + options = options || { + transition: true + }; + + for (var id in this._layers) { + this._layers[id].cascade(classes, options, + this.stylesheet.transition || {}, + this.animationLoop); + } + + this.fire('change'); + }, + + _recalculate: function(z) { + for (var id in this.sources) + this.sources[id].used = false; + + this._updateZoomHistory(z); + + this.rasterFadeDuration = 300; + for (id in this._layers) { + var layer = this._layers[id]; + + if (layer.recalculate(z, this.zoomHistory) && layer.source) { + this.sources[layer.source].used = true; + } + } + + var maxZoomTransitionDuration = 300; + if (Math.floor(this.z) !== Math.floor(z)) { + this.animationLoop.set(maxZoomTransitionDuration); + } + + this.z = z; + this.fire('zoom'); + }, + + _updateZoomHistory: function(z) { + + var zh = this.zoomHistory; + + if (zh.lastIntegerZoom === undefined) { + // first time + zh.lastIntegerZoom = Math.floor(z); + zh.lastIntegerZoomTime = 0; + zh.lastZoom = z; + } + + // check whether an integer zoom level as passed since the last frame + // and if yes, record it with the time. Used for transitioning patterns. + if (Math.floor(zh.lastZoom) < Math.floor(z)) { + zh.lastIntegerZoom = Math.floor(z); + zh.lastIntegerZoomTime = Date.now(); + + } else if (Math.floor(zh.lastZoom) > Math.floor(z)) { + zh.lastIntegerZoom = Math.floor(z + 1); + zh.lastIntegerZoomTime = Date.now(); + } + + zh.lastZoom = z; + }, + + /** + * Apply multiple style mutations in a batch + * @param {function} work Function which accepts the StyleBatch interface + * @private + */ + batch: function(work) { + styleBatch(this, work); + }, + + addSource: function(id, source) { + this.batch(function(batch) { + batch.addSource(id, source); + }); + + return this; + }, + + /** + * Remove a source from this stylesheet, given its id. + * @param {string} id id of the source to remove + * @returns {Style} this style + * @throws {Error} if no source is found with the given ID + * @private + */ + removeSource: function(id) { + this.batch(function(batch) { + batch.removeSource(id); + }); + + return this; + }, + + /** + * Get a source by id. + * @param {string} id id of the desired source + * @returns {Object} source + * @private + */ + getSource: function(id) { + return this.sources[id]; + }, + + /** + * Add a layer to the map style. The layer will be inserted before the layer with + * ID `before`, or appended if `before` is omitted. + * @param {StyleLayer|Object} layer + * @param {string=} before ID of an existing layer to insert before + * @fires layer.add + * @returns {Style} `this` + * @private + */ + addLayer: function(layer, before) { + this.batch(function(batch) { + batch.addLayer(layer, before); + }); + + return this; + }, + + /** + * Remove a layer from this stylesheet, given its id. + * @param {string} id id of the layer to remove + * @returns {Style} this style + * @throws {Error} if no layer is found with the given ID + * @private + */ + removeLayer: function(id) { + this.batch(function(batch) { + batch.removeLayer(id); + }); + + return this; + }, + + /** + * Get a layer by id. + * @param {string} id id of the desired layer + * @returns {Layer} layer + * @private + */ + getLayer: function(id) { + return this._layers[id]; + }, + + /** + * If a layer has a `ref` property that makes it derive some values + * from another layer, return that referent layer. Otherwise, + * returns the layer itself. + * @param {string} id the layer's id + * @returns {Layer} the referent layer or the layer itself + * @private + */ + getReferentLayer: function(id) { + var layer = this.getLayer(id); + if (layer.ref) { + layer = this.getLayer(layer.ref); + } + return layer; + }, + + setFilter: function(layer, filter) { + this.batch(function(batch) { + batch.setFilter(layer, filter); + }); + + return this; + }, + + setLayerZoomRange: function(layerId, minzoom, maxzoom) { + this.batch(function(batch) { + batch.setLayerZoomRange(layerId, minzoom, maxzoom); + }); + + return this; + }, + + /** + * Get a layer's filter object + * @param {string} layer the layer to inspect + * @returns {*} the layer's filter, if any + * @private + */ + getFilter: function(layer) { + return this.getReferentLayer(layer).filter; + }, + + setLayoutProperty: function(layer, name, value) { + this.batch(function(batch) { + batch.setLayoutProperty(layer, name, value); + }); + + return this; + }, + + /** + * Get a layout property's value from a given layer + * @param {string} layer the layer to inspect + * @param {string} name the name of the layout property + * @returns {*} the property value + * @private + */ + getLayoutProperty: function(layer, name) { + return this.getReferentLayer(layer).getLayoutProperty(name); + }, + + setPaintProperty: function(layer, name, value, klass) { + this.batch(function(batch) { + batch.setPaintProperty(layer, name, value, klass); + }); + + return this; + }, + + getPaintProperty: function(layer, name, klass) { + return this.getLayer(layer).getPaintProperty(name, klass); + }, + + featuresAt: function(coord, params, callback) { + var features = []; + var error = null; + + if (params.layer) { + params.layer = { id: params.layer }; + } + + util.asyncEach(Object.keys(this.sources), function(id, callback) { + var source = this.sources[id]; + source.featuresAt(coord, params, function(err, result) { + if (result) features = features.concat(result); + if (err) error = err; + callback(); + }); + }.bind(this), function() { + if (error) return callback(error); + + callback(null, features + .filter(function(feature) { + return this._layers[feature.layer] !== undefined; + }.bind(this)) + .map(function(feature) { + feature.layer = this._layers[feature.layer].json(); + return feature; + }.bind(this))); + }.bind(this)); + }, + + _remove: function() { + this.dispatcher.remove(); + }, + + _reloadSource: function(id) { + this.sources[id].reload(); + }, + + _updateSources: function(transform) { + for (var id in this.sources) { + this.sources[id].update(transform); + } + }, + + _redoPlacement: function() { + for (var id in this.sources) { + if (this.sources[id].redoPlacement) this.sources[id].redoPlacement(); + } + }, + + _forwardSourceEvent: function(e) { + this.fire('source.' + e.type, util.extend({source: e.target}, e)); + }, + + _forwardTileEvent: function(e) { + this.fire(e.type, util.extend({source: e.target}, e)); + }, + + // Callbacks from web workers + + 'get sprite json': function(params, callback) { + var sprite = this.sprite; + if (sprite.loaded()) { + callback(null, { sprite: sprite.data, retina: sprite.retina }); + } else { + sprite.on('load', function() { + callback(null, { sprite: sprite.data, retina: sprite.retina }); + }); + } + }, + + 'get icons': function(params, callback) { + var sprite = this.sprite; + var spriteAtlas = this.spriteAtlas; + if (sprite.loaded()) { + spriteAtlas.setSprite(sprite); + spriteAtlas.addIcons(params.icons, callback); + } else { + sprite.on('load', function() { + spriteAtlas.setSprite(sprite); + spriteAtlas.addIcons(params.icons, callback); + }); + } + }, + + 'get glyphs': function(params, callback) { + this.glyphSource.getSimpleGlyphs(params.fontstack, params.codepoints, params.uid, callback); + } +}); + +},{"../render/line_atlas":33,"../symbol/glyph_atlas":67,"../symbol/glyph_source":68,"../symbol/sprite_atlas":74,"../util/ajax":91,"../util/browser":92,"../util/dispatcher":94,"../util/evented":97,"../util/mapbox":100,"../util/util":103,"./animation_loop":47,"./image_sprite":48,"./style_batch":53,"./style_layer":57,"mapbox-gl-style-spec/lib/validate/latest":127}],53:[function(require,module,exports){ +'use strict'; + +var Source = require('../source/source'); +var StyleLayer = require('./style_layer'); + +function styleBatch(style, work) { + if (!style._loaded) { + throw new Error('Style is not done loading'); + } + + var batch = Object.create(styleBatch.prototype); + + batch._style = style; + batch._groupLayers = false; + batch._broadcastLayers = false; + batch._reloadSources = {}; + batch._events = []; + batch._change = false; + + work(batch); + + if (batch._groupLayers) { + batch._style._groupLayers(); + } + + if (batch._broadcastLayers) { + batch._style._broadcastLayers(); + } + + Object.keys(batch._reloadSources).forEach(function(sourceId) { + batch._style._reloadSource(sourceId); + }); + + batch._events.forEach(function(args) { + batch._style.fire.apply(batch._style, args); + }); + + if (batch._change) { + batch._style.fire('change'); + } +} + +styleBatch.prototype = { + + addLayer: function(layer, before) { + if (this._style._layers[layer.id] !== undefined) { + throw new Error('There is already a layer with this ID'); + } + if (!(layer instanceof StyleLayer)) { + layer = new StyleLayer(layer, this._style.stylesheet.constants || {}); + } + this._style._layers[layer.id] = layer; + this._style._order.splice(before ? this._style._order.indexOf(before) : Infinity, 0, layer.id); + layer.resolveLayout(); + layer.resolveReference(this._style._layers); + layer.resolvePaint(); + + this._groupLayers = true; + this._broadcastLayers = true; + if (layer.source) { + this._reloadSources[layer.source] = true; + } + this._events.push(['layer.add', {layer: layer}]); + this._change = true; + + return this; + }, + + removeLayer: function(id) { + var layer = this._style._layers[id]; + if (layer === undefined) { + throw new Error('There is no layer with this ID'); + } + for (var i in this._style._layers) { + if (this._style._layers[i].ref === id) { + this.removeLayer(i); + } + } + delete this._style._layers[id]; + this._style._order.splice(this._style._order.indexOf(id), 1); + + this._groupLayers = true; + this._broadcastLayers = true; + this._events.push(['layer.remove', {layer: layer}]); + this._change = true; + + return this; + }, + + setPaintProperty: function(layer, name, value, klass) { + this._style.getLayer(layer).setPaintProperty(name, value, klass); + this._change = true; + + return this; + }, + + setLayoutProperty: function(layer, name, value) { + layer = this._style.getReferentLayer(layer); + layer.setLayoutProperty(name, value); + + this._broadcastLayers = true; + if (layer.source) { + this._reloadSources[layer.source] = true; + } + this._change = true; + + return this; + }, + + setFilter: function(layer, filter) { + layer = this._style.getReferentLayer(layer); + layer.filter = filter; + + this._broadcastLayers = true; + if (layer.source) { + this._reloadSources[layer.source] = true; + } + this._change = true; + + return this; + }, + + setLayerZoomRange: function(layerId, minzoom, maxzoom) { + var layer = this._style.getReferentLayer(layerId); + if (minzoom != null) { + layer.minzoom = minzoom; + } + if (maxzoom != null) { + layer.maxzoom = maxzoom; + } + + this._broadcastLayers = true; + if (layer.source) { + this._reloadSources[layer.source] = true; + } + this._change = true; + + return this; + }, + + addSource: function(id, source) { + if (!this._style._loaded) { + throw new Error('Style is not done loading'); + } + if (this._style.sources[id] !== undefined) { + throw new Error('There is already a source with this ID'); + } + source = Source.create(source); + this._style.sources[id] = source; + source.id = id; + source.style = this._style; + source.dispatcher = this._style.dispatcher; + source.glyphAtlas = this._style.glyphAtlas; + source + .on('load', this._style._forwardSourceEvent) + .on('error', this._style._forwardSourceEvent) + .on('change', this._style._forwardSourceEvent) + .on('tile.add', this._style._forwardTileEvent) + .on('tile.load', this._style._forwardTileEvent) + .on('tile.error', this._style._forwardTileEvent) + .on('tile.remove', this._style._forwardTileEvent); + + this._events.push(['source.add', {source: source}]); + this._change = true; + + return this; + }, + + removeSource: function(id) { + if (this._style.sources[id] === undefined) { + throw new Error('There is no source with this ID'); + } + var source = this._style.sources[id]; + delete this._style.sources[id]; + source + .off('load', this._style._forwardSourceEvent) + .off('error', this._style._forwardSourceEvent) + .off('change', this._style._forwardSourceEvent) + .off('tile.add', this._style._forwardTileEvent) + .off('tile.load', this._style._forwardTileEvent) + .off('tile.error', this._style._forwardTileEvent) + .off('tile.remove', this._style._forwardTileEvent); + + this._events.push(['source.remove', {source: source}]); + this._change = true; + + return this; + } +}; + +module.exports = styleBatch; + +},{"../source/source":39,"./style_layer":57}],54:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); + +exports.resolve = function(value, constants) { + function resolve(value) { + return typeof value === 'string' && value[0] === '@' ? constants[value] : value; + } + + var i; + + value = resolve(value); + + if (Array.isArray(value)) { + value = value.slice(); + + for (i = 0; i < value.length; i++) { + if (value[i] in constants) { + value[i] = resolve(value[i]); + } + } + } + + if (value.stops) { + value = util.extend({}, value); + value.stops = value.stops.slice(); + + for (i = 0; i < value.stops.length; i++) { + if (value.stops[i][1] in constants) { + value.stops[i] = [ + value.stops[i][0], + resolve(value.stops[i][1]) + ]; + } + } + } + + return value; +}; + +exports.resolveAll = function (properties, constants) { + if (!constants) + return properties; + + var result = {}; + + for (var key in properties) { + result[key] = exports.resolve(properties[key], constants); + } + + return result; +}; + +},{"../util/util":103}],55:[function(require,module,exports){ +'use strict'; + +var parseCSSColor = require('csscolorparser').parseCSSColor; +var mapboxGLFunction = require('mapbox-gl-function'); +var util = require('../util/util'); + +module.exports = StyleDeclaration; + +function StyleDeclaration(reference, value) { + this.type = reference.type; + this.transitionable = reference.transition; + + // immutable representation of value. used for comparison + this.json = JSON.stringify(value); + + if (this.type !== 'color') { + this.value = value; + } else if (value.stops) { + this.value = prepareColorFunction(value); + } else { + this.value = parseColor(value); + } + + if (reference.function === 'interpolated') { + this.calculate = mapboxGLFunction.interpolated(this.value); + } else { + this.calculate = mapboxGLFunction['piecewise-constant'](this.value); + if (reference.transition) { + this.calculate = transitioned(this.calculate); + } + } +} + +function transitioned(calculate) { + return function(z, zh, duration) { + var fraction = z % 1; + var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1); + var fromScale = 1; + var toScale = 1; + var mix, from, to; + + if (z > zh.lastIntegerZoom) { + mix = fraction + (1 - fraction) * t; + fromScale *= 2; + from = calculate(z - 1); + to = calculate(z); + } else { + mix = 1 - (1 - t) * fraction; + to = calculate(z); + from = calculate(z + 1); + fromScale /= 2; + } + + return { + from: from, + fromScale: fromScale, + to: to, + toScale: toScale, + t: mix + }; + }; +} + +var colorCache = {}; + +function parseColor(value) { + if (colorCache[value]) return colorCache[value]; + var color = prepareColor(parseCSSColor(value)); + colorCache[value] = color; + return color; +} + +function prepareColor(c) { + return [c[0] / 255, c[1] / 255, c[2] / 255, c[3] / 1]; +} + +function prepareColorFunction(f) { + return util.extend({}, f, {stops: f.stops.map(function(stop) { + return [stop[0], parseColor(stop[1])]; + })}); +} + +},{"../util/util":103,"csscolorparser":108,"mapbox-gl-function":126}],56:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var reference = require('./reference'); +var StyleConstant = require('./style_constant'); +var StyleDeclaration = require('./style_declaration'); + +var lookup = { + paint: {}, + layout: {} +}; + +reference.layer.type.values.forEach(function(type) { + lookup.paint[type] = makeConstructor(reference['paint_' + type]); + lookup.layout[type] = makeConstructor(reference['layout_' + type]); +}); + +function makeConstructor(reference) { + function StyleDeclarationSet(properties, constants) { + this._values = {}; + this._transitions = {}; + + this._constants = constants; + + for (var k in properties) { + this[k] = StyleConstant.resolve(properties[k], this._constants); + } + } + + Object.keys(reference).forEach(function(k) { + var property = reference[k]; + + Object.defineProperty(StyleDeclarationSet.prototype, k, { + set: function(v) { + this._values[k] = new StyleDeclaration(property, StyleConstant.resolve(v, this._constants)); + }, + get: function() { + return this._values[k].value; + } + }); + + if (property.transition) { + Object.defineProperty(StyleDeclarationSet.prototype, k + '-transition', { + set: function(v) { + this._transitions[k] = v; + }, + get: function() { + return this._transitions[k]; + } + }); + } + }); + + StyleDeclarationSet.prototype.values = function() { + return this._values; + }; + + StyleDeclarationSet.prototype.transition = function(k, global) { + var t = this._transitions[k] || {}; + return { + duration: util.coalesce(t.duration, global.duration, 300), + delay: util.coalesce(t.delay, global.delay, 0) + }; + }; + + StyleDeclarationSet.prototype.json = function() { + var result = {}; + + for (var v in this._values) { + result[v] = this._values[v].value; + } + + for (var t in this._transitions) { + result[t + '-transition'] = this._transitions[v]; + } + + return result; + }; + + return StyleDeclarationSet; +} + +module.exports = function(renderType, layerType, properties, constants) { + return new lookup[renderType][layerType](properties, constants); +}; + +},{"../util/util":103,"./reference":51,"./style_constant":54,"./style_declaration":55}],57:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var StyleConstant = require('./style_constant'); +var StyleTransition = require('./style_transition'); +var StyleDeclarationSet = require('./style_declaration_set'); +var LayoutProperties = require('./layout_properties'); +var PaintProperties = require('./paint_properties'); + +module.exports = StyleLayer; + +function StyleLayer(layer, constants) { + this._layer = layer; + this._constants = constants; + + this.id = layer.id; + this.ref = layer.ref; + + // Resolved and cascaded paint properties. + this._resolved = {}; // class name -> StyleDeclarationSet + this._cascaded = {}; // property name -> StyleTransition + + this.assign(layer); +} + +StyleLayer.prototype = { + resolveLayout: function() { + if (!this.ref) { + this.layout = new LayoutProperties[this.type]( + StyleConstant.resolveAll(this._layer.layout, this._constants)); + + if (this.layout['symbol-placement'] === 'line') { + if (!this.layout.hasOwnProperty('text-rotation-alignment')) { + this.layout['text-rotation-alignment'] = 'map'; + } + if (!this.layout.hasOwnProperty('icon-rotation-alignment')) { + this.layout['icon-rotation-alignment'] = 'map'; + } + this.layout['symbol-avoid-edges'] = true; + } + } + }, + + setLayoutProperty: function(name, value) { + this.layout[name] = StyleConstant.resolve(value, this._constants); + }, + + getLayoutProperty: function(name) { + return this.layout[name]; + }, + + resolveReference: function(layers) { + if (this.ref) { + this.assign(layers[this.ref]); + } + }, + + resolvePaint: function() { + for (var p in this._layer) { + var match = p.match(/^paint(?:\.(.*))?$/); + if (!match) + continue; + this._resolved[match[1] || ''] = + new StyleDeclarationSet('paint', this.type, this._layer[p], this._constants); + } + }, + + setPaintProperty: function(name, value, klass) { + var declarations = this._resolved[klass || '']; + if (!declarations) { + declarations = this._resolved[klass || ''] = + new StyleDeclarationSet('paint', this.type, {}, this._constants); + } + declarations[name] = value; + }, + + getPaintProperty: function(name, klass) { + var declarations = this._resolved[klass || '']; + if (!declarations) + return undefined; + return declarations[name]; + }, + + cascade: function(classes, options, globalTrans, animationLoop) { + for (var klass in this._resolved) { + if (klass !== "" && !classes[klass]) + continue; + + var declarations = this._resolved[klass], + values = declarations.values(); + + for (var k in values) { + var newDeclaration = values[k]; + var oldTransition = options.transition ? this._cascaded[k] : undefined; + + // Only create a new transition if the declaration changed + if (!oldTransition || oldTransition.declaration.json !== newDeclaration.json) { + var newStyleTrans = declarations.transition(k, globalTrans); + var newTransition = this._cascaded[k] = + new StyleTransition(newDeclaration, oldTransition, newStyleTrans); + + // Run the animation loop until the end of the transition + if (!newTransition.instant()) { + newTransition.loopID = animationLoop.set(newTransition.endTime - (new Date()).getTime()); + } + + if (oldTransition) { + animationLoop.cancel(oldTransition.loopID); + } + } + } + } + }, + + recalculate: function(z, zoomHistory) { + var type = this.type, + calculated = this.paint = new PaintProperties[type](); + + for (var k in this._cascaded) { + calculated[k] = this._cascaded[k].at(z, zoomHistory); + } + + this.hidden = (this.minzoom && z < this.minzoom) || + (this.maxzoom && z >= this.maxzoom) || + // include visibility check for non-bucketed background layers + (this.layout.visibility === 'none'); + + if (type === 'symbol') { + if ((calculated['text-opacity'] === 0 || !this.layout['text-field']) && + (calculated['icon-opacity'] === 0 || !this.layout['icon-image'])) { + this.hidden = true; + } else { + premultiplyLayer(calculated, 'text'); + premultiplyLayer(calculated, 'icon'); + } + + } else if (calculated[type + '-opacity'] === 0) { + this.hidden = true; + } else { + premultiplyLayer(calculated, type); + } + + if (this._cascaded['line-dasharray']) { + // If the line is dashed, scale the dash lengths by the line + // width at the previous round zoom level. + var dashArray = calculated['line-dasharray']; + var lineWidth = this._cascaded['line-width'] ? + this._cascaded['line-width'].at(Math.floor(z), Infinity) : + calculated['line-width']; + + dashArray.fromScale *= lineWidth; + dashArray.toScale *= lineWidth; + } + + return !this.hidden; + }, + + assign: function(layer) { + util.extend(this, util.pick(layer, + ['type', 'source', 'source-layer', + 'minzoom', 'maxzoom', 'filter', + 'layout'])); + }, + + json: function() { + return util.extend({}, + this._layer, + util.pick(this, + ['type', 'source', 'source-layer', + 'minzoom', 'maxzoom', 'filter', + 'layout', 'paint'])); + } +}; + +function premultiplyLayer(layer, type) { + var colorProp = type + '-color', + haloProp = type + '-halo-color', + outlineProp = type + '-outline-color', + color = layer[colorProp], + haloColor = layer[haloProp], + outlineColor = layer[outlineProp], + opacity = layer[type + '-opacity']; + + var colorOpacity = color && (opacity * color[3]); + var haloOpacity = haloColor && (opacity * haloColor[3]); + var outlineOpacity = outlineColor && (opacity * outlineColor[3]); + + if (colorOpacity !== undefined && colorOpacity < 1) { + layer[colorProp] = util.premultiply([color[0], color[1], color[2], colorOpacity]); + } + if (haloOpacity !== undefined && haloOpacity < 1) { + layer[haloProp] = util.premultiply([haloColor[0], haloColor[1], haloColor[2], haloOpacity]); + } + if (outlineOpacity !== undefined && outlineOpacity < 1) { + layer[outlineProp] = util.premultiply([outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity]); + } +} + +},{"../util/util":103,"./layout_properties":49,"./paint_properties":50,"./style_constant":54,"./style_declaration_set":56,"./style_transition":58}],58:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var interpolate = require('../util/interpolate'); + +module.exports = StyleTransition; + +/* + * Represents a transition between two declarations + */ +function StyleTransition(declaration, oldTransition, value) { + + this.declaration = declaration; + this.startTime = this.endTime = (new Date()).getTime(); + + var type = declaration.type; + if ((type === 'string' || type === 'array') && declaration.transitionable) { + this.interp = interpZoomTransitioned; + } else { + this.interp = interpolate[type]; + } + + this.oldTransition = oldTransition; + this.duration = value.duration || 0; + this.delay = value.delay || 0; + + if (!this.instant()) { + this.endTime = this.startTime + this.duration + this.delay; + this.ease = util.easeCubicInOut; + } + + if (oldTransition && oldTransition.endTime <= this.startTime) { + // Old transition is done running, so we can + // delete its reference to its old transition. + + delete oldTransition.oldTransition; + } +} + +StyleTransition.prototype.instant = function() { + return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0); +}; + +/* + * Return the value of the transitioning property at zoom level `z` and optional time `t` + */ +StyleTransition.prototype.at = function(z, zoomHistory, t) { + + var value = this.declaration.calculate(z, zoomHistory, this.duration); + + if (this.instant()) return value; + + t = t || Date.now(); + + if (t < this.endTime) { + var oldValue = this.oldTransition.at(z, zoomHistory, this.startTime); + var eased = this.ease((t - this.startTime - this.delay) / this.duration); + value = this.interp(oldValue, value, eased); + } + + return value; + +}; + +function interpZoomTransitioned(from, to, t) { + return { + from: from.to, + fromScale: from.toScale, + to: to.to, + toScale: to.toScale, + t: t + }; +} + +},{"../util/interpolate":99,"../util/util":103}],59:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = Anchor; + +function Anchor(x, y, angle, segment) { + this.x = x; + this.y = y; + this.angle = angle; + + if (segment !== undefined) { + this.segment = segment; + } +} + +Anchor.prototype = Object.create(Point.prototype); + +Anchor.prototype.clone = function() { + return new Anchor(this.x, this.y, this.angle, this.segment); +}; + +},{"point-geometry":134}],60:[function(require,module,exports){ +'use strict'; + +module.exports = BinPack; +function BinPack(width, height) { + this.width = width; + this.height = height; + this.free = [{ x: 0, y: 0, w: width, h: height }]; +} + +/** + * Simple algorithm to recursively merge the newly released cell with its + * neighbor. This doesn't merge more than two cells at a time, and fails + * for complicated merges. + * @private + */ +BinPack.prototype.release = function(rect) { + for (var i = 0; i < this.free.length; i++) { + var free = this.free[i]; + + if (free.y === rect.y && free.h === rect.h && free.x + free.w === rect.x) { + free.w += rect.w; + + } else if (free.x === rect.x && free.w === rect.w && free.y + free.h === rect.y) { + free.h += rect.h; + + } else if (rect.y === free.y && rect.h === free.h && rect.x + rect.w === free.x) { + free.x = rect.x; + free.w += rect.w; + + } else if (rect.x === free.x && rect.w === free.w && rect.y + rect.h === free.y) { + free.y = rect.y; + free.h += rect.h; + + } else continue; + + this.free.splice(i, 1); + this.release(free); + return; + + } + this.free.push(rect); +}; + +BinPack.prototype.allocate = function(width, height) { + // Find the smallest free rect angle + var rect = { x: Infinity, y: Infinity, w: Infinity, h: Infinity }; + var smallest = -1; + for (var i = 0; i < this.free.length; i++) { + var ref = this.free[i]; + if (width <= ref.w && height <= ref.h && ref.y <= rect.y && ref.x <= rect.x) { + rect = ref; + smallest = i; + } + } + + if (smallest < 0) { + // There's no space left for this char. + return { x: -1, y: -1 }; + } + + this.free.splice(smallest, 1); + + // Shorter/Longer Axis Split Rule (SAS) + // http://clb.demon.fi/files/RectangleBinPack.pdf p. 15 + // Ignore the dimension of R and just split long the shorter dimension + // See Also: http://www.cs.princeton.edu/~chazelle/pubs/blbinpacking.pdf + if (rect.w < rect.h) { + // split horizontally + // +--+---+ + // |__|___| <-- b1 + // +------+ <-- b2 + if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: height }); + if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: rect.w, h: rect.h - height }); + } else { + // split vertically + // +--+---+ + // |__| | <-- b1 + // +--|---+ <-- b2 + if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: rect.h }); + if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: width, h: rect.h - height }); + } + + return { x: rect.x, y: rect.y, w: width, h: height }; +}; + +},{}],61:[function(require,module,exports){ +'use strict'; + +module.exports = checkMaxAngle; + +/** + * Labels placed around really sharp angles aren't readable. Check if any + * part of the potential label has a combined angle that is too big. + * + * @param {Array} line + * @param {Anchor} anchor The point on the line around which the label is anchored. + * @param {number} labelLength The length of the label in geometry units. + * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. + * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have. + * + * @returns {boolean} whether the label should be placed + * @private + */ +function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) { + + // horizontal labels always pass + if (anchor.segment === undefined) return true; + + var p = anchor; + var index = anchor.segment + 1; + var anchorDistance = 0; + + // move backwards along the line to the first segment the label appears on + while (anchorDistance > -labelLength / 2) { + index--; + + // there isn't enough room for the label after the beginning of the line + if (index < 0) return false; + + anchorDistance -= line[index].dist(p); + p = line[index]; + } + + anchorDistance += line[index].dist(line[index + 1]); + index++; + + // store recent corners and their total angle difference + var recentCorners = []; + var recentAngleDelta = 0; + + // move forwards by the length of the label and check angles along the way + while (anchorDistance < labelLength / 2) { + var prev = line[index - 1]; + var current = line[index]; + var next = line[index + 1]; + + // there isn't enough room for the label before the end of the line + if (!next) return false; + + var angleDelta = prev.angleTo(current) - current.angleTo(next); + // restrict angle to -pi..pi range + angleDelta = ((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI; + + recentCorners.push({ + distance: anchorDistance, + angleDelta: angleDelta + }); + recentAngleDelta += angleDelta; + + // remove corners that are far enough away from the list of recent anchors + while (anchorDistance - recentCorners[0].distance > windowSize) { + recentAngleDelta -= recentCorners.shift().angleDelta; + } + + // the sum of angles within the window area exceeds the maximum allowed value. check fails. + if (Math.abs(recentAngleDelta) > maxAngle) return false; + + index++; + anchorDistance += current.dist(next); + } + + // no part of the line had an angle greater than the maximum allowed. check passes. + return true; +} + +},{}],62:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = clipLine; + +/** + * Returns the part of a multiline that intersects with the provided rectangular box. + * + * @param {Array>} lines + * @param {number} x1 the left edge of the box + * @param {number} y1 the top edge of the box + * @param {number} x2 the right edge of the box + * @param {number} y2 the bottom edge of the box + * @returns {Array>} lines + * @private + */ +function clipLine(lines, x1, y1, x2, y2) { + var clippedLines = []; + + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + var clippedLine; + + for (var i = 0; i < line.length - 1; i++) { + var p0 = line[i]; + var p1 = line[i + 1]; + + + if (p0.x < x1 && p1.x < x1) { + continue; + } else if (p0.x < x1) { + p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x))); + } else if (p1.x < x1) { + p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x))); + } + + if (p0.y < y1 && p1.y < y1) { + continue; + } else if (p0.y < y1) { + p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1); + } else if (p1.y < y1) { + p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1); + } + + if (p0.x >= x2 && p1.x >= x2) { + continue; + } else if (p0.x >= x2) { + p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x))); + } else if (p1.x >= x2) { + p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x))); + } + + if (p0.y >= y2 && p1.y >= y2) { + continue; + } else if (p0.y >= y2) { + p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2); + } else if (p1.y >= y2) { + p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2); + } + + if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { + clippedLine = [p0]; + clippedLines.push(clippedLine); + } + + clippedLine.push(p1); + } + } + + return clippedLines; +} + +},{"point-geometry":134}],63:[function(require,module,exports){ +'use strict'; + +module.exports = CollisionBox; + +/** + * A collision box represents an area of the map that that is covered by a + * label. CollisionFeature uses one or more of these collision boxes to + * represent all the area covered by a single label. They are used to + * prevent collisions between labels. + * + * A collision box actually represents a 3d volume. The first two dimensions, + * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`. + * The third dimension, zoom, is limited by `maxScale` which determines + * how far in the z dimensions the box extends. + * + * As you zoom in on a map, all points on the map get further and further apart + * but labels stay roughly the same size. Labels cover less real world area on + * the map at higher zoom levels than they do at lower zoom levels. This is why + * areas are are represented with an anchor point and offsets from that point + * instead of just using four absolute points. + * + * Line labels are represented by a set of these boxes spaced out along a line. + * When you zoom in, line labels cover less real world distance along the line + * than they used to. Collision boxes near the edges that used to cover label + * no longer do. If a box doesn't cover the label anymore it should be ignored + * when doing collision checks. `maxScale` is how much you can scale the map + * before the label isn't within the box anymore. + * For example + * lower zoom: + * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png + * slightly higher zoom: + * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png + * In the zoomed in image the two grey boxes on either side don't cover the + * label anymore. Their maxScale is smaller than the current scale. + * + * + * @class CollisionBox + * @param {Point} anchorPoint The anchor point the box is centered around. + * @param {number} x1 The distance from the anchor to the left edge. + * @param {number} y1 The distance from the anchor to the top edge. + * @param {number} x2 The distance from the anchor to the right edge. + * @param {number} y2 The distance from the anchor to the bottom edge. + * @param {number} maxScale The maximum scale this box can block other boxes at. + * @private + */ +function CollisionBox(anchorPoint, x1, y1, x2, y2, maxScale) { + // the box is centered around the anchor point + this.anchorPoint = anchorPoint; + + // distances to the edges from the anchor + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + + // the box is only valid for scales < maxScale. + // The box does not block other boxes at scales >= maxScale; + this.maxScale = maxScale; + + // the scale at which the label can first be shown + this.placementScale = 0; + + // rotated and scaled bbox used for indexing + this[0] = this[1] = this[2] = this[3] = 0; +} + +},{}],64:[function(require,module,exports){ +'use strict'; + +var CollisionBox = require('./collision_box'); +var Point = require('point-geometry'); + +module.exports = CollisionFeature; + +/** + * A CollisionFeature represents the area of the tile covered by a single label. + * It is used with CollisionTile to check if the label overlaps with any + * previous labels. A CollisionFeature is mostly just a set of CollisionBox + * objects. + * + * @class CollisionFeature + * @param {Array} line The geometry the label is placed on. + * @param {Anchor} anchor The point along the line around which the label is anchored. + * @param {Object} shaped The text or icon shaping results. + * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units. + * @param {number} padding The amount of padding to add around the label edges. + * @param {boolean} alignLine Whether the label is aligned with the line or the viewport. + * + * @private + */ +function CollisionFeature(line, anchor, shaped, boxScale, padding, alignLine) { + + var y1 = shaped.top * boxScale - padding; + var y2 = shaped.bottom * boxScale + padding; + var x1 = shaped.left * boxScale - padding; + var x2 = shaped.right * boxScale + padding; + + this.boxes = []; + + if (alignLine) { + + var height = y2 - y1; + var length = x2 - x1; + + if (height <= 0) return; + + // set minimum box height to avoid very many small labels + height = Math.max(10 * boxScale, height); + + this._addLineCollisionBoxes(line, anchor, length, height); + + } else { + this.boxes.push(new CollisionBox(new Point(anchor.x, anchor.y), x1, y1, x2, y2, Infinity)); + } +} + +/** + * Create a set of CollisionBox objects for a line. + * + * @param {Array} line + * @param {Anchor} anchor + * @param {number} labelLength The length of the label in geometry units. + * @param {number} boxSize The size of the collision boxes that will be created. + * + * @private + */ +CollisionFeature.prototype._addLineCollisionBoxes = function(line, anchor, labelLength, boxSize) { + var step = boxSize / 2; + var nBoxes = Math.floor(labelLength / step); + + // offset the center of the first box by half a box so that the edge of the + // box is at the edge of the label. + var firstBoxOffset = -boxSize / 2; + + var bboxes = this.boxes; + + var p = anchor; + var index = anchor.segment + 1; + var anchorDistance = firstBoxOffset; + + // move backwards along the line to the first segment the label appears on + do { + index--; + + // there isn't enough room for the label after the beginning of the line + // checkMaxAngle should have already caught this + if (index < 0) return bboxes; + + anchorDistance -= line[index].dist(p); + p = line[index]; + } while (anchorDistance > -labelLength / 2); + + var segmentLength = line[index].dist(line[index + 1]); + + for (var i = 0; i < nBoxes; i++) { + // the distance the box will be from the anchor + var boxDistanceToAnchor = -labelLength / 2 + i * step; + + // the box is not on the current segment. Move to the next segment. + while (anchorDistance + segmentLength < boxDistanceToAnchor) { + anchorDistance += segmentLength; + index++; + + // There isn't enough room before the end of the line. + if (index + 1 >= line.length) return bboxes; + + segmentLength = line[index].dist(line[index + 1]); + } + + // the distance the box will be from the beginning of the segment + var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; + + var p0 = line[index]; + var p1 = line[index + 1]; + var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0); + + var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0); + var maxScale = labelLength / 2 / distanceToInnerEdge; + + bboxes.push(new CollisionBox(boxAnchorPoint, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale)); + } + + return bboxes; +}; + +},{"./collision_box":63,"point-geometry":134}],65:[function(require,module,exports){ +'use strict'; + +var rbush = require('rbush'); + +module.exports = CollisionTile; + +/** + * A collision tile used to prevent symbols from overlapping. It keep tracks of + * where previous symbols have been placed and is used to check if a new + * symbol overlaps with any previously added symbols. + * + * @class CollisionTile + * @param {number} angle + * @param {number} pitch + * @private + */ +function CollisionTile(angle, pitch) { + this.tree = rbush(); + this.angle = angle; + + var sin = Math.sin(angle), + cos = Math.cos(angle); + this.rotationMatrix = [cos, -sin, sin, cos]; + + // Stretch boxes in y direction to account for the map tilt. + this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI); + + // The amount the map is squished depends on the y position. + // Sort of account for this by making all boxes a bit bigger. + this.yStretch = Math.pow(this.yStretch, 1.3); +} + +CollisionTile.prototype.minScale = 0.25; +CollisionTile.prototype.maxScale = 2; + + +/** + * Find the scale at which the collisionFeature can be shown without + * overlapping with other features. + * + * @param {CollisionFeature} collisionFeature + * @returns {number} placementScale + * @private + */ +CollisionTile.prototype.placeCollisionFeature = function(collisionFeature) { + + var minPlacementScale = this.minScale; + var rotationMatrix = this.rotationMatrix; + var yStretch = this.yStretch; + + for (var b = 0; b < collisionFeature.boxes.length; b++) { + + var box = collisionFeature.boxes[b]; + + var anchorPoint = box.anchorPoint.matMult(rotationMatrix); + var x = anchorPoint.x; + var y = anchorPoint.y; + + box[0] = x + box.x1; + box[1] = y + box.y1 * yStretch; + box[2] = x + box.x2; + box[3] = y + box.y2 * yStretch; + + var blockingBoxes = this.tree.search(box); + + for (var i = 0; i < blockingBoxes.length; i++) { + var blocking = blockingBoxes[i]; + var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix); + + // Find the lowest scale at which the two boxes can fit side by side without overlapping. + // Original algorithm: + var s1 = (blocking.x1 - box.x2) / (x - blockingAnchorPoint.x); // scale at which new box is to the left of old box + var s2 = (blocking.x2 - box.x1) / (x - blockingAnchorPoint.x); // scale at which new box is to the right of old box + var s3 = (blocking.y1 - box.y2) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the top of old box + var s4 = (blocking.y2 - box.y1) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the bottom of old box + + if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1; + if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1; + + var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4)); + + if (collisionFreeScale > blocking.maxScale) { + // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it, + // so unblock the new box at the scale that the old box disappears. + collisionFreeScale = blocking.maxScale; + } + + if (collisionFreeScale > box.maxScale) { + // If the box can only be shown after it is visible, then the box can never be shown. + // But the label can be shown after this box is not visible. + collisionFreeScale = box.maxScale; + } + + if (collisionFreeScale > minPlacementScale && + collisionFreeScale >= blocking.placementScale) { + // If this collision occurs at a lower scale than previously found collisions + // and the collision occurs while the other label is visible + + // this this is the lowest scale at which the label won't collide with anything + minPlacementScale = collisionFreeScale; + } + + if (minPlacementScale >= this.maxScale) return minPlacementScale; + } + } + + return minPlacementScale; +}; + +/** + * Remember this collisionFeature and what scale it was placed at to block + * later features from overlapping with it. + * + * @param {CollisionFeature} collisionFeature + * @param {number} minPlacementScale + * @private + */ +CollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale) { + + var boxes = collisionFeature.boxes; + for (var k = 0; k < boxes.length; k++) { + boxes[k].placementScale = minPlacementScale; + } + + if (minPlacementScale < this.maxScale) { + this.tree.load(boxes); + } +}; + +},{"rbush":135}],66:[function(require,module,exports){ +'use strict'; + +var interpolate = require('../util/interpolate'); +var Anchor = require('../symbol/anchor'); +var checkMaxAngle = require('./check_max_angle'); + +module.exports = getAnchors; + +function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling) { + + // Resample a line to get anchor points for labels and check that each + // potential label passes text-max-angle check and has enough froom to fit + // on the line. + + var angleWindowSize = shapedText ? + 3 / 5 * glyphSize * boxScale : + 0; + + var labelLength = Math.max( + shapedText ? shapedText.right - shapedText.left : 0, + shapedIcon ? shapedIcon.right - shapedIcon.left : 0); + + // Is the line continued from outside the tile boundary? + if (line[0].x === 0 || line[0].x === 4096 || line[0].y === 0 || line[0].y === 4096) { + var continuedLine = true; + } + + // Is the label long, relative to the spacing? + // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. + if (spacing - labelLength * boxScale < spacing / 4) { + spacing = labelLength * boxScale + spacing / 4; + } + + // Offset the first anchor by: + // Either half the label length plus a fixed extra offset if the line is not continued + // Or half the spacing if the line is continued. + + // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. + var fixedExtraOffset = glyphSize * 2; + + var offset = !continuedLine ? + ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : + (spacing / 2 * overscaling) % spacing; + + return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, continuedLine, false); +} + + +function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, placeAtMiddle) { + + var distance = 0, + markedDistance = offset - spacing; + + var anchors = []; + + for (var i = 0; i < line.length - 1; i++) { + + var a = line[i], + b = line[i + 1]; + + var segmentDist = a.dist(b), + angle = b.angleTo(a); + + while (markedDistance + spacing < distance + segmentDist) { + markedDistance += spacing; + + var t = (markedDistance - distance) / segmentDist, + x = interpolate(a.x, b.x, t), + y = interpolate(a.y, b.y, t); + + if (x >= 0 && x < 4096 && y >= 0 && y < 4096) { + x = Math.round(x); + y = Math.round(y); + var anchor = new Anchor(x, y, angle, i); + + if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { + anchors.push(anchor); + } + } + } + + distance += segmentDist; + } + + if (!placeAtMiddle && !anchors.length && !continuedLine) { + // The first attempt at finding anchors at which labels can be placed failed. + // Try again, but this time just try placing one anchor at the middle of the line. + // This has the most effect for short lines in overscaled tiles, since the + // initial offset used in overscaled tiles is calculated to align labels with positions in + // parent tiles instead of placing the label as close to the beginning as possible. + anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, true); + } + + return anchors; +} + +},{"../symbol/anchor":59,"../util/interpolate":99,"./check_max_angle":61}],67:[function(require,module,exports){ +'use strict'; + +var BinPack = require('./bin_pack'); + +module.exports = GlyphAtlas; +function GlyphAtlas(width, height) { + this.width = width; + this.height = height; + + this.bin = new BinPack(width, height); + this.index = {}; + this.ids = {}; + this.data = new Uint8Array(width * height); +} + +GlyphAtlas.prototype = { + get debug() { + return 'canvas' in this; + }, + set debug(value) { + if (value && !this.canvas) { + this.canvas = document.createElement('canvas'); + this.canvas.width = this.width; + this.canvas.height = this.height; + document.body.appendChild(this.canvas); + this.ctx = this.canvas.getContext('2d'); + } else if (!value && this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + delete this.ctx; + delete this.canvas; + } + } +}; + +GlyphAtlas.prototype.getGlyphs = function() { + var glyphs = {}, + split, + name, + id; + + for (var key in this.ids) { + split = key.split('#'); + name = split[0]; + id = split[1]; + + if (!glyphs[name]) glyphs[name] = []; + glyphs[name].push(id); + } + + return glyphs; +}; + +GlyphAtlas.prototype.getRects = function() { + var rects = {}, + split, + name, + id; + + for (var key in this.ids) { + split = key.split('#'); + name = split[0]; + id = split[1]; + + if (!rects[name]) rects[name] = {}; + rects[name][id] = this.index[key]; + } + + return rects; +}; + +GlyphAtlas.prototype.removeGlyphs = function(id) { + for (var key in this.ids) { + + var ids = this.ids[key]; + + var pos = ids.indexOf(id); + if (pos >= 0) ids.splice(pos, 1); + this.ids[key] = ids; + + if (!ids.length) { + var rect = this.index[key]; + + var target = this.data; + for (var y = 0; y < rect.h; y++) { + var y1 = this.width * (rect.y + y) + rect.x; + for (var x = 0; x < rect.w; x++) { + target[y1 + x] = 0; + } + } + + this.dirty = true; + + this.bin.release(rect); + + delete this.index[key]; + delete this.ids[key]; + } + } + + + this.updateTexture(this.gl); +}; + +GlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) { + if (!glyph) { + // console.warn('missing glyph', code, String.fromCharCode(code)); + return null; + } + var key = name + "#" + glyph.id; + + // The glyph is already in this texture. + if (this.index[key]) { + if (this.ids[key].indexOf(id) < 0) { + this.ids[key].push(id); + } + return this.index[key]; + } + + // The glyph bitmap has zero width. + if (!glyph.bitmap) { + return null; + } + + var bufferedWidth = glyph.width + buffer * 2; + var bufferedHeight = glyph.height + buffer * 2; + + // Add a 1px border around every image. + var padding = 1; + var packWidth = bufferedWidth + 2 * padding; + var packHeight = bufferedHeight + 2 * padding; + + // Increase to next number divisible by 4, but at least 1. + // This is so we can scale down the texture coordinates and pack them + // into 2 bytes rather than 4 bytes. + packWidth += (4 - packWidth % 4); + packHeight += (4 - packHeight % 4); + + var rect = this.bin.allocate(packWidth, packHeight); + if (rect.x < 0) { + console.warn('glyph bitmap overflow'); + return { glyph: glyph, rect: null }; + } + + this.index[key] = rect; + this.ids[key] = [id]; + + var target = this.data; + var source = glyph.bitmap; + for (var y = 0; y < bufferedHeight; y++) { + var y1 = this.width * (rect.y + y + padding) + rect.x + padding; + var y2 = bufferedWidth * y; + for (var x = 0; x < bufferedWidth; x++) { + target[y1 + x] = source[y2 + x]; + } + } + + this.dirty = true; + + return rect; +}; + +GlyphAtlas.prototype.bind = function(gl) { + this.gl = gl; + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null); + + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } +}; + +GlyphAtlas.prototype.updateTexture = function(gl) { + this.bind(gl); + if (this.dirty) { + + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); + + // DEBUG + if (this.ctx) { + var data = this.ctx.getImageData(0, 0, this.width, this.height); + for (var i = 0, j = 0; i < this.data.length; i++, j += 4) { + data.data[j] = this.data[i]; + data.data[j + 1] = this.data[i]; + data.data[j + 2] = this.data[i]; + data.data[j + 3] = 255; + } + this.ctx.putImageData(data, 0, 0); + + this.ctx.strokeStyle = 'red'; + for (var k = 0; k < this.bin.free.length; k++) { + var free = this.bin.free[k]; + this.ctx.strokeRect(free.x, free.y, free.w, free.h); + } + } + // END DEBUG + + this.dirty = false; + } +}; + +},{"./bin_pack":60}],68:[function(require,module,exports){ +'use strict'; + +var normalizeURL = require('../util/mapbox').normalizeGlyphsURL; +var getArrayBuffer = require('../util/ajax').getArrayBuffer; +var Glyphs = require('../util/glyphs'); +var Protobuf = require('pbf'); + +module.exports = GlyphSource; + +/** + * A glyph source has a URL from which to load new glyphs and owns a GlyphAtlas + * that stores currently-loaded glyphs. + * + * @param {string} url glyph template url + * @param {Object} glyphAtlas glyph atlas object + * @private + */ +function GlyphSource(url, glyphAtlas) { + this.url = url && normalizeURL(url); + this.glyphAtlas = glyphAtlas; + this.stacks = []; + this.loading = {}; +} + +GlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) { + + if (this.stacks[fontstack] === undefined) this.stacks[fontstack] = {}; + + var glyphs = {}; + + var stack = this.stacks[fontstack]; + var glyphAtlas = this.glyphAtlas; + + // the number of pixels the sdf bitmaps are padded by + var buffer = 3; + + var missing = {}; + var remaining = 0; + var range; + + for (var i = 0; i < glyphIDs.length; i++) { + var glyphID = glyphIDs[i]; + range = Math.floor(glyphID / 256); + + if (stack[range]) { + var glyph = stack[range].glyphs[glyphID]; + var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer); + if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); + } else { + if (missing[range] === undefined) { + missing[range] = []; + remaining++; + } + missing[range].push(glyphID); + } + } + + if (!remaining) callback(undefined, glyphs); + + var onRangeLoaded = function(err, range, data) { + // TODO not be silent about errors + if (!err) { + var stack = this.stacks[fontstack][range] = data.stacks[0]; + for (var i = 0; i < missing[range].length; i++) { + var glyphID = missing[range][i]; + var glyph = stack.glyphs[glyphID]; + var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer); + if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); + } + } + remaining--; + if (!remaining) callback(undefined, glyphs); + }.bind(this); + + for (var r in missing) { + this.loadRange(fontstack, r, onRangeLoaded); + } +}; + +// A simplified representation of the glyph containing only the properties needed for shaping. +function SimpleGlyph(glyph, rect, buffer) { + var padding = 1; + this.advance = glyph.advance; + this.left = glyph.left - buffer - padding; + this.top = glyph.top + buffer + padding; + this.rect = rect; +} + +GlyphSource.prototype.loadRange = function(fontstack, range, callback) { + + if (range * 256 > 65535) return callback('gyphs > 65535 not supported'); + + if (this.loading[fontstack] === undefined) this.loading[fontstack] = {}; + var loading = this.loading[fontstack]; + + if (loading[range]) { + loading[range].push(callback); + } else { + loading[range] = [callback]; + + var rangeName = (range * 256) + '-' + (range * 256 + 255); + var url = glyphUrl(fontstack, rangeName, this.url); + + getArrayBuffer(url, function(err, data) { + var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data))); + for (var i = 0; i < loading[range].length; i++) { + loading[range][i](err, range, glyphs); + } + delete loading[range]; + }); + } +}; + +/** + * Use CNAME sharding to load a specific glyph range over a randomized + * but consistent subdomain. + * @param {string} fontstack comma-joined fonts + * @param {string} range comma-joined range + * @param {url} url templated url + * @param {string} [subdomains=abc] subdomains as a string where each letter is one. + * @returns {string} a url to load that section of glyphs + * @private + */ +function glyphUrl(fontstack, range, url, subdomains) { + subdomains = subdomains || 'abc'; + + return url + .replace('{s}', subdomains[fontstack.length % subdomains.length]) + .replace('{fontstack}', fontstack) + .replace('{range}', range); +} + +},{"../util/ajax":91,"../util/glyphs":98,"../util/mapbox":100,"pbf":132}],69:[function(require,module,exports){ +'use strict'; + +module.exports = function (features, textFeatures, geometries) { + + var leftIndex = {}, + rightIndex = {}, + mergedFeatures = [], + mergedGeom = [], + mergedTexts = [], + mergedIndex = 0, + k; + + function add(k) { + mergedFeatures.push(features[k]); + mergedGeom.push(geometries[k]); + mergedTexts.push(textFeatures[k]); + mergedIndex++; + } + + function mergeFromRight(leftKey, rightKey, geom) { + var i = rightIndex[leftKey]; + delete rightIndex[leftKey]; + rightIndex[rightKey] = i; + + mergedGeom[i][0].pop(); + mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]); + return i; + } + + function mergeFromLeft(leftKey, rightKey, geom) { + var i = leftIndex[rightKey]; + delete leftIndex[rightKey]; + leftIndex[leftKey] = i; + + mergedGeom[i][0].shift(); + mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]); + return i; + } + + function getKey(text, geom, onRight) { + var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; + return text + ':' + point.x + ':' + point.y; + } + + for (k = 0; k < features.length; k++) { + var geom = geometries[k], + text = textFeatures[k]; + + if (!text) { + add(k); + continue; + } + + var leftKey = getKey(text, geom), + rightKey = getKey(text, geom, true); + + if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { + // found lines with the same text adjacent to both ends of the current line, merge all three + var j = mergeFromLeft(leftKey, rightKey, geom); + var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]); + + delete leftIndex[leftKey]; + delete rightIndex[rightKey]; + + rightIndex[getKey(text, mergedGeom[i], true)] = i; + mergedGeom[j] = null; + + } else if (leftKey in rightIndex) { + // found mergeable line adjacent to the start of the current line, merge + mergeFromRight(leftKey, rightKey, geom); + + } else if (rightKey in leftIndex) { + // found mergeable line adjacent to the end of the current line, merge + mergeFromLeft(leftKey, rightKey, geom); + + } else { + // no adjacent lines, add as a new item + add(k); + leftIndex[leftKey] = mergedIndex - 1; + rightIndex[rightKey] = mergedIndex - 1; + } + } + + return { + features: mergedFeatures, + textFeatures: mergedTexts, + geometries: mergedGeom + }; +}; + +},{}],70:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = { + getIconQuads: getIconQuads, + getGlyphQuads: getGlyphQuads +}; + +var minScale = 0.5; // underscale by 1 zoom level + +/** + * A textured quad for rendering a single icon or glyph. + * + * The zoom range the glyph can be shown is defined by minScale and maxScale. + * + * @param {Point} anchorPoint the point the symbol is anchored around + * @param {Point} tl The offset of the top left corner from the anchor. + * @param {Point} tr The offset of the top right corner from the anchor. + * @param {Point} bl The offset of the bottom left corner from the anchor. + * @param {Point} br The offset of the bottom right corner from the anchor. + * @param {Object} tex The texture coordinates. + * @param {number} angle The angle of the label at it's center, not the angle of this quad. + * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at. + * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at. + * + * @class SymbolQuad + * @private + */ +function SymbolQuad(anchorPoint, tl, tr, bl, br, tex, angle, minScale, maxScale) { + this.anchorPoint = anchorPoint; + this.tl = tl; + this.tr = tr; + this.bl = bl; + this.br = br; + this.tex = tex; + this.angle = angle; + this.minScale = minScale; + this.maxScale = maxScale; +} + +/** + * Create the quads used for rendering an icon. + * + * @param {Anchor} anchor + * @param {PositionedIcon} shapedIcon + * @param {number} boxScale A magic number for converting glyph metric units to geometry units. + * @param {Array>} line + * @param {LayoutProperties} layout + * @param {boolean} alongLine Whether the icon should be placed along the line. + * @returns {Array} + * @private + */ +function getIconQuads(anchor, shapedIcon, boxScale, line, layout, alongLine) { + + var rect = shapedIcon.image.rect; + + var border = 1; + var left = shapedIcon.left - border; + var right = left + rect.w; + var top = shapedIcon.top - border; + var bottom = top + rect.h; + var tl = new Point(left, top); + var tr = new Point(right, top); + var br = new Point(right, bottom); + var bl = new Point(left, bottom); + + var angle = layout['icon-rotate'] * Math.PI / 180; + if (alongLine) { + var prev = line[anchor.segment]; + angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x); + } + + if (angle) { + var sin = Math.sin(angle), + cos = Math.cos(angle), + matrix = [cos, -sin, sin, cos]; + + tl = tl.matMult(matrix); + tr = tr.matMult(matrix); + bl = bl.matMult(matrix); + br = br.matMult(matrix); + } + + return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, minScale, Infinity)]; +} + +/** + * Create the quads used for rendering a text label. + * + * @param {Anchor} anchor + * @param {Shaping} shaping + * @param {number} boxScale A magic number for converting from glyph metric units to geometry units. + * @param {Array>} line + * @param {LayoutProperties} layout + * @param {boolean} alongLine Whether the label should be placed along the line. + * @returns {Array} + * @private + */ +function getGlyphQuads(anchor, shaping, boxScale, line, layout, alongLine) { + + var textRotate = layout['text-rotate'] * Math.PI / 180; + var keepUpright = layout['text-keep-upright']; + + var positionedGlyphs = shaping.positionedGlyphs; + var quads = []; + + for (var k = 0; k < positionedGlyphs.length; k++) { + var positionedGlyph = positionedGlyphs[k]; + var glyph = positionedGlyph.glyph; + var rect = glyph.rect; + + if (!rect) continue; + + var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale; + + var glyphInstances; + var labelMinScale = minScale; + if (alongLine) { + glyphInstances = []; + labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true); + if (keepUpright) { + labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false)); + } + + } else { + glyphInstances = [{ + anchorPoint: new Point(anchor.x, anchor.y), + offset: 0, + angle: 0, + maxScale: Infinity, + minScale: minScale + }]; + } + + var x1 = positionedGlyph.x + glyph.left, + y1 = positionedGlyph.y - glyph.top, + x2 = x1 + rect.w, + y2 = y1 + rect.h, + + otl = new Point(x1, y1), + otr = new Point(x2, y1), + obl = new Point(x1, y2), + obr = new Point(x2, y2); + + for (var i = 0; i < glyphInstances.length; i++) { + + var instance = glyphInstances[i], + tl = otl, + tr = otr, + bl = obl, + br = obr, + angle = instance.angle + textRotate; + + if (angle) { + var sin = Math.sin(angle), + cos = Math.cos(angle), + matrix = [cos, -sin, sin, cos]; + + tl = tl.matMult(matrix); + tr = tr.matMult(matrix); + bl = bl.matMult(matrix); + br = br.matMult(matrix); + } + + // Prevent label from extending past the end of the line + var glyphMinScale = Math.max(instance.minScale, labelMinScale); + + var glyphAngle = (anchor.angle + textRotate + instance.offset + 2 * Math.PI) % (2 * Math.PI); + quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, glyphAngle, glyphMinScale, instance.maxScale)); + + } + } + + return quads; +} + +/** + * We can only render glyph quads that slide along a straight line. To draw + * curved lines we need an instance of a glyph for each segment it appears on. + * This creates all the instances of a glyph that are necessary to render a label. + * + * We need a + * @param {Array} glyphInstances An empty array that glyphInstances are added to. + * @param {Anchor} anchor + * @param {number} offset The glyph's offset from the center of the label. + * @param {Array} line + * @param {number} segment The index of the segment of the line on which the anchor exists. + * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier. + * + * @returns {Array} glyphInstances + * @private + */ +function getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) { + var upsideDown = !forward; + + if (offset < 0) forward = !forward; + + if (forward) segment++; + + var newAnchorPoint = new Point(anchor.x, anchor.y); + var end = line[segment]; + var prevScale = Infinity; + + offset = Math.abs(offset); + + var placementScale = minScale; + + while (true) { + var distance = newAnchorPoint.dist(end); + var scale = offset / distance; + + // Get the angle of the line segment + var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x); + if (!forward) angle += Math.PI; + if (upsideDown) angle += Math.PI; + + glyphs.push({ + anchorPoint: newAnchorPoint, + offset: upsideDown ? Math.PI : 0, + minScale: scale, + maxScale: prevScale, + angle: (angle + 2 * Math.PI) % (2 * Math.PI) + }); + + if (scale <= placementScale) break; + + newAnchorPoint = end; + + // skip duplicate nodes + while (newAnchorPoint.equals(end)) { + segment += forward ? 1 : -1; + end = line[segment]; + if (!end) { + return scale; + } + } + + var unit = end.sub(newAnchorPoint)._unit(); + newAnchorPoint = newAnchorPoint.sub(unit._mult(distance)); + + prevScale = scale; + } + + return placementScale; +} + +},{"point-geometry":134}],71:[function(require,module,exports){ +'use strict'; + +var resolveTokens = require('../util/token'); + +module.exports = resolveIcons; + +// For an array of features determine what icons need to be loaded. +function resolveIcons(features, layoutProperties) { + var icons = []; + + for (var i = 0, fl = features.length; i < fl; i++) { + var text = resolveTokens(features[i].properties, layoutProperties['icon-image']); + if (!text) continue; + + if (icons.indexOf(text) < 0) { + icons.push(text); + } + } + + return icons; +} + +},{"../util/token":102}],72:[function(require,module,exports){ +'use strict'; + +var resolveTokens = require('../util/token'); + +module.exports = resolveText; + +/** + * For an array of features determine what glyph ranges need to be loaded + * and apply any text preprocessing. The remaining users of text should + * use the `textFeatures` key returned by this function rather than accessing + * feature text directly. + * @private + */ +function resolveText(features, layoutProperties, glyphs) { + var textFeatures = []; + var codepoints = []; + + for (var i = 0, fl = features.length; i < fl; i++) { + var text = resolveTokens(features[i].properties, layoutProperties['text-field']); + if (!text) { + textFeatures[i] = null; + continue; + } + text = text.toString(); + + var transform = layoutProperties['text-transform']; + if (transform === 'uppercase') { + text = text.toLocaleUpperCase(); + } else if (transform === 'lowercase') { + text = text.toLocaleLowerCase(); + } + + for (var j = 0, jl = text.length; j < jl; j++) { + codepoints.push(text.charCodeAt(j)); + } + + // Track indexes of features with text. + textFeatures[i] = text; + } + + // get a list of unique codepoints we are missing + codepoints = uniq(codepoints, glyphs); + + return { + textFeatures: textFeatures, + codepoints: codepoints + }; +} + +function uniq(ids, alreadyHave) { + var u = []; + var last; + ids.sort(sortNumbers); + for (var i = 0; i < ids.length; i++) { + if (ids[i] !== last) { + last = ids[i]; + if (!alreadyHave[last]) u.push(ids[i]); + } + } + return u; +} + +function sortNumbers(a, b) { + return a - b; +} + +},{"../util/token":102}],73:[function(require,module,exports){ +'use strict'; + +module.exports = { + shapeText: shapeText, + shapeIcon: shapeIcon +}; + + +// The position of a glyph relative to the text's anchor point. +function PositionedGlyph(codePoint, x, y, glyph) { + this.codePoint = codePoint; + this.x = x; + this.y = y; + this.glyph = glyph; +} + +// A collection of positioned glyphs and some metadata +function Shaping(positionedGlyphs, text, top, bottom, left, right) { + this.positionedGlyphs = positionedGlyphs; + this.text = text; + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; +} + +function shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) { + + var positionedGlyphs = []; + var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]); + + // the y offset *should* be part of the font metadata + var yOffset = -17; + + var x = translate[0]; + var y = translate[1] + yOffset; + + for (var i = 0; i < text.length; i++) { + var codePoint = text.charCodeAt(i); + var glyph = glyphs[codePoint]; + + if (!glyph) continue; + + positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph)); + x += glyph.advance + spacing; + } + + if (!positionedGlyphs.length) return false; + + linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify); + + return shaping; +} + +var breakable = { 32: true }; // Currently only breaks at regular spaces + +function linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify) { + var lastSafeBreak = null; + + var lengthBeforeCurrentLine = 0; + var lineStartIndex = 0; + var line = 0; + + var maxLineLength = 0; + + var positionedGlyphs = shaping.positionedGlyphs; + + if (maxWidth) { + for (var i = 0; i < positionedGlyphs.length; i++) { + var positionedGlyph = positionedGlyphs[i]; + + positionedGlyph.x -= lengthBeforeCurrentLine; + positionedGlyph.y += lineHeight * line; + + if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) { + + var lineLength = positionedGlyphs[lastSafeBreak + 1].x; + maxLineLength = Math.max(lineLength, maxLineLength); + + for (var k = lastSafeBreak + 1; k <= i; k++) { + positionedGlyphs[k].y += lineHeight; + positionedGlyphs[k].x -= lineLength; + } + + if (justify) { + justifyLine(positionedGlyphs, glyphs, lineStartIndex, lastSafeBreak - 1, justify); + } + + lineStartIndex = lastSafeBreak + 1; + lastSafeBreak = null; + lengthBeforeCurrentLine += lineLength; + line++; + } + + if (breakable[positionedGlyph.codePoint]) { + lastSafeBreak = i; + } + } + } + + var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1]; + var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance; + maxLineLength = Math.max(maxLineLength, lastLineLength); + + var height = (line + 1) * lineHeight; + + justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify); + align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line); + + // Calculate the bounding box + shaping.top += -verticalAlign * height; + shaping.bottom = shaping.top + height; + shaping.left += -horizontalAlign * maxLineLength; + shaping.right = shaping.left + maxLineLength; +} + +function justifyLine(positionedGlyphs, glyphs, start, end, justify) { + var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance; + var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; + + for (var j = start; j <= end; j++) { + positionedGlyphs[j].x -= lineIndent; + } + +} + +function align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line) { + var shiftX = (justify - horizontalAlign) * maxLineLength; + var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight; + + for (var j = 0; j < positionedGlyphs.length; j++) { + positionedGlyphs[j].x += shiftX; + positionedGlyphs[j].y += shiftY; + } +} + + +function shapeIcon(image, layout) { + if (!image || !image.rect) return null; + + var dx = layout['icon-offset'][0]; + var dy = layout['icon-offset'][1]; + var x1 = dx - image.width / 2; + var x2 = x1 + image.width; + var y1 = dy - image.height / 2; + var y2 = y1 + image.height; + + return new PositionedIcon(image, y1, y2, x1, x2); +} + +function PositionedIcon(image, top, bottom, left, right) { + this.image = image; + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; +} + +},{}],74:[function(require,module,exports){ +'use strict'; + +var BinPack = require('./bin_pack'); + +module.exports = SpriteAtlas; +function SpriteAtlas(width, height) { + this.width = width; + this.height = height; + + this.bin = new BinPack(width, height); + this.images = {}; + this.data = false; + this.texture = 0; // WebGL ID + this.filter = 0; // WebGL ID + this.pixelRatio = 1; + this.dirty = true; +} + +SpriteAtlas.prototype = { + get debug() { + return 'canvas' in this; + }, + set debug(value) { + if (value && !this.canvas) { + this.canvas = document.createElement('canvas'); + this.canvas.width = this.width * this.pixelRatio; + this.canvas.height = this.height * this.pixelRatio; + this.canvas.style.width = this.width + 'px'; + this.canvas.style.width = this.width + 'px'; + document.body.appendChild(this.canvas); + this.ctx = this.canvas.getContext('2d'); + } else if (!value && this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + delete this.ctx; + delete this.canvas; + } + } +}; + +SpriteAtlas.prototype.resize = function(newRatio) { + if (this.pixelRatio === newRatio) return false; + + var oldRatio = this.pixelRatio; + this.pixelRatio = newRatio; + + if (this.canvas) { + this.canvas.width = this.width * this.pixelRatio; + this.canvas.height = this.height * this.pixelRatio; + } + + if (this.data) { + var oldData = this.data; + + this.data = false; + this.allocate(); + this.texture = false; + + var oldWidth = this.width * oldRatio; + var oldHeight = this.height * oldRatio; + var newWidth = this.width * newRatio; + var newHeight = this.height * newRatio; + + // Basic image scaling. TODO: Replace this with better image scaling. + var newImage = this.data; + var oldImage = oldData; + + for (var y = 0; y < newHeight; y++) { + var oldYOffset = Math.floor((y * oldHeight) / newHeight) * oldWidth; + var newYOffset = y * newWidth; + for (var x = 0; x < newWidth; x++) { + var oldX = Math.floor((x * oldWidth) / newWidth); + newImage[newYOffset + x] = oldImage[oldYOffset + oldX]; + } + } + + oldData = null; + this.dirty = true; + } + + return this.dirty; +}; + +function copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) { + var srcI = srcY * srcStride + srcX; + var dstI = dstY * dstStride + dstX; + var x, y; + + if (wrap) { + // add 1 pixel wrapped padding on each side of the image + dstI -= dstStride; + for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) { + for (x = -1; x <= width; x++) { + dst[dstI + x] = src[srcI + ((x + width) % width)]; + } + } + + } else { + for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) { + for (x = 0; x < width; x++) { + dst[dstI + x] = src[srcI + x]; + } + } + } +} + +SpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) { + + // Increase to next number divisible by 4, but at least 1. + // This is so we can scale down the texture coordinates and pack them + // into 2 bytes rather than 4 bytes. + // Pad icons to prevent them from polluting neighbours during linear interpolation + var padding = 2; + var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4); + var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4; + + // We have to allocate a new area in the bin, and store an empty image in it. + // Add a 1px border around every image. + var rect = this.bin.allocate(packWidth, packHeight); + if (rect.w === 0) { + return rect; + } + + rect.originalWidth = pixelWidth; + rect.originalHeight = pixelHeight; + + return rect; +}; + +SpriteAtlas.prototype.getImage = function(name, wrap) { + if (this.images[name]) { + return this.images[name]; + } + + if (!this.sprite) { + return null; + } + + var pos = this.sprite.getSpritePosition(name); + if (!pos.width || !pos.height) { + return null; + } + + var width = pos.width / pos.pixelRatio; + var height = pos.height / pos.pixelRatio; + var rect = this.allocateImage(width, height); + if (rect.w === 0) { + return rect; + } + + var image = new AtlasImage(rect, width, height, pos.sdf); + this.images[name] = image; + + this.copy(rect, pos, wrap); + + return image; +}; + + +SpriteAtlas.prototype.getPosition = function(name, repeating) { + var image = this.getImage(name, repeating); + var rect = image && image.rect; + + if (!rect) { + return null; + } + + // When the image is repeating, get the correct position of the image, rather than the + // one rounded up to 4 pixels. + var width = repeating ? image.width : rect.w; + var height = repeating ? image.height : rect.h; + var padding = 1; + + return { + size: [width, height], + tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height], + br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height] + }; +}; + + +SpriteAtlas.prototype.allocate = function() { + if (!this.data) { + var w = Math.floor(this.width * this.pixelRatio); + var h = Math.floor(this.height * this.pixelRatio); + this.data = new Uint32Array(w * h); + for (var i = 0; i < this.data.length; i++) { + this.data[i] = 0; + } + } +}; + + +SpriteAtlas.prototype.copy = function(dst, src, wrap) { + // if (!sprite->raster) return; + if (!this.sprite.img.data) return; + var srcImg = new Uint32Array(this.sprite.img.data.buffer); + + this.allocate(); + var dstImg = this.data; + + var padding = 1; + + copyBitmap( + /* source buffer */ srcImg, + /* source stride */ this.sprite.img.width, + /* source x */ src.x, + /* source y */ src.y, + /* dest buffer */ dstImg, + /* dest stride */ this.width * this.pixelRatio, + /* dest x */ (dst.x + padding) * this.pixelRatio, + /* dest y */ (dst.y + padding) * this.pixelRatio, + /* icon dimension */ src.width, + /* icon dimension */ src.height, + /* wrap */ wrap + ); + + this.dirty = true; +}; + +SpriteAtlas.prototype.setSprite = function(sprite) { + this.sprite = sprite; +}; + +SpriteAtlas.prototype.addIcons = function(icons, callback) { + for (var i = 0; i < icons.length; i++) { + this.getImage(icons[i]); + } + + callback(null, this.images); +}; + +SpriteAtlas.prototype.bind = function(gl, linear) { + var first = false; + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + first = true; + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } + + var filterVal = linear ? gl.LINEAR : gl.NEAREST; + if (filterVal !== this.filter) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal); + this.filter = filterVal; + } + + if (this.dirty) { + this.allocate(); + + if (first) { + gl.texImage2D( + gl.TEXTURE_2D, // enum target + 0, // ind level + gl.RGBA, // ind internalformat + this.width * this.pixelRatio, // GLsizei width + this.height * this.pixelRatio, // GLsizei height + 0, // ind border + gl.RGBA, // enum format + gl.UNSIGNED_BYTE, // enum type + new Uint8Array(this.data.buffer) // Object data + ); + } else { + gl.texSubImage2D( + gl.TEXTURE_2D, // enum target + 0, // int level + 0, // int xoffset + 0, // int yoffset + this.width * this.pixelRatio, // long width + this.height * this.pixelRatio, // long height + gl.RGBA, // enum format + gl.UNSIGNED_BYTE, // enum type + new Uint8Array(this.data.buffer) // Object pixels + ); + } + + this.dirty = false; + + // DEBUG + if (this.ctx) { + var data = this.ctx.getImageData(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio); + data.data.set(new Uint8ClampedArray(this.data.buffer)); + this.ctx.putImageData(data, 0, 0); + + this.ctx.strokeStyle = 'red'; + for (var k = 0; k < this.bin.free.length; k++) { + var free = this.bin.free[k]; + this.ctx.strokeRect(free.x * this.pixelRatio, free.y * this.pixelRatio, free.w * this.pixelRatio, free.h * this.pixelRatio); + } + } + // END DEBUG + } +}; + +function AtlasImage(rect, width, height, sdf) { + this.rect = rect; + this.width = width; + this.height = height; + this.sdf = sdf; +} + +},{"./bin_pack":60}],75:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var interpolate = require('../util/interpolate'); +var browser = require('../util/browser'); +var LatLng = require('../geo/lat_lng'); +var LatLngBounds = require('../geo/lat_lng_bounds'); +var Point = require('point-geometry'); + +/** + * Options common to Map#jumpTo, Map#easeTo, and Map#flyTo, controlling the destination + * location, zoom level, bearing and pitch. All properties are options; unspecified + * options will default to the current value for that property. + * + * @typedef {Object} CameraOptions + * @property {Array} center Latitude and longitude (passed as `[lat, lng]`) + * @property {number} zoom Map zoom level + * @property {number} bearing Map rotation bearing in degrees counter-clockwise from north + * @property {number} pitch The angle at which the camera is looking at the ground + */ + +/** + * Options common to map movement methods that involve animation, such as Map#panBy and + * Map#easeTo, controlling the duration of the animation and easing function. All properties + * are optional. + * + * @typedef {Object} AnimationOptions + * @property {number} duration Number in milliseconds + * @property {Function} easing + * @property {Array} offset point, origin of movement relative to map center + * @property {boolean} animate When set to false, no animation happens + */ + +var Camera = module.exports = function() {}; + +util.extend(Camera.prototype, /** @lends Map.prototype */{ + /** + * Get the current view geographical point. + * @returns {LatLng} + */ + getCenter: function() { return this.transform.center; }, + + /** + * Sets a map location. Equivalent to `jumpTo({center: center})`. + * + * @param {Array} center Latitude and longitude (passed as `[lat, lng]`) + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @example + * map.setCenter([-74, 38]); + */ + setCenter: function(center) { + this.jumpTo({center: center}); + return this; + }, + + /** + * Pan by a certain number of pixels + * + * @param {Array} offset [x, y] + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + panBy: function(offset, options) { + this.panTo(this.transform.center, util.extend({offset: Point.convert(offset).mult(-1)}, options)); + return this; + }, + + /** + * Pan to a certain location with easing + * + * @param {Object} latlng a `LatLng` object + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + panTo: function(latlng, options) { + this.stop(); + + latlng = LatLng.convert(latlng); + + options = util.extend({ + duration: 500, + easing: util.ease, + offset: [0, 0] + }, options); + + var tr = this.transform, + offset = Point.convert(options.offset).rotate(-tr.angle), + from = tr.point, + to = tr.project(latlng).sub(offset); + + if (!options.noMoveStart) { + this.fire('movestart'); + } + + this._ease(function(k) { + tr.center = tr.unproject(from.add(to.sub(from).mult(k))); + this.fire('move'); + }, function() { + this.fire('moveend'); + }, options); + + return this; + }, + + + /** + * Get the current zoom + * @returns {number} + */ + getZoom: function() { return this.transform.zoom; }, + + /** + * Sets a map zoom. Equivalent to `jumpTo({zoom: zoom})`. + * + * @param {number} zoom Map zoom level + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @example + * // zoom the map to 5 + * map.setZoom(5); + */ + setZoom: function(zoom) { + this.jumpTo({zoom: zoom}); + return this; + }, + + /** + * Zooms to a certain zoom level with easing. + * + * @param {number} zoom + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + zoomTo: function(zoom, options) { + this.stop(); + + options = util.extend({ + duration: 500 + }, options); + + options.easing = this._updateEasing(options.duration, zoom, options.easing); + + var tr = this.transform, + around = tr.center, + startZoom = tr.zoom; + + if (options.around) { + around = LatLng.convert(options.around); + } else if (options.offset) { + around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset))); + } + + if (options.animate === false) options.duration = 0; + + if (!this.zooming) { + this.zooming = true; + this.fire('movestart'); + } + + this._ease(function(k) { + tr.setZoomAround(interpolate(startZoom, zoom, k), around); + this.fire('move').fire('zoom'); + }, function() { + this.ease = null; + if (options.duration >= 200) { + this.zooming = false; + this.fire('moveend'); + } + }, options); + + if (options.duration < 200) { + clearTimeout(this._onZoomEnd); + this._onZoomEnd = setTimeout(function() { + this.zooming = false; + this.fire('moveend'); + }.bind(this), 200); + } + + return this; + }, + + /** + * Zoom in by 1 level + * + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + zoomIn: function(options) { + this.zoomTo(this.getZoom() + 1, options); + return this; + }, + + /** + * Zoom out by 1 level + * + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + zoomOut: function(options) { + this.zoomTo(this.getZoom() - 1, options); + return this; + }, + + + /** + * Get the current bearing in degrees + * @returns {number} + */ + getBearing: function() { return this.transform.bearing; }, + + /** + * Sets a map rotation. Equivalent to `jumpTo({bearing: bearing})`. + * + * @param {number} bearing Map rotation bearing in degrees counter-clockwise from north + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @example + * // rotate the map to 90 degrees + * map.setBearing(90); + */ + setBearing: function(bearing) { + this.jumpTo({bearing: bearing}); + return this; + }, + + /** + * Rotate bearing by a certain number of degrees with easing + * + * @param {number} bearing + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + rotateTo: function(bearing, options) { + this.stop(); + + options = util.extend({ + duration: 500, + easing: util.ease + }, options); + + var tr = this.transform, + start = this.getBearing(), + around = tr.center; + + if (options.around) { + around = LatLng.convert(options.around); + } else if (options.offset) { + around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset))); + } + + bearing = this._normalizeBearing(bearing, start); + + this.rotating = true; + this.fire('movestart'); + + this._ease(function(k) { + tr.setBearingAround(interpolate(start, bearing, k), around); + this.fire('move').fire('rotate'); + }, function() { + this.rotating = false; + this.fire('moveend'); + }, options); + + return this; + }, + + /** + * Sets map bearing to 0 (north) with easing + * + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + resetNorth: function(options) { + this.rotateTo(0, util.extend({duration: 1000}, options)); + return this; + }, + + /** + * Animates map bearing to 0 (north) if it's already close to it. + * + * @param {AnimationOptions} [options] + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + snapToNorth: function(options) { + if (Math.abs(this.getBearing()) < this.options.bearingSnap) { + return this.resetNorth(options); + } + return this; + }, + + /** + * Get the current angle in degrees + * @returns {number} + */ + getPitch: function() { return this.transform.pitch; }, + + /** + * Sets a map angle. Equivalent to `jumpTo({pitch: pitch})`. + * + * @param {number} pitch The angle at which the camera is looking at the ground + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + setPitch: function(pitch) { + this.jumpTo({pitch: pitch}); + return this; + }, + + + /** + * Zoom to contain certain geographical bounds + * + * @param {Array} bounds [[minLat, minLng], [maxLat, maxLng]] + * @param {Object} options + * @param {number} [options.speed=1.2] How fast animation occurs + * @param {number} [options.curve=1.42] How much zooming out occurs during animation + * @param {Function} options.easing + * @param {number} options.padding how much padding there is around the given bounds on each side in pixels + * @param {number} options.maxZoom + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + fitBounds: function(bounds, options) { + + options = util.extend({ + padding: 0, + offset: [0, 0], + maxZoom: Infinity + }, options); + + bounds = LatLngBounds.convert(bounds); + + var offset = Point.convert(options.offset), + tr = this.transform, + nw = tr.project(bounds.getNorthWest()), + se = tr.project(bounds.getSouthEast()), + size = se.sub(nw), + scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x, + scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y; + + options.center = tr.unproject(nw.add(se).div(2)); + options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); + options.bearing = 0; + + return options.linear ? + this.easeTo(options) : + this.flyTo(options); + }, + + /** + * Change any combination of center, zoom, bearing, and pitch, without + * a transition. The map will retain the current values for any options + * not included in `options`. + * + * @param {CameraOptions} options map view options + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + jumpTo: function(options) { + this.stop(); + + var tr = this.transform, + zoomChanged = false, + bearingChanged = false, + pitchChanged = false; + + if ('center' in options) { + tr.center = LatLng.convert(options.center); + } + + if ('zoom' in options && tr.zoom !== +options.zoom) { + zoomChanged = true; + tr.zoom = +options.zoom; + } + + if ('bearing' in options && tr.bearing !== +options.bearing) { + bearingChanged = true; + tr.bearing = +options.bearing; + } + + if ('pitch' in options && tr.pitch !== +options.pitch) { + pitchChanged = true; + tr.pitch = +options.pitch; + } + + this.fire('movestart') + .fire('move'); + + if (zoomChanged) { + this.fire('zoom'); + } + + if (bearingChanged) { + this.fire('rotate'); + } + + if (pitchChanged) { + this.fire('pitch'); + } + + return this.fire('moveend'); + }, + + /** + * Easing animation to a specified location/zoom/bearing + * + * @param {CameraOptions~AnimationOptions} options map view and animation options + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + easeTo: function(options) { + this.stop(); + + options = util.extend({ + offset: [0, 0], + duration: 500, + easing: util.ease + }, options); + + var tr = this.transform, + offset = Point.convert(options.offset).rotate(-tr.angle), + from = tr.point, + startZoom = this.getZoom(), + startBearing = this.getBearing(), + startPitch = this.getPitch(), + + zoom = 'zoom' in options ? +options.zoom : startZoom, + bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, + pitch = 'pitch' in options ? +options.pitch : startPitch, + + scale = tr.zoomScale(zoom - startZoom), + to = 'center' in options ? tr.project(LatLng.convert(options.center)).sub(offset.div(scale)) : from, + around = LatLng.convert(options.around); + + if (zoom !== startZoom) { + this.zooming = true; + } + if (startBearing !== bearing) { + this.rotating = true; + } + + if (this.zooming && !around) { + around = tr.pointLocation(tr.centerPoint.add(to.sub(from).div(1 - 1 / scale))); + } + + this.fire('movestart'); + + this._ease(function (k) { + if (this.zooming) { + tr.setZoomAround(interpolate(startZoom, zoom, k), around); + } else { + tr.center = tr.unproject(from.add(to.sub(from).mult(k))); + } + + if (this.rotating) { + tr.bearing = interpolate(startBearing, bearing, k); + } + + if (pitch !== startPitch) { + tr.pitch = interpolate(startPitch, pitch, k); + } + + this.fire('move'); + if (this.zooming) { + this.fire('zoom'); + } + if (this.rotating) { + this.fire('rotate'); + } + }, function() { + this.zooming = false; + this.rotating = false; + this.fire('moveend'); + }, options); + + return this; + }, + + /** + * Flying animation to a specified location/zoom/bearing with automatic curve + * + * @param {CameraOptions} options map view options + * @param {number} [options.speed=1.2] How fast animation occurs + * @param {number} [options.curve=1.42] How much zooming out occurs during animation + * @param {Function} [options.easing] + * @fires movestart + * @fires moveend + * @returns {this} + * @example + * // fly with default options to null island + * map.flyTo({center: [0, 0], zoom: 9}); + * // using flyTo options + * map.flyTo({ + * center: [0, 0], + * zoom: 9, + * speed: 0.2, + * curve: 1, + * easing: function(t) { + * return t; + * } + * }); + */ + flyTo: function(options) { + this.stop(); + + options = util.extend({ + offset: [0, 0], + speed: 1.2, + curve: 1.42, + easing: util.ease + }, options); + + var tr = this.transform, + offset = Point.convert(options.offset), + startZoom = this.getZoom(), + startBearing = this.getBearing(); + + var center = 'center' in options ? LatLng.convert(options.center) : this.getCenter(); + var zoom = 'zoom' in options ? +options.zoom : startZoom; + var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; + + var scale = tr.zoomScale(zoom - startZoom), + from = tr.point, + to = tr.project(center).sub(offset.div(scale)); + + var startWorldSize = tr.worldSize, + rho = options.curve, + V = options.speed, + + w0 = Math.max(tr.width, tr.height), + w1 = w0 / scale, + u1 = to.sub(from).mag(), + rho2 = rho * rho; + + function r(i) { + var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); + return Math.log(Math.sqrt(b * b + 1) - b); + } + + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + var r0 = r(0), + w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }, + u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }, + S = (r(1) - r0) / rho; + + if (Math.abs(u1) < 0.000001) { + if (Math.abs(w0 - w1) < 0.000001) return this; + + var k = w1 < w0 ? -1 : 1; + S = Math.abs(Math.log(w1 / w0)) / rho; + + u = function() { return 0; }; + w = function(s) { return Math.exp(k * rho * s); }; + } + + options.duration = 1000 * S / V; + + this.zooming = true; + if (startBearing !== bearing) this.rotating = true; + + this.fire('movestart'); + + this._ease(function (k) { + var s = k * S, + us = u(s); + + tr.zoom = startZoom + tr.scaleZoom(1 / w(s)); + tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize); + + if (bearing !== startBearing) { + tr.bearing = interpolate(startBearing, bearing, k); + } + + this.fire('move').fire('zoom'); + if (bearing !== startBearing) { + this.fire('rotate'); + } + }, function() { + this.zooming = false; + this.rotating = false; + this.fire('moveend'); + }, options); + + return this; + }, + + isEasing: function() { + return !!this._abortFn; + }, + + /** + * Stop current animation + * + * @returns {Map} `this` + */ + stop: function() { + if (this._abortFn) { + this._abortFn.call(this); + this._finishEase(); + } + return this; + }, + + _ease: function(frame, finish, options) { + this._finishFn = finish; + this._abortFn = browser.timed(function (t) { + frame.call(this, options.easing(t)); + if (t === 1) { + this._finishEase(); + } + }, options.animate === false ? 0 : options.duration, this); + }, + + _finishEase: function() { + delete this._abortFn; + // The finish function might emit events which trigger new eases, which + // set a new _finishFn. Ensure we don't delete it unintentionally. + var finish = this._finishFn; + delete this._finishFn; + finish.call(this); + }, + + // convert bearing so that it's numerically close to the current one so that it interpolates properly + _normalizeBearing: function(bearing, currentBearing) { + bearing = util.wrap(bearing, -180, 180); + var diff = Math.abs(bearing - currentBearing); + if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360; + if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360; + return bearing; + }, + + _updateEasing: function(duration, zoom, bezier) { + var easing; + + if (this.ease) { + var ease = this.ease, + t = (Date.now() - ease.start) / ease.duration, + speed = ease.easing(t + 0.01) - ease.easing(t), + + // Quick hack to make new bezier that is continuous with last + x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, + y = Math.sqrt(0.27 * 0.27 - x * x); + + easing = util.bezier(x, y, 0.25, 1); + } else { + easing = bezier ? util.bezier.apply(util, bezier) : util.ease; + } + + // store information on current easing + this.ease = { + start: (new Date()).getTime(), + to: Math.pow(2, zoom), + duration: duration, + easing: easing + }; + + return easing; + } +}); + +},{"../geo/lat_lng":18,"../geo/lat_lng_bounds":19,"../util/browser":92,"../util/interpolate":99,"../util/util":103,"point-geometry":134}],76:[function(require,module,exports){ +'use strict'; + +var Control = require('./control'); +var DOM = require('../../util/dom'); +var util = require('../../util/util'); + +module.exports = Attribution; + +/** + * Creates an attribution control + * @class Attribution + * @example + * map.addControl(new mapboxgl.Attribution()); + */ +function Attribution() {} + +Attribution.prototype = util.inherit(Control, { + options: { + position: 'bottom-right' + }, + + onAdd: function(map) { + var className = 'mapboxgl-ctrl-attrib', + container = this._container = DOM.create('div', className, map.getContainer()); + + this._update(); + map.on('source.load', this._update.bind(this)); + map.on('source.change', this._update.bind(this)); + map.on('source.remove', this._update.bind(this)); + map.on('moveend', this._updateEditLink.bind(this)); + + return container; + }, + + _update: function() { + var attributions = []; + + if (this._map.style) { + for (var id in this._map.style.sources) { + var source = this._map.style.sources[id]; + if (source.attribution && attributions.indexOf(source.attribution) < 0) { + attributions.push(source.attribution); + } + } + } + + this._container.innerHTML = attributions.join(' | '); + this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0]; + this._updateEditLink(); + }, + + _updateEditLink: function() { + if (this._editLink) { + var center = this._map.getCenter(); + this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' + + center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1); + } + } +}); + +},{"../../util/dom":95,"../../util/util":103,"./control":77}],77:[function(require,module,exports){ +'use strict'; + +module.exports = Control; + +/** + * A base class for map-related interface elements. + * + * @class Control + */ +function Control() {} + +Control.prototype = { + /** + * Add this control to the map, returning the control itself + * for chaining. This will insert the control's DOM element into + * the map's DOM element if the control has a `position` specified. + * + * @param {Map} map + * @returns {Control} `this` + */ + addTo: function(map) { + this._map = map; + var container = this._container = this.onAdd(map); + if (this.options && this.options.position) { + var pos = this.options.position; + var corner = map._controlCorners[pos]; + container.className += ' mapboxgl-ctrl'; + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + } + + return this; + }, + + /** + * Remove this control from the map it has been added to. + * + * @returns {Control} `this` + */ + remove: function() { + this._container.parentNode.removeChild(this._container); + if (this.onRemove) this.onRemove(this._map); + this._map = null; + return this; + } +}; + +},{}],78:[function(require,module,exports){ +'use strict'; + +var Control = require('./control'); +var DOM = require('../../util/dom'); +var util = require('../../util/util'); + +module.exports = Navigation; + +/** + * Creates a navigation control with zoom buttons and a compass + * @class Navigation + * @param {Object} [options] + * @param {string} [options.position=top-right] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left` + * @example + * map.addControl(new mapboxgl.Navigation({position: 'top-left'})); // position is optional + */ +function Navigation(options) { + util.setOptions(this, options); +} + +Navigation.prototype = util.inherit(Control, { + options: { + position: 'top-right' + }, + + onAdd: function(map) { + var className = 'mapboxgl-ctrl'; + + var container = this._container = DOM.create('div', className + '-group', map.getContainer()); + + this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map)); + this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map)); + this._compass = this._createButton(className + '-compass', map.resetNorth.bind(map)); + + var compassCanvas = this._compassCanvas = DOM.create('canvas', className + '-compass-canvas', this._compass); + compassCanvas.style.cssText = 'width:30px; height:30px;'; + compassCanvas.width = 26 * 2; + compassCanvas.height = 26 * 2; + + this._compass.addEventListener('mousedown', this._onCompassDown.bind(this)); + this._onCompassMove = this._onCompassMove.bind(this); + this._onCompassUp = this._onCompassUp.bind(this); + + this._compassCtx = compassCanvas.getContext('2d'); + + map.on('rotate', this._drawNorth.bind(this)); + this._drawNorth(); + + return container; + }, + + _onCompassDown: function(e) { + DOM.disableDrag(); + + document.addEventListener('mousemove', this._onCompassMove); + document.addEventListener('mouseup', this._onCompassUp); + this._prevX = e.screenX; + + e.stopPropagation(); + }, + + _onCompassMove: function(e) { + var x = e.screenX, + d = x < 2 ? -5 : // left edge of the screen, continue rotating + x > window.screen.width - 2 ? 5 : // right edge + (x - this._prevX) / 4; + + this._map.setBearing(this._map.getBearing() - d); + this._prevX = e.screenX; + this._moved = true; + + e.preventDefault(); + }, + + _onCompassUp: function() { + document.removeEventListener('mousemove', this._onCompassMove); + document.removeEventListener('mouseup', this._onCompassUp); + DOM.enableDrag(); + + if (this._moved) { + this._moved = false; + DOM.suppressClick(); + } + + this._map.snapToNorth(); + }, + + _createButton: function(className, fn) { + var a = DOM.create('button', className, this._container); + a.addEventListener('click', function() { fn(); }); + return a; + }, + + _drawNorth: function() { + var rad = 20, + width = 8, + center = 26, + angle = this._map.transform.angle + (Math.PI / 2), + ctx = this._compassCtx; + + this._compassCanvas.width = this._compassCanvas.width; + + ctx.translate(center, center); + ctx.rotate(angle); + + ctx.beginPath(); + ctx.fillStyle = '#000'; + ctx.lineTo(0, -width); + ctx.lineTo(-rad, 0); + ctx.lineTo(0, width); + ctx.fill(); + + ctx.beginPath(); + ctx.fillStyle = '#bbb'; + ctx.moveTo(0, 0); + ctx.lineTo(0, width); + ctx.lineTo(rad, 0); + ctx.lineTo(0, -width); + ctx.fill(); + + ctx.beginPath(); + ctx.strokeStyle = '#fff'; + ctx.lineWidth = 4; + ctx.moveTo(0, -width); + ctx.lineTo(0, width); + ctx.stroke(); + } +}); + +},{"../../util/dom":95,"../../util/util":103,"./control":77}],79:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'), + LatLngBounds = require('../../geo/lat_lng_bounds'), + util = require('../../util/util'); + +module.exports = BoxZoom; + + +function BoxZoom(map) { + this._map = map; + this._el = map.getCanvasContainer(); + this._container = map.getContainer(); + + util.bindHandlers(this); +} + +BoxZoom.prototype = { + enable: function () { + this._el.addEventListener('mousedown', this._onMouseDown, false); + }, + + disable: function () { + this._el.removeEventListener('mousedown', this._onMouseDown); + }, + + _onMouseDown: function (e) { + if (e.shiftKey || (e.which === 1 && e.button === 1)) { + document.addEventListener('mousemove', this._onMouseMove, false); + document.addEventListener('keydown', this._onKeyDown, false); + document.addEventListener('mouseup', this._onMouseUp, false); + + this._startPos = DOM.mousePos(this._el, e); + this.active = true; + } + }, + + _onMouseMove: function (e) { + var p0 = this._startPos, + p1 = DOM.mousePos(this._el, e); + + if (!this._box) { + this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); + this._container.classList.add('mapboxgl-crosshair'); + + DOM.disableDrag(); + + this._map.fire('boxzoomstart'); + } + + var minX = Math.min(p0.x, p1.x), + maxX = Math.max(p0.x, p1.x), + minY = Math.min(p0.y, p1.y), + maxY = Math.max(p0.y, p1.y); + + DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)'); + + this._box.style.width = (maxX - minX) + 'px'; + this._box.style.height = (maxY - minY) + 'px'; + }, + + _onMouseUp: function (e) { + var p0 = this._startPos, + p1 = DOM.mousePos(this._el, e), + bounds = new LatLngBounds(this._map.unproject(p0), this._map.unproject(p1)); + + this._finish(); + + this._map + .fitBounds(bounds, {linear: true}) + .fire('boxzoomend', {boxZoomBounds: bounds}); + }, + + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); + this._map.fire('boxzoomcancel'); + } + }, + + _finish: function () { + if (!this._box) return; + + this.active = false; + + document.removeEventListener('mousemove', this._onMouseMove, false); + document.removeEventListener('keydown', this._onKeyDown, false); + document.removeEventListener('mouseup', this._onMouseUp, false); + + this._container.classList.remove('mapboxgl-crosshair'); + + this._box.parentNode.removeChild(this._box); + this._box = null; + + DOM.enableDrag(); + } +}; + +},{"../../geo/lat_lng_bounds":19,"../../util/dom":95,"../../util/util":103}],80:[function(require,module,exports){ +'use strict'; + +module.exports = DoubleClickZoom; + +function DoubleClickZoom(map) { + this._map = map; + this._onDblClick = this._onDblClick.bind(this); +} + +DoubleClickZoom.prototype = { + enable: function () { + this._map.on('dblclick', this._onDblClick); + }, + + disable: function () { + this._map.off('dblclick', this._onDblClick); + }, + + _onDblClick: function (e) { + this._map.zoomTo(Math.round(this._map.getZoom()) + 1, {around: e.latLng}); + } +}; + +},{}],81:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'), + util = require('../../util/util'); + +module.exports = DragPan; + + +var inertiaLinearity = 0.25, + inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), + inertiaMaxSpeed = 3000, // px/s + inertiaDeceleration = 4000; // px/s^2 + + +function DragPan(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindHandlers(this); +} + +DragPan.prototype = { + enable: function () { + this._el.addEventListener('mousedown', this._onDown, false); + this._el.addEventListener('touchstart', this._onDown, false); + }, + + disable: function () { + this._el.removeEventListener('mousedown', this._onDown); + this._el.removeEventListener('touchstart', this._onDown); + }, + + _onDown: function (e) { + this._startPos = this._pos = DOM.mousePos(this._el, e); + + this._inertia = [[Date.now(), this._pos]]; + + if (!e.touches) { + document.addEventListener('mousemove', this._onMove, false); + document.addEventListener('mouseup', this._onMouseUp, false); + + } else if (e.touches.length === 1) { + document.addEventListener('touchmove', this._onMove, false); + document.addEventListener('touchend', this._onTouchEnd, false); + } + }, + + _onMove: function (e) { + var map = this._map; + if (map.boxZoom.active || map.dragRotate.active || (e.touches && e.touches.length > 1)) return; + + var pos = DOM.mousePos(this._el, e), + inertia = this._inertia, + now = Date.now(); + + inertia.push([now, pos]); + while (inertia.length > 2 && now - inertia[0][0] > 50) inertia.shift(); + + map.stop(); + map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos); + map.fire('move'); + + this._pos = pos; + + e.preventDefault(); + }, + + _onUp: function () { + var inertia = this._inertia; + + if (inertia.length < 2) { + this._map.fire('moveend'); + return; + } + + var last = inertia[inertia.length - 1], + first = inertia[0], + flingOffset = last[1].sub(first[1]), + flingDuration = (last[0] - first[0]) / 1000, + + // calculate px/s velocity & adjust for increased initial animation speed when easing out + velocity = flingOffset.mult(inertiaLinearity / flingDuration), + speed = velocity.mag(); // px/s + + if (speed > inertiaMaxSpeed) { + speed = inertiaMaxSpeed; + velocity._unit()._mult(speed); + } + + var duration = speed / (inertiaDeceleration * inertiaLinearity), + offset = velocity.mult(-duration / 2); + + this._map.panBy(offset, { + duration: duration * 1000, + easing: inertiaEasing, + noMoveStart: true + }); + }, + + _onMouseUp: function () { + this._onUp(); + document.removeEventListener('mousemove', this._onMove, false); + document.removeEventListener('mouseup', this._onMouseUp, false); + }, + + _onTouchEnd: function () { + this._onUp(); + document.removeEventListener('touchmove', this._onMove); + document.removeEventListener('touchend', this._onTouchEnd); + } +}; + +},{"../../util/dom":95,"../../util/util":103}],82:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'), + Point = require('point-geometry'), + util = require('../../util/util'); + +module.exports = DragRotate; + + +function DragRotate(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindHandlers(this); +} + +DragRotate.prototype = { + enable: function () { + this._el.addEventListener('contextmenu', this._onContextMenu, false); + }, + + disable: function () { + this._el.removeEventListener('contextmenu', this._onContextMenu); + }, + + _onContextMenu: function (e) { + this._map.stop(); + this.active = true; + this._startPos = this._pos = DOM.mousePos(this._el, e); + + document.addEventListener('mousemove', this._onMouseMove, false); + document.addEventListener('mouseup', this._onMouseUp, false); + + e.preventDefault(); + }, + + _onMouseMove: function (e) { + + var p0 = this._startPos, + p1 = this._pos, + p2 = DOM.mousePos(this._el, e), + + map = this._map, + center = map.transform.centerPoint, // Center of rotation + startToCenter = p0.sub(center), + startToCenterDist = startToCenter.mag(); + + if (!map.rotating) { + map.fire('movestart'); + map.rotating = true; + } + + // If the first click was too close to the center, move the center of rotation by 200 pixels + // in the direction of the click. + if (startToCenterDist < 200) { + center = p0.add(new Point(-200, 0)._rotate(startToCenter.angle())); + } + + var bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180; + map.transform.bearing = map.getBearing() - bearingDiff; + + map.fire('move').fire('rotate'); + + clearTimeout(this._timeout); + this._timeout = setTimeout(this._onTimeout, 200); + + this._pos = p2; + }, + + _onTimeout: function () { + var map = this._map; + + map.rotating = false; + map.snapToNorth(); + + if (!map.rotating) { + map._rerender(); + map.fire('moveend'); + } + }, + + _onMouseUp: function () { + this.active = false; + + document.removeEventListener('mousemove', this._onMouseMove, false); + document.removeEventListener('mouseup', this._onMouseUp, false); + } +}; + +},{"../../util/dom":95,"../../util/util":103,"point-geometry":134}],83:[function(require,module,exports){ +'use strict'; + +module.exports = Keyboard; + + +var panDelta = 80, + rotateDelta = 2; + +/** + * The `Keyboard` handler responds to keyboard input by zooming, rotating, or panning the + * map. The following keyboard shortcuts are supported: + * * `=` / `+`: increase zoom level by 1 + * * `Shift-=` / `Shift-+`: increase zoom level by 2 + * * `-`: decrease zoom level by 1 + * * `Shift--`: decrease zoom level by 2 + * * Arrow keys: pan by 80 pixels + * * `Shift+⇢`: increase rotation by 2 degrees + * * `Shift+⇠`: decrease rotation by 2 degrees + * @class Keyboard + * @example + * // Disable the keyboard handler + * map.keyboard.disable(); + * @example + * // Enable the keyboard handler + * map.keyboard.enable(); + */ +function Keyboard(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + this._onKeyDown = this._onKeyDown.bind(this); +} + +Keyboard.prototype = { + enable: function () { + this._el.addEventListener('keydown', this._onKeyDown, false); + }, + + disable: function () { + this._el.removeEventListener('keydown', this._onKeyDown); + }, + + _onKeyDown: function (e) { + if (e.altKey || e.ctrlKey || e.metaKey) return; + + var map = this._map; + + switch (e.keyCode) { + case 61: + case 107: + case 171: + case 187: + map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1)); + break; + + case 189: + case 109: + case 173: + map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1)); + break; + + case 37: + if (e.shiftKey) { + map.setBearing(map.getBearing() - rotateDelta); + } else { + map.panBy([-panDelta, 0]); + } + break; + + case 39: + if (e.shiftKey) { + map.setBearing(map.getBearing() + rotateDelta); + } else { + map.panBy([panDelta, 0]); + } + break; + + case 38: + map.panBy([0, -panDelta]); + break; + + case 40: + map.panBy([0, panDelta]); + break; + } + } +}; + +},{}],84:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'), + util = require('../../util/util'); + +module.exports = Pinch; + + +function Pinch(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindHandlers(this); +} + +Pinch.prototype = { + enable: function () { + this._el.addEventListener('touchstart', this._onStart, false); + }, + + disable: function () { + this._el.removeEventListener('touchstart', this._onStart); + }, + + _onStart: function (e) { + if (e.touches.length !== 2) return; + + var p0 = DOM.mousePos(this._el, e.touches[0]), + p1 = DOM.mousePos(this._el, e.touches[1]); + + this._startVec = p0.sub(p1); + this._startScale = this._map.transform.scale; + this._startBearing = this._map.transform.bearing; + + document.addEventListener('touchmove', this._onMove, false); + document.addEventListener('touchend', this._onEnd, false); + }, + + _onMove: function (e) { + if (e.touches.length !== 2) return; + + var p0 = DOM.mousePos(this._el, e.touches[0]), + p1 = DOM.mousePos(this._el, e.touches[1]), + p = p0.add(p1).div(2), + vec = p0.sub(p1), + scale = vec.mag() / this._startVec.mag(), + bearing = vec.angleWith(this._startVec) * 180 / Math.PI, + map = this._map; + + map.easeTo({ + zoom: map.transform.scaleZoom(this._startScale * scale), + bearing: this._startBearing + bearing, + duration: 0, + around: map.unproject(p) + }); + + e.preventDefault(); + }, + + _onEnd: function () { + this._map.snapToNorth(); + + document.removeEventListener('touchmove', this._onMove); + document.removeEventListener('touchend', this._onEnd); + } +}; + +},{"../../util/dom":95,"../../util/util":103}],85:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'), + browser = require('../../util/browser'), + util = require('../../util/util'); + +module.exports = ScrollZoom; + + +var ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '', + firefox = ua.indexOf('firefox') !== -1, + safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1; + + +function ScrollZoom(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindHandlers(this); +} + +ScrollZoom.prototype = { + enable: function () { + this._el.addEventListener('wheel', this._onWheel, false); + this._el.addEventListener('mousewheel', this._onWheel, false); + }, + + disable: function () { + this._el.removeEventListener('wheel', this._onWheel); + this._el.removeEventListener('mousewheel', this._onWheel); + }, + + _onWheel: function (e) { + var value; + + if (e.type === 'wheel') { + value = e.deltaY; + // Firefox doubles the values on retina screens... + if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio; + if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40; + + } else if (e.type === 'mousewheel') { + value = -e.wheelDeltaY; + if (safari) value = value / 3; + } + + var now = (window.performance || Date).now(), + timeDelta = now - (this._time || 0); + + this._pos = DOM.mousePos(this._el, e); + this._time = now; + + if (value !== 0 && (value % 4.000244140625) === 0) { + // This one is definitely a mouse wheel event. + this._type = 'wheel'; + // Normalize this value to match trackpad. + value = Math.floor(value / 4); + + } else if (value !== 0 && Math.abs(value) < 4) { + // This one is definitely a trackpad event because it is so small. + this._type = 'trackpad'; + + } else if (timeDelta > 400) { + // This is likely a new scroll action. + this._type = null; + this._lastValue = value; + + // Start a timeout in case this was a singular event, and dely it by up to 40ms. + this._timeout = setTimeout(this._onTimeout, 40); + + } else if (!this._type) { + // This is a repeating event, but we don't know the type of event just yet. + // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. + this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; + + // Make sure our delayed event isn't fired again, because we accumulate + // the previous event (which was less than 40ms ago) into this event. + if (this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + value += this._lastValue; + } + } + + // Slow down zoom if shift key is held for more precise zooming + if (e.shiftKey && value) value = value / 4; + + // Only fire the callback if we actually know what type of scrolling device the user uses. + if (this._type) this._zoom(-value); + + e.preventDefault(); + }, + + _onTimeout: function () { + this._type = 'wheel'; + this._zoom(-this._lastValue); + }, + + _zoom: function (delta) { + var map = this._map; + + // Scale by sigmoid of scroll wheel delta. + var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100))); + if (delta < 0 && scale !== 0) scale = 1 / scale; + + var fromScale = map.ease ? map.ease.to : map.transform.scale, + targetZoom = map.transform.scaleZoom(fromScale * scale); + + map.zoomTo(targetZoom, { + duration: 0, + around: map.unproject(this._pos) + }); + } +}; + +},{"../../util/browser":92,"../../util/dom":95,"../../util/util":103}],86:[function(require,module,exports){ +'use strict'; + +/* + * Adds positional coordinates to URL hashes. Passed as an option to the map object + * + * @class mapboxgl.Hash + * @returns {Hash} `this` + */ +module.exports = Hash; + +var util = require('../util/util'); + +function Hash() { + util.bindAll([ + '_onHashChange', + '_updateHash' + ], this); +} + +Hash.prototype = { + /* Map element to listen for coordinate changes + * + * @param {Object} map + * @returns {Hash} `this` + */ + addTo: function(map) { + this._map = map; + window.addEventListener('hashchange', this._onHashChange, false); + this._map.on('moveend', this._updateHash); + return this; + }, + + /* Removes hash + * + * @returns {Popup} `this` + */ + remove: function() { + window.removeEventListener('hashchange', this._onHashChange, false); + this._map.off('moveend', this._updateHash); + delete this._map; + return this; + }, + + _onHashChange: function() { + var loc = location.hash.replace('#', '').split('/'); + if (loc.length >= 3) { + this._map.jumpTo({ + center: [+loc[1], +loc[2]], + zoom: +loc[0], + bearing: +(loc[3] || 0) + }); + return true; + } + return false; + }, + + _updateHash: function() { + var center = this._map.getCenter(), + zoom = this._map.getZoom(), + bearing = this._map.getBearing(), + precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)), + + hash = '#' + (Math.round(zoom * 100) / 100) + + '/' + center.lat.toFixed(precision) + + '/' + center.lng.toFixed(precision) + + (bearing ? '/' + (Math.round(bearing * 10) / 10) : ''); + + window.history.replaceState('', '', hash); + } +}; + +},{"../util/util":103}],87:[function(require,module,exports){ +'use strict'; + +var handlers = { + scrollZoom: require('./handler/scroll_zoom'), + boxZoom: require('./handler/box_zoom'), + dragRotate: require('./handler/drag_rotate'), + dragPan: require('./handler/drag_pan'), + keyboard: require('./handler/keyboard'), + doubleClickZoom: require('./handler/dblclick_zoom'), + pinch: require('./handler/pinch') +}; + +var DOM = require('../util/dom'), + util = require('../util/util'); + +module.exports = Interaction; + +/** + * Mouse move event. + * + * @event mousemove + * @memberof Map + * @type {Object} + * @property {Point} point the pixel location of the event + * @property {LatLng} point the geographic location of the event + * @property {Event} originalEvent the original DOM event + */ + +/** + * Click event. + * + * @event click + * @memberof Map + * @type {Object} + * @property {Point} point the pixel location of the event + * @property {LatLng} point the geographic location of the event + * @property {Event} originalEvent the original DOM event + */ + +/** + * Double click event. + * + * @event dblclick + * @memberof Map + * @type {Object} + * @property {Point} point the pixel location of the event + * @property {LatLng} point the geographic location of the event + * @property {Event} originalEvent the original DOM event + */ + +function Interaction(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + for (var name in handlers) { + map[name] = new handlers[name](map); + } + + util.bindHandlers(this); +} + +Interaction.prototype = { + enable: function () { + var options = this._map.options, + el = this._el; + + for (var name in handlers) { + if (options[name]) this._map[name].enable(); + } + + el.addEventListener('mousedown', this._onMouseDown, false); + el.addEventListener('touchstart', this._onTouchStart, false); + el.addEventListener('click', this._onClick, false); + el.addEventListener('mousemove', this._onMouseMove, false); + el.addEventListener('dblclick', this._onDblClick, false); + }, + + disable: function () { + var options = this._map.options, + el = this._el; + + for (var name in handlers) { + if (options[name]) this._map[name].disable(); + } + + el.removeEventListener('mousedown', this._onMouseDown); + el.removeEventListener('touchstart', this._onTouchStart); + el.removeEventListener('click', this._onClick); + el.removeEventListener('mousemove', this._onMouseMove); + el.removeEventListener('dblclick', this._onDblClick); + }, + + _onMouseDown: function (e) { + this._startPos = DOM.mousePos(this._el, e); + }, + + _onTouchStart: function (e) { + if (!e.touches || e.touches.length > 1) return; + + if (!this._tapped) { + this._tapped = setTimeout(this._onTimeout, 300); + + } else { + clearTimeout(this._tapped); + this._tapped = null; + this._fireEvent('dblclick', e); + } + }, + + _onTimeout: function () { + this._tapped = null; + }, + + _onMouseMove: function (e) { + var map = this._map, + el = this._el; + + if (map.dragPan.active || map.dragRotate.active) return; + + var target = e.toElement || e.target; + while (target && target !== el) target = target.parentNode; + if (target !== el) return; + + this._fireEvent('mousemove', e); + }, + + _onClick: function (e) { + var pos = DOM.mousePos(this._el, e); + + if (pos.equals(this._startPos)) { + this._fireEvent('click', e); + } + }, + + _onDblClick: function (e) { + this._fireEvent('dblclick', e); + e.preventDefault(); + }, + + _fireEvent: function (type, e) { + var pos = DOM.mousePos(this._el, e); + + this._map.fire(type, { + latLng: this._map.unproject(pos), + point: pos, + originalEvent: e + }); + } +}; + +},{"../util/dom":95,"../util/util":103,"./handler/box_zoom":79,"./handler/dblclick_zoom":80,"./handler/drag_pan":81,"./handler/drag_rotate":82,"./handler/keyboard":83,"./handler/pinch":84,"./handler/scroll_zoom":85}],88:[function(require,module,exports){ +'use strict'; + +var Canvas = require('../util/canvas'); +var util = require('../util/util'); +var browser = require('../util/browser'); +var Evented = require('../util/evented'); +var DOM = require('../util/dom'); + +var Style = require('../style/style'); +var AnimationLoop = require('../style/animation_loop'); +var Painter = require('../render/painter'); + +var Transform = require('../geo/transform'); +var Hash = require('./hash'); + +var Interaction = require('./interaction'); + +var Camera = require('./camera'); +var LatLng = require('../geo/lat_lng'); +var LatLngBounds = require('../geo/lat_lng_bounds'); +var Point = require('point-geometry'); +var Attribution = require('./control/attribution'); + +/** + * Options common to Map#addClass, Map#removeClass, and Map#setClasses, controlling + * whether or not to smoothly transition property changes triggered by the class change. + * + * @typedef {Object} StyleOptions + * @property {boolean} transition + */ + +/** + * Creates a map instance. + * @class Map + * @param {Object} options + * @param {string} options.container HTML element to initialize the map in (or element id as string) + * @param {number} [options.minZoom=0] Minimum zoom of the map + * @param {number} [options.maxZoom=20] Maximum zoom of the map + * @param {Object} options.style Map style and data source definition (either a JSON object or a JSON URL), described in the [style reference](https://mapbox.com/mapbox-gl-style-spec/) + * @param {boolean} [options.hash=false] If `true`, the map will track and update the page URL according to map position + * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners are attached to the map, so it will not respond to input + * @param {number} [options.bearingSnap=7] Snap to north threshold in degrees. + * @param {Array} options.classes Style class names with which to initialize the map + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected. + * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, The maps canvas can be exported to a PNG using `map.getCanvas().toDataURL();`. This is false by default as a performance optimization. + * @example + * var map = new mapboxgl.Map({ + * container: 'map', + * center: [37.772537, -122.420679], + * zoom: 13, + * style: style_object, + * hash: true + * }); + */ +var Map = module.exports = function(options) { + + options = this.options = util.inherit(this.options, options); + + this.animationLoop = new AnimationLoop(); + this.transform = new Transform(options.minZoom, options.maxZoom); + + if (options.maxBounds) { + var b = LatLngBounds.convert(options.maxBounds); + this.transform.latRange = [b.getSouth(), b.getNorth()]; + this.transform.lngRange = [b.getWest(), b.getEast()]; + } + + util.bindAll([ + '_forwardStyleEvent', + '_forwardSourceEvent', + '_forwardLayerEvent', + '_forwardTileEvent', + '_onStyleLoad', + '_onStyleChange', + '_onSourceAdd', + '_onSourceRemove', + '_onSourceUpdate', + 'update', + 'render' + ], this); + + this._setupContainer(); + this._setupPainter(); + + this.on('move', this.update); + this.on('zoom', this.update.bind(this, true)); + this.on('moveend', function() { + this.animationLoop.set(300); // text fading + this._rerender(); + }.bind(this)); + + if (typeof window !== 'undefined') { + window.addEventListener('resize', function () { + this.stop().resize().update(); + }.bind(this), false); + } + + this.interaction = new Interaction(this); + + if (options.interactive) { + this.interaction.enable(); + } + + this._hash = options.hash && (new Hash()).addTo(this); + // don't set position from options if set through hash + if (!this._hash || !this._hash._onHashChange()) { + this.jumpTo(options); + } + + this.sources = {}; + this.stacks = {}; + this._classes = {}; + + this.resize(); + + if (options.classes) this.setClasses(options.classes); + if (options.style) this.setStyle(options.style); + if (options.attributionControl) this.addControl(new Attribution()); +}; + +util.extend(Map.prototype, Evented); +util.extend(Map.prototype, Camera.prototype); +util.extend(Map.prototype, /** @lends Map.prototype */{ + + options: { + center: [0, 0], + zoom: 0, + bearing: 0, + pitch: 0, + + minZoom: 0, + maxZoom: 20, + + interactive: true, + + scrollZoom: true, + boxZoom: true, + dragRotate: true, + dragPan: true, + keyboard: true, + doubleClickZoom: true, + pinch: true, + + bearingSnap: 7, + + hash: false, + + attributionControl: true, + + failIfMajorPerformanceCaveat: false, + preserveDrawingBuffer: false + }, + + addControl: function(control) { + control.addTo(this); + return this; + }, + + /** + * Adds a style class to a map + * + * @param {string} klass name of style class + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + addClass: function(klass, options) { + if (this._classes[klass]) return; + this._classes[klass] = true; + if (this.style) this.style._cascade(this._classes, options); + }, + + /** + * Removes a style class from a map + * + * @param {string} klass name of style class + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + removeClass: function(klass, options) { + if (!this._classes[klass]) return; + delete this._classes[klass]; + if (this.style) this.style._cascade(this._classes, options); + }, + + /** + * Helper method to add more than one class + * + * @param {Array} klasses An array of class names + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + setClasses: function(klasses, options) { + this._classes = {}; + for (var i = 0; i < klasses.length; i++) { + this._classes[klasses[i]] = true; + } + if (this.style) this.style._cascade(this._classes, options); + }, + + /** + * Check whether a style class is active + * + * @param {string} klass Name of style class + * @returns {boolean} + */ + hasClass: function(klass) { + return !!this._classes[klass]; + }, + + /** + * Return an array of the current active style classes + * + * @returns {boolean} + */ + getClasses: function() { + return Object.keys(this._classes); + }, + + /** + * Detect the map's new width and height and resize it. + * + * @returns {Map} `this` + */ + resize: function() { + var width = 0, height = 0; + + if (this._container) { + width = this._container.offsetWidth || 400; + height = this._container.offsetHeight || 300; + } + + this._canvas.resize(width, height); + + this.transform.width = width; + this.transform.height = height; + this.transform._constrain(); + + this.painter.resize(width, height); + + return this + .fire('movestart') + .fire('move') + .fire('resize') + .fire('moveend'); + }, + + /** + * Get the map's geographical bounds + * + * @returns {LatLngBounds} + */ + getBounds: function() { + return new LatLngBounds( + this.transform.pointLocation(new Point(0, 0)), + this.transform.pointLocation(this.transform.size)); + }, + + /** + * Get pixel coordinates (relative to map container) given a geographical location + * + * @param {LatLng} latlng + * @returns {Object} `x` and `y` coordinates + */ + project: function(latlng) { + return this.transform.locationPoint(LatLng.convert(latlng)); + }, + + /** + * Get geographical coordinates given pixel coordinates + * + * @param {Array} point [x, y] pixel coordinates + * @returns {LatLng} + */ + unproject: function(point) { + return this.transform.pointLocation(Point.convert(point)); + }, + + /** + * Get all features at a point ([x, y]) + * + * @param {Array} point [x, y] pixel coordinates + * @param {Object} params + * @param {number} [params.radius=0] Optional. Radius in pixels to search in + * @param {string} params.layer Optional. Only return features from a given layer + * @param {string} params.type Optional. Either `raster` or `vector` + * @param {featuresAtCallback} callback function that returns the response + * + * @callback featuresAtCallback + * @param {Object|null} err Error _If any_ + * @param {Array} features Displays a JSON array of features given the passed parameters of `featuresAt` + * + * @returns {Map} `this` + * + * @example + * map.featuresAt([10, 20], { radius: 10 }, function(err, features) { + * console.log(features); + * }); + */ + featuresAt: function(point, params, callback) { + var coord = this.transform.pointCoordinate(Point.convert(point)); + this.style.featuresAt(coord, params, callback); + return this; + }, + + /** + * Apply multiple style mutations in a batch + * + * map.batch(function (batch) { + * batch.addLayer(layer1); + * batch.addLayer(layer2); + * ... + * batch.addLayer(layerN); + * }); + * + * @param {function} work Function which accepts the StyleBatch interface + */ + batch: function(work) { + this.style.batch(work); + + this.style._cascade(this._classes); + this.update(true); + }, + + /** + * Replaces the map's style object + * + * @param {Object} style A style object formatted as JSON + * @returns {Map} `this` + */ + setStyle: function(style) { + if (this.style) { + this.style + .off('load', this._onStyleLoad) + .off('error', this._forwardStyleEvent) + .off('change', this._onStyleChange) + .off('source.add', this._onSourceAdd) + .off('source.remove', this._onSourceRemove) + .off('source.load', this._onSourceUpdate) + .off('source.error', this._forwardSourceEvent) + .off('source.change', this._onSourceUpdate) + .off('layer.add', this._forwardLayerEvent) + .off('layer.remove', this._forwardLayerEvent) + .off('tile.add', this._forwardTileEvent) + .off('tile.remove', this._forwardTileEvent) + .off('tile.load', this.update) + .off('tile.error', this._forwardTileEvent) + ._remove(); + + this.off('rotate', this.style._redoPlacement); + this.off('pitch', this.style._redoPlacement); + } + + if (!style) { + this.style = null; + return this; + } else if (style instanceof Style) { + this.style = style; + } else { + this.style = new Style(style, this.animationLoop); + } + + this.style + .on('load', this._onStyleLoad) + .on('error', this._forwardStyleEvent) + .on('change', this._onStyleChange) + .on('source.add', this._onSourceAdd) + .on('source.remove', this._onSourceRemove) + .on('source.load', this._onSourceUpdate) + .on('source.error', this._forwardSourceEvent) + .on('source.change', this._onSourceUpdate) + .on('layer.add', this._forwardLayerEvent) + .on('layer.remove', this._forwardLayerEvent) + .on('tile.add', this._forwardTileEvent) + .on('tile.remove', this._forwardTileEvent) + .on('tile.load', this.update) + .on('tile.error', this._forwardTileEvent); + + this.on('rotate', this.style._redoPlacement); + this.on('pitch', this.style._redoPlacement); + + return this; + }, + + /** + * Add a source to the map style. + * + * @param {string} id ID of the source. Must not be used by any existing source. + * @param {Object} source source specification, following the + * [Mapbox GL Style Reference](https://www.mapbox.com/mapbox-gl-style-spec/#sources) + * @fires source.add + * @returns {Map} `this` + */ + addSource: function(id, source) { + this.style.addSource(id, source); + return this; + }, + + /** + * Remove an existing source from the map style. + * + * @param {string} id ID of the source to remove + * @fires source.remove + * @returns {Map} `this` + */ + removeSource: function(id) { + this.style.removeSource(id); + return this; + }, + + /** + * Return the style source object with the given `id`. + * + * @param {string} id source ID + * @returns {Object} + */ + getSource: function(id) { + return this.style.getSource(id); + }, + + /** + * Add a layer to the map style. The layer will be inserted before the layer with + * ID `before`, or appended if `before` is omitted. + * @param {StyleLayer|Object} layer + * @param {string=} before ID of an existing layer to insert before + * @fires layer.add + * @returns {Map} `this` + */ + addLayer: function(layer, before) { + this.style.addLayer(layer, before); + this.style._cascade(this._classes); + return this; + }, + + /** + * Remove the layer with the given `id` from the map. Any layers which refer to the + * specified layer via a `ref` property are also removed. + * + * @param {string} id layer id + * @fires layer.remove + * @returns {Map} this + */ + removeLayer: function(id) { + this.style.removeLayer(id); + this.style._cascade(this._classes); + return this; + }, + + /** + * Set the filter for a given style layer. + * + * @param {string} layer ID of a layer + * @param {Array} filter filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter) + * @returns {Map} `this` + */ + setFilter: function(layer, filter) { + this.style.setFilter(layer, filter); + return this; + }, + + /** + * Set the zoom extent for a given style layer. + * + * @param {string} layerId ID of a layer + * @param {number} minzoom minimum zoom extent + * @param {number} maxzoom maximum zoom extent + * @returns {Map} `this` + */ + setLayerZoomRange: function(layerId, minzoom, maxzoom) { + this.style.setLayerZoomRange(layerId, minzoom, maxzoom); + return this; + }, + + /** + * Get the filter for a given style layer. + * + * @param {string} layer ID of a layer + * @returns {Array} filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter) + */ + getFilter: function(layer) { + return this.style.getFilter(layer); + }, + + /** + * Set the value of a paint property in a given style layer. + * + * @param {string} layer ID of a layer + * @param {string} name name of a paint property + * @param {*} value value for the paint propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/) + * @param {string=} klass optional class specifier for the property + * @returns {Map} `this` + */ + setPaintProperty: function(layer, name, value, klass) { + this.style.setPaintProperty(layer, name, value, klass); + this.style._cascade(this._classes); + this.update(true); + return this; + }, + + /** + * Get the value of a paint property in a given style layer. + * + * @param {string} layer ID of a layer + * @param {string} name name of a paint property + * @param {string=} klass optional class specifier for the property + * @returns {*} value for the paint propery + */ + getPaintProperty: function(layer, name, klass) { + return this.style.getPaintProperty(layer, name, klass); + }, + + /** + * Set the value of a layout property in a given style layer. + * + * @param {string} layer ID of a layer + * @param {string} name name of a layout property + * @param {*} value value for the layout propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/) + * @returns {Map} `this` + */ + setLayoutProperty: function(layer, name, value) { + this.style.setLayoutProperty(layer, name, value); + return this; + }, + + /** + * Get the value of a layout property in a given style layer. + * + * @param {string} layer ID of a layer + * @param {string} name name of a layout property + * @param {string=} klass optional class specifier for the property + * @returns {*} value for the layout propery + */ + getLayoutProperty: function(layer, name) { + return this.style.getLayoutProperty(layer, name); + }, + + /** + * Get the Map's container as an HTML element + * @returns {HTMLElement} container + */ + getContainer: function() { + return this._container; + }, + + /** + * Get the container for the map `canvas` element. + * + * If you want to add non-GL overlays to the map, you should append them to this element. This + * is the element to which event bindings for map interactivity such as panning and zooming are + * attached. It will receive bubbled events for child elements such as the `canvas`, but not for + * map controls. + * + * @returns {HTMLElement} container + */ + getCanvasContainer: function() { + return this._canvasContainer; + }, + + /** + * Get the Map's canvas as an HTML canvas + * @returns {HTMLElement} canvas + */ + getCanvas: function() { + return this._canvas.getElement(); + }, + + _setupContainer: function() { + var id = this.options.container; + + var container = this._container = typeof id === 'string' ? document.getElementById(id) : id; + container.classList.add('mapboxgl-map'); + + var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); + if (this.options.interactive) { + canvasContainer.classList.add('mapboxgl-interactive'); + } + this._canvas = new Canvas(this, canvasContainer); + + var controlContainer = DOM.create('div', 'mapboxgl-control-container', container); + var corners = this._controlCorners = {}; + ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) { + corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer); + }); + }, + + _setupPainter: function() { + var gl = this._canvas.getWebGLContext({ + failIfMajorPerformanceCaveat: this.options.failIfMajorPerformanceCaveat, + preserveDrawingBuffer: this.options.preserveDrawingBuffer + }); + + if (!gl) { + console.error('Failed to initialize WebGL'); + return; + } + + this.painter = new Painter(gl, this.transform); + }, + + _contextLost: function(event) { + event.preventDefault(); + if (this._frameId) { + browser.cancelFrame(this._frameId); + } + }, + + _contextRestored: function() { + this._setupPainter(); + this.resize(); + this.update(); + }, + + /** + * Is this map fully loaded? If the style isn't loaded + * or it has a change to the sources or style that isn't + * propagated to its style, return false. + * + * @returns {boolean} whether the map is loaded + */ + loaded: function() { + if (this._styleDirty || this._sourcesDirty) + return false; + if (this.style && !this.style.loaded()) + return false; + return true; + }, + + /** + * Update this map's style and re-render the map. + * + * @param {Object} updateStyle new style + * @returns {Map} this + */ + update: function(updateStyle) { + if (!this.style) return this; + + this._styleDirty = this._styleDirty || updateStyle; + this._sourcesDirty = true; + + this._rerender(); + + return this; + }, + + /** + * Call when a (re-)render of the map is required, e.g. when the + * user panned or zoomed,f or new data is available. + * @returns {Map} this + */ + render: function() { + if (this.style && this._styleDirty) { + this._styleDirty = false; + this.style._recalculate(this.transform.zoom); + } + + if (this.style && this._sourcesDirty && !this._sourcesDirtyTimeout) { + this._sourcesDirty = false; + this._sourcesDirtyTimeout = setTimeout(function() { + this._sourcesDirtyTimeout = null; + }.bind(this), 50); + this.style._updateSources(this.transform); + } + + this.painter.render(this.style, { + debug: this.debug, + vertices: this.vertices, + rotating: this.rotating, + zooming: this.zooming + }); + + this.fire('render'); + + if (this.loaded() && !this._loaded) { + this._loaded = true; + this.fire('load'); + } + + this._frameId = null; + + if (!this.animationLoop.stopped()) { + this._styleDirty = true; + } + + if (this._sourcesDirty || this._repaint || !this.animationLoop.stopped()) { + this._rerender(); + } + + return this; + }, + + /** + * Destroys the map's underlying resources, including web workers. + * @returns {Map} this + */ + remove: function() { + if (this._hash) this._hash.remove(); + browser.cancelFrame(this._frameId); + clearTimeout(this._sourcesDirtyTimeout); + this.setStyle(null); + return this; + }, + + _rerender: function() { + if (this.style && !this._frameId) { + this._frameId = browser.frame(this.render); + } + }, + + _forwardStyleEvent: function(e) { + this.fire('style.' + e.type, util.extend({style: e.target}, e)); + }, + + _forwardSourceEvent: function(e) { + this.fire(e.type, util.extend({style: e.target}, e)); + }, + + _forwardLayerEvent: function(e) { + this.fire(e.type, util.extend({style: e.target}, e)); + }, + + _forwardTileEvent: function(e) { + this.fire(e.type, util.extend({style: e.target}, e)); + }, + + _onStyleLoad: function(e) { + this.style._cascade(this._classes, {transition: false}); + this._forwardStyleEvent(e); + }, + + _onStyleChange: function(e) { + this.update(true); + this._forwardStyleEvent(e); + }, + + _onSourceAdd: function(e) { + var source = e.source; + if (source.onAdd) + source.onAdd(this); + this._forwardSourceEvent(e); + }, + + _onSourceRemove: function(e) { + var source = e.source; + if (source.onRemove) + source.onRemove(this); + this._forwardSourceEvent(e); + }, + + _onSourceUpdate: function(e) { + this.update(); + this._forwardSourceEvent(e); + } +}); + +util.extendAll(Map.prototype, /** @lends Map.prototype */{ + + /** + * Enable debugging mode + * + * @name debug + * @type {boolean} + */ + _debug: false, + get debug() { return this._debug; }, + set debug(value) { this._debug = value; this.update(); }, + + /** + * Show collision boxes: useful for debugging label placement + * in styles. + * + * @name collisionDebug + * @type {boolean} + */ + _collisionDebug: false, + get collisionDebug() { return this._collisionDebug; }, + set collisionDebug(value) { + this._collisionDebug = value; + for (var i in this.style.sources) { + this.style.sources[i].reload(); + } + this.update(); + }, + + /** + * Enable continuous repaint to analyze performance + * + * @name repaint + * @type {boolean} + */ + _repaint: false, + get repaint() { return this._repaint; }, + set repaint(value) { this._repaint = value; this.update(); }, + + // show vertices + _vertices: false, + get vertices() { return this._vertices; }, + set vertices(value) { this._vertices = value; this.update(); } +}); + +},{"../geo/lat_lng":18,"../geo/lat_lng_bounds":19,"../geo/transform":20,"../render/painter":34,"../style/animation_loop":47,"../style/style":52,"../util/browser":92,"../util/canvas":93,"../util/dom":95,"../util/evented":97,"../util/util":103,"./camera":75,"./control/attribution":76,"./hash":86,"./interaction":87,"point-geometry":134}],89:[function(require,module,exports){ +'use strict'; + +module.exports = Popup; + +var util = require('../util/util'); +var Evented = require('../util/evented'); +var DOM = require('../util/dom'); +var LatLng = require('../geo/lat_lng'); + +/** + * Creates a popup component + * @class Popup + * @param {Object} options + * @param {boolean} options.closeButton + * @param {boolean} options.closeOnClick + * @example + * var tooltip = new mapboxgl.Popup() + * .setLatLng(map.unproject(e.point)) + * .setHTML("

Hello World!

") + * .addTo(map); + */ +function Popup(options) { + util.setOptions(this, options); + util.bindAll([ + '_updatePosition', + '_onClickClose'], + this); +} + +Popup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{ + options: { + closeButton: true, + closeOnClick: true + }, + + /** + * Attaches the popup to a map + * @param {Map} map + * @returns {Popup} `this` + */ + addTo: function(map) { + this._map = map; + this._map.on('move', this._updatePosition); + if (this.options.closeOnClick) { + this._map.on('click', this._onClickClose); + } + this._update(); + return this; + }, + + /** + * Removes the popup from the map + * @example + * var popup = new mapboxgl.Popup().addTo(map); + * popup.remove(); + * @returns {Popup} `this` + */ + remove: function() { + if (this._container) { + this._container.parentNode.removeChild(this._container); + } + + if (this._map) { + this._map.off('move', this._updatePosition); + this._map.off('click', this._onClickClose); + delete this._map; + } + + return this; + }, + + /** + * Get the current coordinates of popup element relative to map + * @returns {LatLng} + */ + getLatLng: function() { + return this._latLng; + }, + + /** + * Set the coordinates of a popup element to a map + * @param {LatLng} latlng + * @returns {Popup} `this` + */ + setLatLng: function(latlng) { + this._latLng = LatLng.convert(latlng); + this._update(); + return this; + }, + + /** + * Fill a popup element with text only content + * @param {string} text + * @returns {Popup} `this` + */ + setText: function(text) { + this._content = document.createTextNode(text); + this._updateContent(); + return this; + }, + + /** + * Fill a popup element with HTML content + * @param {string} html + * @returns {Popup} `this` + */ + setHTML: function(html) { + this._content = document.createDocumentFragment(); + + var temp = document.createElement('body'), child; + temp.innerHTML = html; + while (true) { + child = temp.firstChild; + if (!child) break; + this._content.appendChild(child); + } + + this._updateContent(); + return this; + }, + + _update: function() { + if (!this._map) { return; } + + if (!this._container) { + this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); + + this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); + this._wrapper = DOM.create('div', 'mapboxgl-popup-content', this._container); + + if (this.options.closeButton) { + this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._wrapper); + this._closeButton.innerHTML = '×'; + this._closeButton.addEventListener('click', this._onClickClose); + } + } + + this._updateContent(); + this._updatePosition(); + }, + + _updateContent: function() { + if (!this._content || !this._container) { return; } + + var node = this._wrapper; + + while (node.hasChildNodes()) { + node.removeChild(node.firstChild); + } + + if (this.options.closeButton) { + node.appendChild(this._closeButton); + } + + node.appendChild(this._content); + }, + + _updatePosition: function() { + if (!this._latLng || !this._container) { return; } + + var pos = this._map.project(this._latLng).round(), + anchor = this.options.anchor; + + if (!anchor) { + var width = this._container.offsetWidth, + height = this._container.offsetHeight; + + if (pos.y < height) { + anchor = ['top']; + } else if (pos.y > this._map.transform.height - height) { + anchor = ['bottom']; + } else { + anchor = []; + } + + if (pos.x < width / 2) { + anchor.push('left'); + } else if (pos.x > this._map.transform.width - width / 2) { + anchor.push('right'); + } + + if (anchor.length === 0) { + anchor = 'bottom'; + } else { + anchor = anchor.join('-'); + } + + this.options.anchor = anchor; + } + + var anchorTranslate = { + 'top': 'translate(-50%,0)', + 'top-left': 'translate(0,0)', + 'top-right': 'translate(-100%,0)', + 'bottom': 'translate(-50%,-100%)', + 'bottom-left': 'translate(0,-100%)', + 'bottom-right': 'translate(-100%,-100%)', + 'left': 'translate(0,-50%)', + 'right': 'translate(-100%,-50%)' + }; + + var classList = this._container.classList; + for (var key in anchorTranslate) { + classList.remove('mapboxgl-popup-anchor-' + key); + } + classList.add('mapboxgl-popup-anchor-' + anchor); + + DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + pos.x + 'px,' + pos.y + 'px)'); + }, + + _onClickClose: function() { + this.remove(); + } +}); + +},{"../geo/lat_lng":18,"../util/dom":95,"../util/evented":97,"../util/util":103}],90:[function(require,module,exports){ +'use strict'; + +module.exports = Actor; + +/** + * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) + * that maintains the relationship between asynchronous tasks and the objects + * that spin them off - in this case, tasks like parsing parts of styles, + * owned by the styles + * + * @param {WebWorker} target + * @param {WebWorker} parent + * @private + */ +function Actor(target, parent) { + this.target = target; + this.parent = parent; + this.callbacks = {}; + this.callbackID = 0; + this.receive = this.receive.bind(this); + this.target.addEventListener('message', this.receive, false); +} + +Actor.prototype.receive = function(message) { + var data = message.data, + callback; + + if (data.type === '') { + callback = this.callbacks[data.id]; + delete this.callbacks[data.id]; + callback(data.error || null, data.data); + } else if (typeof data.id !== 'undefined') { + var id = data.id; + this.parent[data.type](data.data, function(err, data, buffers) { + this.postMessage({ + type: '', + id: String(id), + error: err ? String(err) : null, + data: data + }, buffers); + }.bind(this)); + } else { + this.parent[data.type](data.data); + } +}; + +Actor.prototype.send = function(type, data, callback, buffers) { + var id = null; + if (callback) this.callbacks[id = this.callbackID++] = callback; + this.postMessage({ type: type, id: String(id), data: data }, buffers); +}; + +/** + * Wrapped postMessage API that abstracts around IE's lack of + * `transferList` support. + * + * @param {Object} message + * @param {Object} transferList + * @private + */ +Actor.prototype.postMessage = function(message, transferList) { + try { + this.target.postMessage(message, transferList); + } catch (e) { + this.target.postMessage(message); // No support for transferList on IE + } +}; + +},{}],91:[function(require,module,exports){ +'use strict'; + +exports.getJSON = function(url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onerror = function(e) { + callback(e); + }; + xhr.onload = function() { + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + var data; + try { + data = JSON.parse(xhr.response); + } catch (err) { + return callback(err); + } + callback(null, data); + } else { + callback(new Error(xhr.statusText)); + } + }; + xhr.send(); + return xhr; +}; + +exports.getArrayBuffer = function(url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onerror = function(e) { + callback(e); + }; + xhr.onload = function() { + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + callback(null, xhr.response); + } else { + callback(new Error(xhr.statusText)); + } + }; + xhr.send(); + return xhr; +}; + +function sameOrigin(url) { + var a = document.createElement('a'); + a.href = url; + return a.protocol === document.location.protocol && a.host === document.location.host; +} + +exports.getImage = function(url, callback) { + var img = new Image(); + if (!sameOrigin(url)) { + img.crossOrigin = 'Anonymous'; + } + img.onload = function() { + callback(null, img); + }; + img.src = url; + img.getData = function() { + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + canvas.width = img.width; + canvas.height = img.height; + context.drawImage(img, 0, 0); + return context.getImageData(0, 0, img.width, img.height).data; + }; + return img; +}; + +exports.getVideo = function(urls, callback) { + var video = document.createElement('video'); + video.onloadstart = function() { + callback(null, video); + }; + for (var i = 0; i < urls.length; i++) { + var s = document.createElement('source'); + if (!sameOrigin(urls[i])) { + video.crossOrigin = 'Anonymous'; + } + s.src = urls[i]; + video.appendChild(s); + } + video.getData = function() { return video; }; + return video; +}; + +},{}],92:[function(require,module,exports){ +'use strict'; + +var Canvas = require('./canvas'); + +var frame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + window.msRequestAnimationFrame; + +exports.frame = function(fn) { + return frame(fn); +}; + +var cancel = window.cancelAnimationFrame || + window.mozCancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.msCancelAnimationFrame; + +exports.cancelFrame = function(id) { + cancel(id); +}; + +exports.timed = function (fn, dur, ctx) { + if (!dur) { + fn.call(ctx, 1); + return null; + } + + var abort = false, + start = window.performance ? window.performance.now() : Date.now(); + + function tick(now) { + if (abort) return; + if (!window.performance) now = Date.now(); + + if (now >= start + dur) { + fn.call(ctx, 1); + } else { + fn.call(ctx, (now - start) / dur); + exports.frame(tick); + } + } + + exports.frame(tick); + + return function() { abort = true; }; +}; + +/** + * Test whether the basic JavaScript and DOM features required for Mapbox GL are present. + * @param {Object} options + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected. + * @return {boolean} Returns true if Mapbox GL should be expected to work, and false if not. + * @memberof mapboxgl + * @static + */ +exports.supported = function(options) { + + var supports = [ + + function() { return typeof window !== 'undefined'; }, + + function() { return typeof document !== 'undefined'; }, + + function () { + return !!(Array.prototype && + Array.prototype.every && + Array.prototype.filter && + Array.prototype.forEach && + Array.prototype.indexOf && + Array.prototype.lastIndexOf && + Array.prototype.map && + Array.prototype.some && + Array.prototype.reduce && + Array.prototype.reduceRight && + Array.isArray); + }, + + function() { + return !!(Function.prototype && Function.prototype.bind) && + !!(Object.keys && + Object.create && + Object.getPrototypeOf && + Object.getOwnPropertyNames && + Object.isSealed && + Object.isFrozen && + Object.isExtensible && + Object.getOwnPropertyDescriptor && + Object.defineProperty && + Object.defineProperties && + Object.seal && + Object.freeze && + Object.preventExtensions); + }, + + function() { + return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; + }, + + function() { + return new Canvas().supportsWebGLContext((options && options.failIfMajorPerformanceCaveat) || false); + }, + + function() { return 'Worker' in window; } + ]; + + for (var i = 0; i < supports.length; i++) { + if (!supports[i]()) return false; + } + return true; +}; + +exports.hardwareConcurrency = navigator.hardwareConcurrency || 8; + +Object.defineProperty(exports, 'devicePixelRatio', { + get: function() { return window.devicePixelRatio; } +}); + +},{"./canvas":93}],93:[function(require,module,exports){ +'use strict'; + +var util = require('../util'); + +module.exports = Canvas; + +function Canvas(parent, container) { + this.canvas = document.createElement('canvas'); + + if (parent && container) { + this.canvas.style.position = 'absolute'; + this.canvas.classList.add('mapboxgl-canvas'); + this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false); + this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false); + this.canvas.setAttribute('tabindex', 0); + container.appendChild(this.canvas); + } +} + +Canvas.prototype.resize = function(width, height) { + var pixelRatio = window.devicePixelRatio || 1; + + // Request the required canvas size taking the pixelratio into account. + this.canvas.width = pixelRatio * width; + this.canvas.height = pixelRatio * height; + + // Maintain the same canvas size, potentially downscaling it for HiDPI displays + this.canvas.style.width = width + 'px'; + this.canvas.style.height = height + 'px'; +}; + +var requiredContextAttributes = { + antialias: false, + alpha: true, + stencil: true, + depth: false +}; + +Canvas.prototype.getWebGLContext = function(attributes) { + attributes = util.extend({}, attributes, requiredContextAttributes); + + return this.canvas.getContext('webgl', attributes) || + this.canvas.getContext('experimental-webgl', attributes); +}; + +Canvas.prototype.supportsWebGLContext = function(failIfMajorPerformanceCaveat) { + var attributes = util.extend({ + failIfMajorPerformanceCaveat: failIfMajorPerformanceCaveat + }, requiredContextAttributes); + + if ('probablySupportsContext' in this.canvas) { + return this.canvas.probablySupportsContext('webgl', attributes) || + this.canvas.probablySupportsContext('experimental-webgl', attributes); + } else if ('supportsContext' in this.canvas) { + return this.canvas.supportsContext('webgl', attributes) || + this.canvas.supportsContext('experimental-webgl', attributes); + } + + return !!window.WebGLRenderingContext && !!this.getWebGLContext(failIfMajorPerformanceCaveat); +}; + +Canvas.prototype.getElement = function() { + return this.canvas; +}; + +},{"../util":103}],94:[function(require,module,exports){ +'use strict'; + +var Actor = require('../actor'); +var WebWorkify = require('webworkify'); + +module.exports = Dispatcher; + +function Dispatcher(length, parent) { + this.actors = []; + this.currentActor = 0; + for (var i = 0; i < length; i++) { + var worker = new WebWorkify(require('../../source/worker')); + var actor = new Actor(worker, parent); + actor.name = "Worker " + i; + this.actors.push(actor); + } +} + +Dispatcher.prototype = { + broadcast: function(type, data) { + for (var i = 0; i < this.actors.length; i++) { + this.actors[i].send(type, data); + } + }, + + send: function(type, data, callback, targetID, buffers) { + if (typeof targetID !== 'number' || isNaN(targetID)) { + // Use round robin to send requests to web workers. + targetID = this.currentActor = (this.currentActor + 1) % this.actors.length; + } + + this.actors[targetID].send(type, data, callback, buffers); + return targetID; + }, + + remove: function() { + for (var i = 0; i < this.actors.length; i++) { + this.actors[i].target.terminate(); + } + this.actors = []; + } +}; + +},{"../../source/worker":45,"../actor":90,"webworkify":142}],95:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +exports.create = function (tagName, className, container) { + var el = document.createElement(tagName); + if (className) el.className = className; + if (container) container.appendChild(el); + return el; +}; + +var docStyle = document.documentElement.style; + +function testProp(props) { + for (var i = 0; i < props.length; i++) { + if (props[i] in docStyle) { + return props[i]; + } + } +} + +var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']), + userSelect; +exports.disableDrag = function () { + if (selectProp) { + userSelect = docStyle[selectProp]; + docStyle[selectProp] = 'none'; + } +}; +exports.enableDrag = function () { + if (selectProp) { + docStyle[selectProp] = userSelect; + } +}; + +var transformProp = testProp(['transform', 'WebkitTransform']); +exports.setTransform = function(el, value) { + el.style[transformProp] = value; +}; + +// Suppress the next click, but only if it's immediate. +function suppressClick(e) { + e.preventDefault(); + e.stopPropagation(); + window.removeEventListener('click', suppressClick, true); +} +exports.suppressClick = function() { + window.addEventListener('click', suppressClick, true); + window.setTimeout(function() { + window.removeEventListener('click', suppressClick, true); + }, 0); +}; + +exports.mousePos = function (el, e) { + var rect = el.getBoundingClientRect(); + e = e.touches ? e.touches[0] : e; + return new Point( + e.clientX - rect.left - el.clientLeft, + e.clientY - rect.top - el.clientTop); +}; + +},{"point-geometry":134}],96:[function(require,module,exports){ +'use strict'; + +module.exports = { + HTTP_URL: 'http://a.tiles.mapbox.com', + HTTPS_URL: 'https://a.tiles.mapbox.com', + FORCE_HTTPS: true, + REQUIRE_ACCESS_TOKEN: true +}; + +},{}],97:[function(require,module,exports){ +'use strict'; + +var util = require('./util'); + +/** + * Methods mixed in to other classes for event capabilities. + * @mixin Evented + */ +var Evented = { + + /** + * Subscribe to a specified event with a listener function the latter gets the data object that was passed to `fire` and additionally `target` and `type` properties + * + * @param {string} type Event type + * @param {Function} listener Function to be called when the event is fired + */ + on: function(type, fn) { + this._events = this._events || {}; + this._events[type] = this._events[type] || []; + this._events[type].push(fn); + + return this; + }, + + /** + * Remove a event listener + * + * @param {string} [type] Event type. If none is specified, remove all listeners + * @param {Function} [listener] Function to be called when the event is fired. If none is specified all listeners are removed + */ + off: function(type, fn) { + if (!type) { + // clear all listeners if no arguments specified + delete this._events; + return this; + } + + if (!this.listens(type)) return this; + + if (fn) { + var idx = this._events[type].indexOf(fn); + if (idx >= 0) { + this._events[type].splice(idx, 1); + } + if (!this._events[type].length) { + delete this._events[type]; + } + } else { + delete this._events[type]; + } + + return this; + }, + + /** + * Call a function once when an event has fired + * + * @param {string} type Event type. + * @param {Function} listener Function to be called once when the event is fired + */ + once: function(type, fn) { + var wrapper = function(data) { + this.off(type, wrapper); + fn.call(this, data); + }.bind(this); + this.on(type, wrapper); + return this; + }, + + /** + * Fire event of a given string type with the given data object + * + * @param {string} type Event type + * @param {Object} [data] Optional data passed down to the event object + * @returns {Object} `this` + */ + fire: function(type, data) { + if (!this.listens(type)) return this; + + data = util.extend({}, data); + util.extend(data, {type: type, target: this}); + + // make sure adding/removing listeners inside other listeners won't cause infinite loop + var listeners = this._events[type].slice(); + + for (var i = 0; i < listeners.length; i++) { + listeners[i].call(this, data); + } + + return this; + }, + + /** + * Check if an event is registered to a type + * @param {string} type Event type + * @returns {boolean} `true` if there is at least one registered listener for events of type `type` + */ + listens: function(type) { + return !!(this._events && this._events[type]); + } +}; + +module.exports = Evented; + +},{"./util":103}],98:[function(require,module,exports){ +'use strict'; + +module.exports = Glyphs; + +function Glyphs(pbf, end) { + this.stacks = pbf.readFields(readFontstacks, [], end); +} + +function readFontstacks(tag, stacks, pbf) { + if (tag === 1) { + var fontstack = pbf.readMessage(readFontstack, {glyphs: {}}); + stacks.push(fontstack); + } +} + +function readFontstack(tag, fontstack, pbf) { + if (tag === 1) fontstack.name = pbf.readString(); + else if (tag === 2) fontstack.range = pbf.readString(); + else if (tag === 3) { + var glyph = pbf.readMessage(readGlyph, {}); + fontstack.glyphs[glyph.id] = glyph; + } +} + +function readGlyph(tag, glyph, pbf) { + if (tag === 1) glyph.id = pbf.readVarint(); + else if (tag === 2) glyph.bitmap = pbf.readBytes(); + else if (tag === 3) glyph.width = pbf.readVarint(); + else if (tag === 4) glyph.height = pbf.readVarint(); + else if (tag === 5) glyph.left = pbf.readSVarint(); + else if (tag === 6) glyph.top = pbf.readSVarint(); + else if (tag === 7) glyph.advance = pbf.readVarint(); +} + +},{}],99:[function(require,module,exports){ +'use strict'; + +module.exports = interpolate; + +function interpolate(a, b, t) { + return (a * (1 - t)) + (b * t); +} + +interpolate.number = interpolate; + +interpolate.vec2 = function(from, to, t) { + return [ + interpolate(from[0], to[0], t), + interpolate(from[1], to[1], t) + ]; +}; + +/* + * Interpolate between two colors given as 4-element arrays. + * + * @param {Color} from + * @param {Color} to + * @param {number} t interpolation factor between 0 and 1 + * @returns {Color} interpolated color + */ +interpolate.color = function(from, to, t) { + return [ + interpolate(from[0], to[0], t), + interpolate(from[1], to[1], t), + interpolate(from[2], to[2], t), + interpolate(from[3], to[3], t) + ]; +}; + +interpolate.array = function(from, to, t) { + return from.map(function(d, i) { + return interpolate(d, to[i], t); + }); +}; + +},{}],100:[function(require,module,exports){ +'use strict'; + +var config = require('./config'); +var browser = require('./browser'); + +function normalizeURL(url, pathPrefix, accessToken) { + accessToken = accessToken || config.ACCESS_TOKEN; + + if (!accessToken && config.REQUIRE_ACCESS_TOKEN) { + throw new Error('An API access token is required to use Mapbox GL. ' + + 'See https://www.mapbox.com/developers/api/#access-tokens'); + } + + var https = config.FORCE_HTTPS || + (typeof document !== 'undefined' && document.location.protocol === 'https:'); + + url = url.replace(/^mapbox:\/\//, (https ? config.HTTPS_URL : config.HTTP_URL) + pathPrefix); + url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token='; + + if (config.REQUIRE_ACCESS_TOKEN) { + if (accessToken[0] === 's') { + throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' + + 'See https://www.mapbox.com/developers/api/#access-tokens'); + } + + url += accessToken; + } + + return url; +} + +module.exports.normalizeStyleURL = function(url, accessToken) { + var user = url.match(/^mapbox:\/\/([^.]+)/); + if (!user) + return url; + + return normalizeURL(url, '/styles/v1/' + user[1] + '/', accessToken); +}; + +module.exports.normalizeSourceURL = function(url, accessToken) { + if (!url.match(/^mapbox:\/\//)) + return url; + + url = normalizeURL(url + '.json', '/v4/', accessToken); + + // TileJSON requests need a secure flag appended to their URLs so + // that the server knows to send SSL-ified resource references. + if (url.indexOf('https') === 0) + url += '&secure'; + + return url; +}; + +module.exports.normalizeGlyphsURL = function(url, accessToken) { + if (!url.match(/^mapbox:\/\//)) + return url; + + return normalizeURL(url, '/v4/', accessToken); +}; + +module.exports.normalizeTileURL = function(url, sourceUrl) { + if (!sourceUrl || !sourceUrl.match(/^mapbox:\/\//)) + return url; + return url.replace(/\.((?:png|jpg)\d*)(?=$|\?)/, browser.devicePixelRatio >= 2 ? '@2x.$1' : '.$1'); +}; + +},{"./browser":92,"./config":96}],101:[function(require,module,exports){ +'use strict'; + +/** + * A [most-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) + * with hash lookup made possible by keeping a list of keys in parallel to + * an array of dictionary of values + * + * @param {number} max number of permitted values + * @param {Function} onRemove callback called with items when they expire + * @private + */ +module.exports = MRUCache; +function MRUCache(max, onRemove) { + this.max = max; + this.onRemove = onRemove; + this.reset(); +} + +/** + * Clear the cache + * + * @returns {MRUCache} this cache + * @private + */ +MRUCache.prototype.reset = function() { + for (var key in this.list) { + this.onRemove(this.list[key]); + } + + this.list = {}; + this.order = []; + + return this; +}; + +/** + * Add a key, value combination to the cache, trimming its size if this pushes + * it over max length. + * + * @param {string} key lookup key for the item + * @param {*} data any value + * + * @returns {MRUCache} this cache + * @private + */ +MRUCache.prototype.add = function(key, data) { + this.list[key] = data; + this.order.push(key); + + if (this.order.length > this.max) { + var removedData = this.get(this.order[0]); + if (removedData) this.onRemove(removedData); + } + + return this; +}; + +/** + * Determine whether the value attached to `key` is present + * + * @param {string} key the key to be looked-up + * @returns {boolean} whether the cache has this value + * @private + */ +MRUCache.prototype.has = function(key) { + return key in this.list; +}; + +/** + * List all keys in the cache + * + * @returns {Array} an array of keys in this cache. + * @private + */ +MRUCache.prototype.keys = function() { + return this.order; +}; + +/** + * Get the value attached to a specific key. If the key is not found, + * returns `null` + * + * @param {string} key the key to look up + * @returns {*} the data, or null if it isn't found + * @private + */ +MRUCache.prototype.get = function(key) { + if (!this.has(key)) { return null; } + + var data = this.list[key]; + + delete this.list[key]; + this.order.splice(this.order.indexOf(key), 1); + + return data; +}; + +},{}],102:[function(require,module,exports){ +'use strict'; + +module.exports = resolveTokens; + +/** + * Replace tokens in a string template with values in an object + * + * @param {Object} properties a key/value relationship between tokens and replacements + * @param {string} text the template string + * @returns {string} the template with tokens replaced + * @private + */ +function resolveTokens(properties, text) { + return text.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g, function(match, key) { + return key in properties ? properties[key] : ''; + }); +} + +},{}],103:[function(require,module,exports){ +'use strict'; + +var UnitBezier = require('unitbezier'); + +/** + * Given a value `t` that varies between 0 and 1, return + * an interpolation function that eases between 0 and 1 in a pleasing + * cubic in-out fashion. + * + * @param {number} t input + * @returns {number} input + * @private + */ +exports.easeCubicInOut = function (t) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, + t3 = t2 * t; + return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); +}; + +/** + * Given given (x, y), (x1, y1) control points for a bezier curve, + * return a function that interpolates along that curve. + * + * @param {number} p1x control point 1 x coordinate + * @param {number} p1y control point 1 y coordinate + * @param {number} p2x control point 2 x coordinate + * @param {number} p2y control point 2 y coordinate + * @returns {Function} interpolator: receives number value, returns + * number value. + * @private + */ +exports.bezier = function(p1x, p1y, p2x, p2y) { + var bezier = new UnitBezier(p1x, p1y, p2x, p2y); + return function(t) { + return bezier.solve(t); + }; +}; + +/** + * A default bezier-curve powered easing function with + * control points (0.25, 0.1) and (0.25, 1) + * + * @param {number} t + * @returns {number} output + * @private + */ +exports.ease = exports.bezier(0.25, 0.1, 0.25, 1); + +/** + * Given a four-element array of numbers that represents a color in + * RGBA, return a version for which the RGB components are multiplied + * by the A (alpha) component + * + * @param {Array} c color array + * @returns {Array} premultiplied color array + * @private + */ +exports.premultiply = function (c) { + c[0] *= c[3]; + c[1] *= c[3]; + c[2] *= c[3]; + return c; +}; + +/** + * constrain n to the given range via min + max + * + * @param {number} n value + * @param {number} min the minimum value to be returned + * @param {number} max the maximum value to be returned + * @returns {number} the clamped value + * @private + */ +exports.clamp = function (n, min, max) { + return Math.min(max, Math.max(min, n)); +}; + +/* + * constrain n to the given range via modular arithmetic + * @param {number} n + * @param {number} min + * @param {number} max + * @returns {number} constrained number + * @private + */ +exports.wrap = function (n, min, max) { + var d = max - min; + return n === max ? n : ((n - min) % d + d) % d + min; +}; + +/* + * return the first non-null and non-undefined argument to this function. + * @returns {*} argument + * @private + */ +exports.coalesce = function() { + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (arg !== null && arg !== undefined) + return arg; + } +}; + +/* + * Call an asynchronous function on an array of arguments, + * calling `callback` once all calls complete. + * + * @param {Array<*>} array input to each call of the async function. + * @param {Function} fn an async function with signature (data, callback) + * @param {Function} callback a callback run after all async work is done. + * called with no arguments + * @returns {undefined} + * @private + */ +exports.asyncEach = function (array, fn, callback) { + var remaining = array.length; + if (remaining === 0) return callback(); + function check() { if (--remaining === 0) callback(); } + for (var i = 0; i < array.length; i++) fn(array[i], check); +}; + +/* + * Compute the difference between the keys in one object and the keys + * in another object. + * + * @param {Object} obj + * @param {Object} other + * @returns {Array} keys difference + * @private + */ +exports.keysDifference = function (obj, other) { + var difference = []; + for (var i in obj) { + if (!(i in other)) { + difference.push(i); + } + } + return difference; +}; + +/** + * Given a destination object and optionally many source objects, + * copy all properties from the source objects into the destination. + * The last source object given overrides properties from previous + * source objects. + * @param {Object} dest destination object + * @param {...Object} sources sources from which properties are pulled + * @returns {Object} dest + * @private + */ +exports.extend = function (dest) { + for (var i = 1; i < arguments.length; i++) { + var src = arguments[i]; + for (var k in src) { + dest[k] = src[k]; + } + } + return dest; +}; + +/** + * Extend a destination object with all properties of the src object, + * using defineProperty instead of simple assignment. + * @param {Object} dest + * @param {Object} src + * @returns {Object} dest + * @private + */ +exports.extendAll = function (dest, src) { + for (var i in src) { + Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i)); + } + return dest; +}; + +/** + * Extend a parent's prototype with all properties in a properties + * object. + * + * @param {Object} parent + * @param {Object} props + * @returns {Object} + * @private + */ +exports.inherit = function (parent, props) { + var parentProto = typeof parent === 'function' ? parent.prototype : parent, + proto = Object.create(parentProto); + exports.extendAll(proto, props); + return proto; +}; + +/** + * Given an object and a number of properties as strings, return version + * of that object with only those properties. + * + * @param {Object} src the object + * @param {Array} properties an array of property names chosen + * to appear on the resulting object. + * @returns {Object} object with limited properties. + * @example + * var foo = { name: 'Charlie', age: 10 }; + * var justName = pick(foo, ['name']); + * // justName = { name: 'Charlie' } + * @private + */ +exports.pick = function (src, properties) { + var result = {}; + for (var i = 0; i < properties.length; i++) { + var k = properties[i]; + if (k in src) { + result[k] = src[k]; + } + } + return result; +}; + +var id = 1; + +/** + * Return a unique numeric id, starting at 1 and incrementing with + * each call. + * + * @returns {number} unique numeric id. + * @private + */ +exports.uniqueId = function () { + return id++; +}; + +/** + * Create a version of `fn` that only fires once every `time` millseconds. + * + * @param {Function} fn the function to be throttled + * @param {number} time millseconds required between function calls + * @param {*} context the value of `this` with which the function is called + * @returns {Function} debounced function + * @private + */ +exports.throttle = function (fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; + } + }; + + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; + + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } + }; + + return wrapperFn; +}; + +/** + * Create a version of `fn` that is only called `time` milliseconds + * after its last invocation + * + * @param {Function} fn the function to be debounced + * @param {number} time millseconds after which the function will be invoked + * @returns {Function} debounced function + * @private + */ +exports.debounce = function(fn, time) { + var timer, args; + + return function() { + args = arguments; + clearTimeout(timer); + + timer = setTimeout(function() { + fn.apply(null, args); + }, time); + }; +}; + +/** + * Given an array of member function names as strings, replace all of them + * with bound versions that will always refer to `context` as `this`. This + * is useful for classes where otherwise event bindings would reassign + * `this` to the evented object or some other value: this lets you ensure + * the `this` value always. + * + * @param {Array} fns list of member function names + * @param {*} context the context value + * @returns {undefined} changes functions in-place + * @example + * function MyClass() { + * bindAll(['ontimer'], this); + * this.name = 'Tom'; + * } + * MyClass.prototype.ontimer = function() { + * alert(this.name); + * }; + * var myClass = new MyClass(); + * setTimeout(myClass.ontimer, 100); + * @private + */ +exports.bindAll = function(fns, context) { + fns.forEach(function(fn) { + context[fn] = context[fn].bind(context); + }); +}; + +exports.bindHandlers = function(context) { + for (var i in context) { + if (typeof context[i] === 'function' && i.indexOf('_on') === 0) { + context[i] = context[i].bind(context); + } + } +}; + +/** + * Set the 'options' property on `obj` with properties + * from the `options` argument. Properties in the `options` + * object will override existing properties. + * + * @param {Object} obj destination object + * @param {Object} options object of override options + * @returns {Object} derived options object. + * @private + */ +exports.setOptions = function(obj, options) { + if (!obj.hasOwnProperty('options')) { + obj.options = obj.options ? Object.create(obj.options) : {}; + } + for (var i in options) { + obj.options[i] = options[i]; + } + return obj.options; +}; + +},{"unitbezier":137}],104:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],105:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + currentQueue[queueIndex].run(); + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],106:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],107:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./support/isBuffer":106,"_process":105,"inherits":104}],108:[function(require,module,exports){ +// (c) Dean McNamee , 2012. +// +// https://github.com/deanm/css-color-parser-js +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +// http://www.w3.org/TR/css3-color/ +var kCSSColorTable = { + "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], + "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], + "aquamarine": [127,255,212,1], "azure": [240,255,255,1], + "beige": [245,245,220,1], "bisque": [255,228,196,1], + "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], + "blue": [0,0,255,1], "blueviolet": [138,43,226,1], + "brown": [165,42,42,1], "burlywood": [222,184,135,1], + "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], + "chocolate": [210,105,30,1], "coral": [255,127,80,1], + "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], + "crimson": [220,20,60,1], "cyan": [0,255,255,1], + "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], + "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], + "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], + "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], + "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], + "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], + "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], + "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], + "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], + "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], + "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], + "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], + "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], + "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], + "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], + "gold": [255,215,0,1], "goldenrod": [218,165,32,1], + "gray": [128,128,128,1], "green": [0,128,0,1], + "greenyellow": [173,255,47,1], "grey": [128,128,128,1], + "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], + "indianred": [205,92,92,1], "indigo": [75,0,130,1], + "ivory": [255,255,240,1], "khaki": [240,230,140,1], + "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], + "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], + "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], + "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], + "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], + "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], + "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], + "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], + "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], + "lightyellow": [255,255,224,1], "lime": [0,255,0,1], + "limegreen": [50,205,50,1], "linen": [250,240,230,1], + "magenta": [255,0,255,1], "maroon": [128,0,0,1], + "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], + "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], + "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], + "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], + "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], + "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], + "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], + "navy": [0,0,128,1], "oldlace": [253,245,230,1], + "olive": [128,128,0,1], "olivedrab": [107,142,35,1], + "orange": [255,165,0,1], "orangered": [255,69,0,1], + "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], + "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], + "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], + "peachpuff": [255,218,185,1], "peru": [205,133,63,1], + "pink": [255,192,203,1], "plum": [221,160,221,1], + "powderblue": [176,224,230,1], "purple": [128,0,128,1], + "red": [255,0,0,1], "rosybrown": [188,143,143,1], + "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], + "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], + "seagreen": [46,139,87,1], "seashell": [255,245,238,1], + "sienna": [160,82,45,1], "silver": [192,192,192,1], + "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], + "slategray": [112,128,144,1], "slategrey": [112,128,144,1], + "snow": [255,250,250,1], "springgreen": [0,255,127,1], + "steelblue": [70,130,180,1], "tan": [210,180,140,1], + "teal": [0,128,128,1], "thistle": [216,191,216,1], + "tomato": [255,99,71,1], "turquoise": [64,224,208,1], + "violet": [238,130,238,1], "wheat": [245,222,179,1], + "white": [255,255,255,1], "whitesmoke": [245,245,245,1], + "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} + +function clamp_css_byte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; +} + +function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; +} + +function parse_css_int(str) { // int or percentage. + if (str[str.length - 1] === '%') + return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseInt(str)); +} + +function parse_css_float(str) { // float or percentage. + if (str[str.length - 1] === '%') + return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str)); +} + +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) h += 1; + else if (h > 1) h -= 1; + + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; + return m1; +} + +function parseCSSColor(css_str) { + // Remove all whitespace, not compliant, but should just be more accepting. + var str = css_str.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. + + // #abc and #abc123 syntax. + if (str[0] === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. + return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1]; + } else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. + return [(iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1]; + } + + return null; + } + + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op+1, ep-(op+1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'rgb': + if (params.length !== 3) return null; + return [parse_css_int(params[0]), + parse_css_int(params[1]), + parse_css_int(params[2]), + alpha]; + case 'hsla': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'hsl': + if (params.length !== 3) return null; + var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parse_css_float(params[1]); + var l = parse_css_float(params[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), + alpha]; + default: + return null; + } + } + + return null; +} + +try { exports.parseCSSColor = parseCSSColor } catch(e) { } + +},{}],109:[function(require,module,exports){ +'use strict'; + +var VectorTileFeatureTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; + +function infix(operator) { + return function(_, key, value) { + if (key === '$type') { + return 't' + operator + VectorTileFeatureTypes.indexOf(value); + } else { + return 'p[' + JSON.stringify(key) + ']' + operator + JSON.stringify(value); + } + }; +} + +function strictInfix(operator) { + var nonstrictInfix = infix(operator); + return function(_, key, value) { + if (key === '$type') { + return nonstrictInfix(_, key, value); + } else { + return 'typeof(p[' + JSON.stringify(key) + ']) === typeof(' + JSON.stringify(value) + ') && ' + + nonstrictInfix(_, key, value); + } + }; +} + +var operators = { + '==': infix('==='), + '!=': infix('!=='), + '>': strictInfix('>'), + '<': strictInfix('<'), + '<=': strictInfix('<='), + '>=': strictInfix('>='), + 'in': function(_, key) { + return Array.prototype.slice.call(arguments, 2).map(function(value) { + return '(' + operators['=='](_, key, value) + ')'; + }).join('||') || 'false'; + }, + '!in': function() { + return '!(' + operators.in.apply(this, arguments) + ')'; + }, + 'any': function() { + return Array.prototype.slice.call(arguments, 1).map(function(filter) { + return '(' + compile(filter) + ')'; + }).join('||') || 'false'; + }, + 'all': function() { + return Array.prototype.slice.call(arguments, 1).map(function(filter) { + return '(' + compile(filter) + ')'; + }).join('&&') || 'true'; + }, + 'none': function() { + return '!(' + operators.any.apply(this, arguments) + ')'; + } +}; + +function compile(filter) { + return operators[filter[0]].apply(filter, filter); +} + +function truth() { + return true; +} + +/** + * Given a filter expressed as nested arrays, return a new function + * that evaluates whether a given feature (with a .properties or .tags property) + * passes its test. + * + * @param {Array} filter mapbox gl filter + * @returns {Function} filter-evaluating function + */ +module.exports = function (filter) { + if (!filter) return truth; + var filterStr = 'var p = f.properties || f.tags || {}, t = f.type; return ' + compile(filter) + ';'; + // jshint evil: true + return new Function('f', filterStr); +}; + +},{}],110:[function(require,module,exports){ +'use strict'; + +module.exports = clip; + +/* clip features between two axis-parallel lines: + * | | + * ___|___ | / + * / | \____|____/ + * | | + */ + +function clip(features, scale, k1, k2, axis, intersect, minAll, maxAll) { + + k1 /= scale; + k2 /= scale; + + if (minAll >= k1 && maxAll <= k2) return features; // trivial accept + else if (minAll > k2 || maxAll < k1) return null; // trivial reject + + var clipped = []; + + for (var i = 0; i < features.length; i++) { + + var feature = features[i], + geometry = feature.geometry, + type = feature.type, + min, max; + + min = feature.min[axis]; + max = feature.max[axis]; + + if (min >= k1 && max <= k2) { // trivial accept + clipped.push(feature); + continue; + } else if (min > k2 || max < k1) continue; // trivial reject + + var slices = type === 1 ? + clipPoints(geometry, k1, k2, axis) : + clipGeometry(geometry, k1, k2, axis, intersect, type === 3); + + if (slices.length) { + // if a feature got clipped, it will likely get clipped on the next zoom level as well, + // so there's no need to recalculate bboxes + clipped.push({ + geometry: slices, + type: type, + tags: features[i].tags || null, + min: feature.min, + max: feature.max + }); + } + } + + return clipped.length ? clipped : null; +} + +function clipPoints(geometry, k1, k2, axis) { + var slice = []; + + for (var i = 0; i < geometry.length; i++) { + var a = geometry[i], + ak = a[axis]; + + if (ak >= k1 && ak <= k2) slice.push(a); + } + return slice; +} + +function clipGeometry(geometry, k1, k2, axis, intersect, closed) { + + var slices = []; + + for (var i = 0; i < geometry.length; i++) { + + var ak = 0, + bk = 0, + b = null, + points = geometry[i], + area = points.area, + dist = points.dist, + len = points.length, + a, j, last; + + var slice = []; + + for (j = 0; j < len - 1; j++) { + a = b || points[j]; + b = points[j + 1]; + ak = bk || a[axis]; + bk = b[axis]; + + if (ak < k1) { + + if ((bk > k2)) { // ---|-----|--> + slice.push(intersect(a, b, k1), intersect(a, b, k2)); + if (!closed) slice = newSlice(slices, slice, area, dist); + + } else if (bk >= k1) slice.push(intersect(a, b, k1)); // ---|--> | + + } else if (ak > k2) { + + if ((bk < k1)) { // <--|-----|--- + slice.push(intersect(a, b, k2), intersect(a, b, k1)); + if (!closed) slice = newSlice(slices, slice, area, dist); + + } else if (bk <= k2) slice.push(intersect(a, b, k2)); // | <--|--- + + } else { + + slice.push(a); + + if (bk < k1) { // <--|--- | + slice.push(intersect(a, b, k1)); + if (!closed) slice = newSlice(slices, slice, area, dist); + + } else if (bk > k2) { // | ---|--> + slice.push(intersect(a, b, k2)); + if (!closed) slice = newSlice(slices, slice, area, dist); + } + // | --> | + } + } + + // add the last point + a = points[len - 1]; + ak = a[axis]; + if (ak >= k1 && ak <= k2) slice.push(a); + + // close the polygon if its endpoints are not the same after clipping + + last = slice[slice.length - 1]; + if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) slice.push(slice[0]); + + // add the final slice + newSlice(slices, slice, area, dist); + } + + return slices; +} + +function newSlice(slices, slice, area, dist) { + if (slice.length) { + // we don't recalculate the area/length of the unclipped geometry because the case where it goes + // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work + slice.area = area; + slice.dist = dist; + + slices.push(slice); + } + return []; +} + +},{}],111:[function(require,module,exports){ +'use strict'; + +module.exports = convert; + +var simplify = require('./simplify'); + +// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data + +function convert(data, tolerance) { + var features = []; + + if (data.type === 'FeatureCollection') { + for (var i = 0; i < data.features.length; i++) { + convertFeature(features, data.features[i], tolerance); + } + } else if (data.type === 'Feature') { + convertFeature(features, data, tolerance); + + } else { + // single geometry or a geometry collection + convertFeature(features, {geometry: data}, tolerance); + } + return features; +} + +function convertFeature(features, feature, tolerance) { + var geom = feature.geometry, + type = geom.type, + coords = geom.coordinates, + tags = feature.properties, + i, j, rings; + + if (type === 'Point') { + features.push(create(tags, 1, [projectPoint(coords)])); + + } else if (type === 'MultiPoint') { + features.push(create(tags, 1, project(coords))); + + } else if (type === 'LineString') { + features.push(create(tags, 2, [project(coords, tolerance)])); + + } else if (type === 'MultiLineString' || type === 'Polygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + rings.push(project(coords[i], tolerance)); + } + features.push(create(tags, type === 'Polygon' ? 3 : 2, rings)); + + } else if (type === 'MultiPolygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + rings.push(project(coords[i][j], tolerance)); + } + } + features.push(create(tags, 3, rings)); + + } else if (type === 'GeometryCollection') { + for (i = 0; i < geom.geometries.length; i++) { + convertFeature(features, { + geometry: geom.geometries[i], + properties: tags + }, tolerance); + } + + } else { + throw new Error('Input data is not a valid GeoJSON object.'); + } +} + +function create(tags, type, geometry) { + var feature = { + geometry: geometry, + type: type, + tags: tags || null, + min: [2, 1], // initial bbox values; + max: [-1, 0] // note that coords are usually in [0..1] range + }; + calcBBox(feature); + return feature; +} + +function project(lonlats, tolerance) { + var projected = []; + for (var i = 0; i < lonlats.length; i++) { + projected.push(projectPoint(lonlats[i])); + } + if (tolerance) { + simplify(projected, tolerance); + calcSize(projected); + } + return projected; +} + +function projectPoint(p) { + var sin = Math.sin(p[1] * Math.PI / 180), + x = (p[0] / 360 + 0.5), + y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); + + y = y < -1 ? -1 : + y > 1 ? 1 : y; + + return [x, y, 0]; +} + +// calculate area and length of the poly +function calcSize(points) { + var area = 0, + dist = 0; + + for (var i = 0, a, b; i < points.length - 1; i++) { + a = b || points[i]; + b = points[i + 1]; + + area += a[0] * b[1] - b[0] * a[1]; + + // use Manhattan distance instead of Euclidian one to avoid expensive square root computation + dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]); + } + points.area = Math.abs(area / 2); + points.dist = dist; +} + +// calculate the feature bounding box for faster clipping later +function calcBBox(feature) { + var geometry = feature.geometry, + min = feature.min, + max = feature.max; + + if (feature.type === 1) calcRingBBox(min, max, geometry); + else for (var i = 0; i < geometry.length; i++) calcRingBBox(min, max, geometry[i]); + + return feature; +} + +function calcRingBBox(min, max, points) { + for (var i = 0, p; i < points.length; i++) { + p = points[i]; + min[0] = Math.min(p[0], min[0]); + max[0] = Math.max(p[0], max[0]); + min[1] = Math.min(p[1], min[1]); + max[1] = Math.max(p[1], max[1]); + } +} + +},{"./simplify":113}],112:[function(require,module,exports){ +'use strict'; + +module.exports = geojsonvt; + +var convert = require('./convert'), // GeoJSON conversion and preprocessing + clip = require('./clip'), // stripe clipping algorithm + wrap = require('./wrap'), // date line processing + createTile = require('./tile'); // final simplified tile generation + + +function geojsonvt(data, options) { + return new GeoJSONVT(data, options); +} + +function GeoJSONVT(data, options) { + options = this.options = extend(Object.create(this.options), options); + + var debug = options.debug; + + if (debug) console.time('preprocess data'); + + var z2 = 1 << options.maxZoom, // 2^z + features = convert(data, options.tolerance / (z2 * options.extent)); + + this.tiles = {}; + + if (debug) { + console.timeEnd('preprocess data'); + console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); + console.time('generate tiles'); + this.stats = {}; + this.total = 0; + } + + features = wrap(features, options.buffer / options.extent, intersectX); + + // start slicing from the top tile down + this.splitTile(features, 0, 0, 0); + + if (debug) { + console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); + console.timeEnd('generate tiles'); + console.log('tiles generated:', this.total, JSON.stringify(this.stats)); + } +} + +GeoJSONVT.prototype.options = { + maxZoom: 14, // max zoom to preserve detail on + indexMaxZoom: 5, // max zoom in the tile index + indexMaxPoints: 100000, // max number of points per tile in the tile index + tolerance: 3, // simplification tolerance (higher means simpler) + extent: 4096, // tile extent + buffer: 64, // tile buffer on each side + debug: 0 // logging level (0, 1 or 2) +}; + +GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { + + var stack = [features, z, x, y], + options = this.options, + debug = options.debug, + extent = options.extent, + buffer = options.buffer; + + // avoid recursion by using a processing queue + while (stack.length) { + features = stack.shift(); + z = stack.shift(); + x = stack.shift(); + y = stack.shift(); + + var z2 = 1 << z, + id = toID(z, x, y), + tile = this.tiles[id], + tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * extent); + + if (!tile) { + if (debug > 1) console.time('creation'); + + tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom); + + if (debug) { + if (debug > 1) { + console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', + z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); + console.timeEnd('creation'); + } + var key = 'z' + z; + this.stats[key] = (this.stats[key] || 0) + 1; + this.total++; + } + } + + // save reference to original geometry in tile so that we can drill down later if we stop now + tile.source = features; + + // stop tiling if the tile is degenerate + if (isClippedSquare(tile.features, extent, buffer)) continue; + + // if it's the first-pass tiling + if (!cz) { + // stop tiling if we reached max zoom, or if the tile is too simple + if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue; + + // if a drilldown to a specific tile + } else { + // stop tiling if we reached base zoom or our target tile zoom + if (z === options.maxZoom || z === cz) continue; + + // stop tiling if it's not an ancestor of the target tile + var m = 1 << (cz - z); + if (x !== Math.floor(cx / m) && y !== Math.floor(cy / m)) continue; + } + + // if we slice further down, no need to keep source geometry + tile.source = null; + + if (debug > 1) console.time('clipping'); + + // values we'll use for clipping + var k1 = 0.5 * buffer / extent, + k2 = 0.5 - k1, + k3 = 0.5 + k1, + k4 = 1 + k1, + tl, bl, tr, br, left, right; + + tl = bl = tr = br = null; + + left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]); + right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]); + + if (left) { + tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); + bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); + } + + if (right) { + tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); + br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); + } + + if (debug > 1) console.timeEnd('clipping'); + + if (tl) stack.push(tl, z + 1, x * 2, y * 2); + if (bl) stack.push(bl, z + 1, x * 2, y * 2 + 1); + if (tr) stack.push(tr, z + 1, x * 2 + 1, y * 2); + if (br) stack.push(br, z + 1, x * 2 + 1, y * 2 + 1); + } +}; + +GeoJSONVT.prototype.getTile = function (z, x, y) { + var options = this.options, + extent = options.extent, + debug = options.debug; + + var z2 = 1 << z; + x = ((x % z2) + z2) % z2; // wrap tile x coordinate + + var id = toID(z, x, y); + if (this.tiles[id]) return transformTile(this.tiles[id], extent); + + if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y); + + var z0 = z, + x0 = x, + y0 = y, + parent; + + while (!parent && z0 > 0) { + z0--; + x0 = Math.floor(x0 / 2); + y0 = Math.floor(y0 / 2); + parent = this.tiles[toID(z0, x0, y0)]; + } + + if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0); + + // if we found a parent tile containing the original geometry, we can drill down from it + if (parent.source) { + if (isClippedSquare(parent.features, options.extent, options.buffer)) return transformTile(parent, extent); + + if (debug > 1) console.time('drilling down'); + this.splitTile(parent.source, z0, x0, y0, z, x, y); + if (debug > 1) console.timeEnd('drilling down'); + } + + return transformTile(this.tiles[id], extent); +}; + +function transformTile(tile, extent) { + if (!tile || tile.transformed) return tile; + + var z2 = tile.z2, + tx = tile.x, + ty = tile.y, + i, j, k; + + for (i = 0; i < tile.features.length; i++) { + var feature = tile.features[i], + geom = feature.geometry, + type = feature.type; + + if (type === 1) { + for (j = 0; j < geom.length; j++) geom[j] = transformPoint(geom[j], extent, z2, tx, ty); + + } else { + for (j = 0; j < geom.length; j++) { + var ring = geom[j]; + for (k = 0; k < ring.length; k++) ring[k] = transformPoint(ring[k], extent, z2, tx, ty); + } + } + } + + tile.transformed = true; + + return tile; +} + +function transformPoint(p, extent, z2, tx, ty) { + var x = Math.round(extent * (p[0] * z2 - tx)), + y = Math.round(extent * (p[1] * z2 - ty)); + return [x, y]; +} + +// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further +function isClippedSquare(features, extent, buffer) { + if (features.length !== 1) return false; + + var feature = features[0]; + if (feature.type !== 3 || feature.geometry.length > 1) return false; + + for (var i = 0; i < feature.geometry[0].length; i++) { + var p = feature.geometry[0][i]; + if ((p[0] !== -buffer && p[0] !== extent + buffer) || + (p[1] !== -buffer && p[1] !== extent + buffer)) return false; + } + return true; +} + +function toID(z, x, y) { + return (((1 << z) * y + x) * 32) + z; +} + +function intersectX(a, b, x) { + return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1]; +} +function intersectY(a, b, y) { + return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1]; +} + +function extend(dest, src) { + for (var i in src) dest[i] = src[i]; + return dest; +} + +},{"./clip":110,"./convert":111,"./tile":114,"./wrap":115}],113:[function(require,module,exports){ +'use strict'; + +module.exports = simplify; + +// calculate simplification data using optimized Douglas-Peucker algorithm + +function simplify(points, tolerance) { + + var sqTolerance = tolerance * tolerance, + len = points.length, + first = 0, + last = len - 1, + stack = [], + i, maxSqDist, sqDist, index; + + // always retain the endpoints (1 is the max value) + points[first][2] = 1; + points[last][2] = 1; + + // avoid recursion by using a stack + while (last) { + + maxSqDist = 0; + + for (i = first + 1; i < last; i++) { + sqDist = getSqSegDist(points[i], points[first], points[last]); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate + stack.push(first); + stack.push(index); + first = index; + + } else { + last = stack.pop(); + first = stack.pop(); + } + } +} + +// square distance from a point to a segment +function getSqSegDist(p, a, b) { + + var x = a[0], y = a[1], + bx = b[0], by = b[1], + px = p[0], py = p[1], + dx = bx - x, + dy = by - y; + + if (dx !== 0 || dy !== 0) { + + var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = bx; + y = by; + + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = px - x; + dy = py - y; + + return dx * dx + dy * dy; +} + +},{}],114:[function(require,module,exports){ +'use strict'; + +module.exports = createTile; + +function createTile(features, z2, tx, ty, tolerance, noSimplify) { + var tile = { + features: [], + numPoints: 0, + numSimplified: 0, + numFeatures: 0, + source: null, + x: tx, + y: ty, + z2: z2, + transformed: false, + min: [2, 1], + max: [-1, 0] + }; + for (var i = 0; i < features.length; i++) { + tile.numFeatures++; + addFeature(tile, features[i], tolerance, noSimplify); + + var min = features[i].min, + max = features[i].max; + + if (min[0] < tile.min[0]) tile.min[0] = min[0]; + if (min[1] < tile.min[1]) tile.min[1] = min[1]; + if (max[0] > tile.max[0]) tile.max[0] = max[0]; + if (max[1] > tile.max[1]) tile.max[1] = max[1]; + } + return tile; +} + +function addFeature(tile, feature, tolerance, noSimplify) { + + var geom = feature.geometry, + type = feature.type, + simplified = [], + sqTolerance = tolerance * tolerance, + i, j, ring, p; + + if (type === 1) { + for (i = 0; i < geom.length; i++) { + simplified.push(geom[i]); + tile.numPoints++; + tile.numSimplified++; + } + + } else { + + // simplify and transform projected coordinates for tile geometry + for (i = 0; i < geom.length; i++) { + ring = geom[i]; + + // filter out tiny polylines & polygons + if (!noSimplify && ((type === 2 && ring.dist < tolerance) || + (type === 3 && ring.area < sqTolerance))) { + tile.numPoints += ring.length; + continue; + } + + var simplifiedRing = []; + + for (j = 0; j < ring.length; j++) { + p = ring[j]; + // keep points with importance > tolerance + if (noSimplify || p[2] > sqTolerance) { + simplifiedRing.push(p); + tile.numSimplified++; + } + tile.numPoints++; + } + + simplified.push(simplifiedRing); + } + } + + if (simplified.length) { + tile.features.push({ + geometry: simplified, + type: type, + tags: feature.tags || null + }); + } +} + +},{}],115:[function(require,module,exports){ +'use strict'; + +var clip = require('./clip'); + +module.exports = wrap; + +function wrap(features, buffer, intersectX) { + var merged = features, + left = clip(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy + right = clip(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy + + if (left || right) { + merged = clip(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2); // center world copy + + if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center + if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center + } + + return merged; +} + +function shiftFeatureCoords(features, offset) { + var newFeatures = []; + + for (var i = 0; i < features.length; i++) { + var feature = features[i], + type = feature.type; + + var newGeometry; + + if (type === 1) { + newGeometry = shiftCoords(feature.geometry, offset); + } else { + newGeometry = []; + for (var j = 0; j < feature.geometry.length; j++) { + newGeometry.push(shiftCoords(feature.geometry[j], offset)); + } + } + + newFeatures.push({ + geometry: newGeometry, + type: type, + tags: feature.tags, + min: [feature.min[0] + offset, feature.min[1]], + max: [feature.max[0] + offset, feature.max[1]] + }); + } + + return newFeatures; +} + +function shiftCoords(points, offset) { + var newPoints = []; + newPoints.area = points.area; + newPoints.dist = points.dist; + + for (var i = 0; i < points.length; i++) { + newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]); + } + return newPoints; +} + +},{"./clip":110}],116:[function(require,module,exports){ +/** + * @fileoverview gl-matrix - High performance matrix and vector operations + * @author Brandon Jones + * @author Colin MacKenzie IV + * @version 2.3.0 + */ + +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ +// END HEADER + +exports.glMatrix = require("./gl-matrix/common.js"); +exports.mat2 = require("./gl-matrix/mat2.js"); +exports.mat2d = require("./gl-matrix/mat2d.js"); +exports.mat3 = require("./gl-matrix/mat3.js"); +exports.mat4 = require("./gl-matrix/mat4.js"); +exports.quat = require("./gl-matrix/quat.js"); +exports.vec2 = require("./gl-matrix/vec2.js"); +exports.vec3 = require("./gl-matrix/vec3.js"); +exports.vec4 = require("./gl-matrix/vec4.js"); +},{"./gl-matrix/common.js":117,"./gl-matrix/mat2.js":118,"./gl-matrix/mat2d.js":119,"./gl-matrix/mat3.js":120,"./gl-matrix/mat4.js":121,"./gl-matrix/quat.js":122,"./gl-matrix/vec2.js":123,"./gl-matrix/vec3.js":124,"./gl-matrix/vec4.js":125}],117:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +/** + * @class Common utilities + * @name glMatrix + */ +var glMatrix = {}; + +// Constants +glMatrix.EPSILON = 0.000001; +glMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array; +glMatrix.RANDOM = Math.random; + +/** + * Sets the type of array used when creating new vectors and matrices + * + * @param {Type} type Array type, such as Float32Array or Array + */ +glMatrix.setMatrixArrayType = function(type) { + GLMAT_ARRAY_TYPE = type; +} + +var degree = Math.PI / 180; + +/** +* Convert Degree To Radian +* +* @param {Number} Angle in Degrees +*/ +glMatrix.toRadian = function(a){ + return a * degree; +} + +module.exports = glMatrix; + +},{}],118:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 2x2 Matrix + * @name mat2 + */ +var mat2 = {}; + +/** + * Creates a new identity mat2 + * + * @returns {mat2} a new 2x2 matrix + */ +mat2.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +}; + +/** + * Creates a new mat2 initialized with values from an existing matrix + * + * @param {mat2} a matrix to clone + * @returns {mat2} a new 2x2 matrix + */ +mat2.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +}; + +/** + * Copy the values from one mat2 to another + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ +mat2.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +}; + +/** + * Set a mat2 to the identity matrix + * + * @param {mat2} out the receiving matrix + * @returns {mat2} out + */ +mat2.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +}; + +/** + * Transpose the values of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ +mat2.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a1 = a[1]; + out[1] = a[2]; + out[2] = a1; + } else { + out[0] = a[0]; + out[1] = a[2]; + out[2] = a[1]; + out[3] = a[3]; + } + + return out; +}; + +/** + * Inverts a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ +mat2.invert = function(out, a) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + + // Calculate the determinant + det = a0 * a3 - a2 * a1; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = a3 * det; + out[1] = -a1 * det; + out[2] = -a2 * det; + out[3] = a0 * det; + + return out; +}; + +/** + * Calculates the adjugate of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ +mat2.adjoint = function(out, a) { + // Caching this value is nessecary if out == a + var a0 = a[0]; + out[0] = a[3]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a0; + + return out; +}; + +/** + * Calculates the determinant of a mat2 + * + * @param {mat2} a the source matrix + * @returns {Number} determinant of a + */ +mat2.determinant = function (a) { + return a[0] * a[3] - a[2] * a[1]; +}; + +/** + * Multiplies two mat2's + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the first operand + * @param {mat2} b the second operand + * @returns {mat2} out + */ +mat2.multiply = function (out, a, b) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + return out; +}; + +/** + * Alias for {@link mat2.multiply} + * @function + */ +mat2.mul = mat2.multiply; + +/** + * Rotates a mat2 by the given angle + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ +mat2.rotate = function (out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + return out; +}; + +/** + * Scales the mat2 by the dimensions in the given vec2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the matrix to rotate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat2} out + **/ +mat2.scale = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + v0 = v[0], v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + return out; +}; + +/** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.rotate(dest, dest, rad); + * + * @param {mat2} out mat2 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ +mat2.fromRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + return out; +} + +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.scale(dest, dest, vec); + * + * @param {mat2} out mat2 receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat2} out + */ +mat2.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + return out; +} + +/** + * Returns a string representation of a mat2 + * + * @param {mat2} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ +mat2.str = function (a) { + return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; +}; + +/** + * Returns Frobenius norm of a mat2 + * + * @param {mat2} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ +mat2.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2))) +}; + +/** + * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix + * @param {mat2} L the lower triangular matrix + * @param {mat2} D the diagonal matrix + * @param {mat2} U the upper triangular matrix + * @param {mat2} a the input matrix to factorize + */ + +mat2.LDU = function (L, D, U, a) { + L[2] = a[2]/a[0]; + U[0] = a[0]; + U[1] = a[1]; + U[3] = a[3] - L[2] * U[1]; + return [L, D, U]; +}; + + +module.exports = mat2; + +},{"./common.js":117}],119:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 2x3 Matrix + * @name mat2d + * + * @description + * A mat2d contains six elements defined as: + *
+ * [a, c, tx,
+ *  b, d, ty]
+ * 
+ * This is a short form for the 3x3 matrix: + *
+ * [a, c, tx,
+ *  b, d, ty,
+ *  0, 0, 1]
+ * 
+ * The last row is ignored so the array is shorter and operations are faster. + */ +var mat2d = {}; + +/** + * Creates a new identity mat2d + * + * @returns {mat2d} a new 2x3 matrix + */ +mat2d.create = function() { + var out = new glMatrix.ARRAY_TYPE(6); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; +}; + +/** + * Creates a new mat2d initialized with values from an existing matrix + * + * @param {mat2d} a matrix to clone + * @returns {mat2d} a new 2x3 matrix + */ +mat2d.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(6); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; +}; + +/** + * Copy the values from one mat2d to another + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the source matrix + * @returns {mat2d} out + */ +mat2d.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; +}; + +/** + * Set a mat2d to the identity matrix + * + * @param {mat2d} out the receiving matrix + * @returns {mat2d} out + */ +mat2d.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; +}; + +/** + * Inverts a mat2d + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the source matrix + * @returns {mat2d} out + */ +mat2d.invert = function(out, a) { + var aa = a[0], ab = a[1], ac = a[2], ad = a[3], + atx = a[4], aty = a[5]; + + var det = aa * ad - ab * ac; + if(!det){ + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; +}; + +/** + * Calculates the determinant of a mat2d + * + * @param {mat2d} a the source matrix + * @returns {Number} determinant of a + */ +mat2d.determinant = function (a) { + return a[0] * a[3] - a[1] * a[2]; +}; + +/** + * Multiplies two mat2d's + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the first operand + * @param {mat2d} b the second operand + * @returns {mat2d} out + */ +mat2d.multiply = function (out, a, b) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + out[4] = a0 * b4 + a2 * b5 + a4; + out[5] = a1 * b4 + a3 * b5 + a5; + return out; +}; + +/** + * Alias for {@link mat2d.multiply} + * @function + */ +mat2d.mul = mat2d.multiply; + +/** + * Rotates a mat2d by the given angle + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ +mat2d.rotate = function (out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + out[4] = a4; + out[5] = a5; + return out; +}; + +/** + * Scales the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to translate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat2d} out + **/ +mat2d.scale = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + v0 = v[0], v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + out[4] = a4; + out[5] = a5; + return out; +}; + +/** + * Translates the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to translate + * @param {vec2} v the vec2 to translate the matrix by + * @returns {mat2d} out + **/ +mat2d.translate = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + v0 = v[0], v1 = v[1]; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = a0 * v0 + a2 * v1 + a4; + out[5] = a1 * v0 + a3 * v1 + a5; + return out; +}; + +/** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.rotate(dest, dest, rad); + * + * @param {mat2d} out mat2d receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ +mat2d.fromRotation = function(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + out[4] = 0; + out[5] = 0; + return out; +} + +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.scale(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat2d} out + */ +mat2d.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + out[4] = 0; + out[5] = 0; + return out; +} + +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.translate(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {vec2} v Translation vector + * @returns {mat2d} out + */ +mat2d.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = v[0]; + out[5] = v[1]; + return out; +} + +/** + * Returns a string representation of a mat2d + * + * @param {mat2d} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ +mat2d.str = function (a) { + return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + + a[3] + ', ' + a[4] + ', ' + a[5] + ')'; +}; + +/** + * Returns Frobenius norm of a mat2d + * + * @param {mat2d} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ +mat2d.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1)) +}; + +module.exports = mat2d; + +},{"./common.js":117}],120:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 3x3 Matrix + * @name mat3 + */ +var mat3 = {}; + +/** + * Creates a new identity mat3 + * + * @returns {mat3} a new 3x3 matrix + */ +mat3.create = function() { + var out = new glMatrix.ARRAY_TYPE(9); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +}; + +/** + * Copies the upper-left 3x3 values into the given mat3. + * + * @param {mat3} out the receiving 3x3 matrix + * @param {mat4} a the source 4x4 matrix + * @returns {mat3} out + */ +mat3.fromMat4 = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; +}; + +/** + * Creates a new mat3 initialized with values from an existing matrix + * + * @param {mat3} a matrix to clone + * @returns {mat3} a new 3x3 matrix + */ +mat3.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(9); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; +}; + +/** + * Copy the values from one mat3 to another + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ +mat3.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; +}; + +/** + * Set a mat3 to the identity matrix + * + * @param {mat3} out the receiving matrix + * @returns {mat3} out + */ +mat3.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +}; + +/** + * Transpose the values of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ +mat3.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], a02 = a[2], a12 = a[5]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + } else { + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a[1]; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a[2]; + out[7] = a[5]; + out[8] = a[8]; + } + + return out; +}; + +/** + * Inverts a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ +mat3.invert = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + b01 = a22 * a11 - a12 * a21, + b11 = -a22 * a10 + a12 * a20, + b21 = a21 * a10 - a11 * a20, + + // Calculate the determinant + det = a00 * b01 + a01 * b11 + a02 * b21; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = b01 * det; + out[1] = (-a22 * a01 + a02 * a21) * det; + out[2] = (a12 * a01 - a02 * a11) * det; + out[3] = b11 * det; + out[4] = (a22 * a00 - a02 * a20) * det; + out[5] = (-a12 * a00 + a02 * a10) * det; + out[6] = b21 * det; + out[7] = (-a21 * a00 + a01 * a20) * det; + out[8] = (a11 * a00 - a01 * a10) * det; + return out; +}; + +/** + * Calculates the adjugate of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ +mat3.adjoint = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8]; + + out[0] = (a11 * a22 - a12 * a21); + out[1] = (a02 * a21 - a01 * a22); + out[2] = (a01 * a12 - a02 * a11); + out[3] = (a12 * a20 - a10 * a22); + out[4] = (a00 * a22 - a02 * a20); + out[5] = (a02 * a10 - a00 * a12); + out[6] = (a10 * a21 - a11 * a20); + out[7] = (a01 * a20 - a00 * a21); + out[8] = (a00 * a11 - a01 * a10); + return out; +}; + +/** + * Calculates the determinant of a mat3 + * + * @param {mat3} a the source matrix + * @returns {Number} determinant of a + */ +mat3.determinant = function (a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8]; + + return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); +}; + +/** + * Multiplies two mat3's + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the first operand + * @param {mat3} b the second operand + * @returns {mat3} out + */ +mat3.multiply = function (out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + b00 = b[0], b01 = b[1], b02 = b[2], + b10 = b[3], b11 = b[4], b12 = b[5], + b20 = b[6], b21 = b[7], b22 = b[8]; + + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b00 * a02 + b01 * a12 + b02 * a22; + + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b10 * a02 + b11 * a12 + b12 * a22; + + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b20 * a02 + b21 * a12 + b22 * a22; + return out; +}; + +/** + * Alias for {@link mat3.multiply} + * @function + */ +mat3.mul = mat3.multiply; + +/** + * Translate a mat3 by the given vector + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to translate + * @param {vec2} v vector to translate by + * @returns {mat3} out + */ +mat3.translate = function(out, a, v) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + x = v[0], y = v[1]; + + out[0] = a00; + out[1] = a01; + out[2] = a02; + + out[3] = a10; + out[4] = a11; + out[5] = a12; + + out[6] = x * a00 + y * a10 + a20; + out[7] = x * a01 + y * a11 + a21; + out[8] = x * a02 + y * a12 + a22; + return out; +}; + +/** + * Rotates a mat3 by the given angle + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ +mat3.rotate = function (out, a, rad) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + s = Math.sin(rad), + c = Math.cos(rad); + + out[0] = c * a00 + s * a10; + out[1] = c * a01 + s * a11; + out[2] = c * a02 + s * a12; + + out[3] = c * a10 - s * a00; + out[4] = c * a11 - s * a01; + out[5] = c * a12 - s * a02; + + out[6] = a20; + out[7] = a21; + out[8] = a22; + return out; +}; + +/** + * Scales the mat3 by the dimensions in the given vec2 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to rotate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat3} out + **/ +mat3.scale = function(out, a, v) { + var x = v[0], y = v[1]; + + out[0] = x * a[0]; + out[1] = x * a[1]; + out[2] = x * a[2]; + + out[3] = y * a[3]; + out[4] = y * a[4]; + out[5] = y * a[5]; + + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; +}; + +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.translate(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {vec2} v Translation vector + * @returns {mat3} out + */ +mat3.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = v[0]; + out[7] = v[1]; + out[8] = 1; + return out; +} + +/** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.rotate(dest, dest, rad); + * + * @param {mat3} out mat3 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ +mat3.fromRotation = function(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + + out[0] = c; + out[1] = s; + out[2] = 0; + + out[3] = -s; + out[4] = c; + out[5] = 0; + + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +} + +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.scale(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat3} out + */ +mat3.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + + out[3] = 0; + out[4] = v[1]; + out[5] = 0; + + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +} + +/** + * Copies the values from a mat2d into a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat2d} a the matrix to copy + * @returns {mat3} out + **/ +mat3.fromMat2d = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = 0; + + out[3] = a[2]; + out[4] = a[3]; + out[5] = 0; + + out[6] = a[4]; + out[7] = a[5]; + out[8] = 1; + return out; +}; + +/** +* Calculates a 3x3 matrix from the given quaternion +* +* @param {mat3} out mat3 receiving operation result +* @param {quat} q Quaternion to create matrix from +* +* @returns {mat3} out +*/ +mat3.fromQuat = function (out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + yx = y * x2, + yy = y * y2, + zx = z * x2, + zy = z * y2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - yy - zz; + out[3] = yx - wz; + out[6] = zx + wy; + + out[1] = yx + wz; + out[4] = 1 - xx - zz; + out[7] = zy - wx; + + out[2] = zx - wy; + out[5] = zy + wx; + out[8] = 1 - xx - yy; + + return out; +}; + +/** +* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix +* +* @param {mat3} out mat3 receiving operation result +* @param {mat4} a Mat4 to derive the normal matrix from +* +* @returns {mat3} out +*/ +mat3.normalFromMat4 = function (out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + // Calculate the determinant + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + + out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + + out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + + return out; +}; + +/** + * Returns a string representation of a mat3 + * + * @param {mat3} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ +mat3.str = function (a) { + return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; +}; + +/** + * Returns Frobenius norm of a mat3 + * + * @param {mat3} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ +mat3.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))) +}; + + +module.exports = mat3; + +},{"./common.js":117}],121:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 4x4 Matrix + * @name mat4 + */ +var mat4 = {}; + +/** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ +mat4.create = function() { + var out = new glMatrix.ARRAY_TYPE(16); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +}; + +/** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {mat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ +mat4.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +}; + +/** + * Copy the values from one mat4 to another + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +mat4.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +}; + +/** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ +mat4.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +}; + +/** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +mat4.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], a02 = a[2], a03 = a[3], + a12 = a[6], a13 = a[7], + a23 = a[11]; + + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; +}; + +/** + * Inverts a mat4 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +mat4.invert = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + // Calculate the determinant + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + + return out; +}; + +/** + * Calculates the adjugate of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +mat4.adjoint = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + + out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22)); + out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); + out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12)); + out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); + out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); + out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22)); + out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); + out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12)); + out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21)); + out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); + out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11)); + out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); + out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); + out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21)); + out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); + out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11)); + return out; +}; + +/** + * Calculates the determinant of a mat4 + * + * @param {mat4} a the source matrix + * @returns {Number} determinant of a + */ +mat4.determinant = function (a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32; + + // Calculate the determinant + return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; +}; + +/** + * Multiplies two mat4's + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the first operand + * @param {mat4} b the second operand + * @returns {mat4} out + */ +mat4.multiply = function (out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + + // Cache only the current line of the second matrix + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; + out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; + out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; + out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + return out; +}; + +/** + * Alias for {@link mat4.multiply} + * @function + */ +mat4.mul = mat4.multiply; + +/** + * Translate a mat4 by the given vector + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to translate + * @param {vec3} v vector to translate by + * @returns {mat4} out + */ +mat4.translate = function (out, a, v) { + var x = v[0], y = v[1], z = v[2], + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; + out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; + out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; + + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; +}; + +/** + * Scales the mat4 by the dimensions in the given vec3 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to scale + * @param {vec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ +mat4.scale = function(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +}; + +/** + * Rotates a mat4 by the given angle around the given axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {vec3} axis the axis to rotate around + * @returns {mat4} out + */ +mat4.rotate = function (out, a, rad, axis) { + var x = axis[0], y = axis[1], z = axis[2], + len = Math.sqrt(x * x + y * y + z * z), + s, c, t, + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23, + b00, b01, b02, + b10, b11, b12, + b20, b21, b22; + + if (Math.abs(len) < glMatrix.EPSILON) { return null; } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + // Construct the elements of the rotation matrix + b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; + b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; + b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; + + // Perform rotation-specific matrix multiplication + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + return out; +}; + +/** + * Rotates a matrix by the given angle around the X axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.rotateX = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; +}; + +/** + * Rotates a matrix by the given angle around the Y axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.rotateY = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; +}; + +/** + * Rotates a matrix by the given angle around the Z axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.rotateZ = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; +}; + +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {vec3} v Translation vector + * @returns {mat4} out + */ +mat4.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {vec3} v Scaling vector + * @returns {mat4} out + */ +mat4.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {vec3} axis the axis to rotate around + * @returns {mat4} out + */ +mat4.fromRotation = function(out, rad, axis) { + var x = axis[0], y = axis[1], z = axis[2], + len = Math.sqrt(x * x + y * y + z * z), + s, c, t; + + if (Math.abs(len) < glMatrix.EPSILON) { return null; } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + + // Perform rotation-specific matrix multiplication + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.fromXRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.fromYRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +mat4.fromZRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +/** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @returns {mat4} out + */ +mat4.fromRotationTranslation = function (out, q, v) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + + return out; +}; + +/** + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @param {vec3} s Scaling vector + * @returns {mat4} out + */ +mat4.fromRotationTranslationScale = function (out, q, v, s) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2, + sx = s[0], + sy = s[1], + sz = s[2]; + + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + + return out; +}; + +/** + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @param {vec3} s Scaling vector + * @param {vec3} o The origin vector around which to scale and rotate + * @returns {mat4} out + */ +mat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2, + + sx = s[0], + sy = s[1], + sz = s[2], + + ox = o[0], + oy = o[1], + oz = o[2]; + + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz); + out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz); + out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz); + out[15] = 1; + + return out; +}; + +mat4.fromQuat = function (out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + yx = y * x2, + yy = y * y2, + zx = z * x2, + zy = z * y2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + + return out; +}; + +/** + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out + */ +mat4.frustum = function (out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left), + tb = 1 / (top - bottom), + nf = 1 / (near - far); + out[0] = (near * 2) * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = (near * 2) * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = (far * near * 2) * nf; + out[15] = 0; + return out; +}; + +/** + * Generates a perspective projection matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ +mat4.perspective = function (out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf = 1 / (near - far); + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = (2 * far * near) * nf; + out[15] = 0; + return out; +}; + +/** + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ +mat4.perspectiveFromFieldOfView = function (out, fov, near, far) { + var upTan = Math.tan(fov.upDegrees * Math.PI/180.0), + downTan = Math.tan(fov.downDegrees * Math.PI/180.0), + leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0), + rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0), + xScale = 2.0 / (leftTan + rightTan), + yScale = 2.0 / (upTan + downTan); + + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = ((upTan - downTan) * yScale * 0.5); + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = (far * near) / (near - far); + out[15] = 0.0; + return out; +} + +/** + * Generates a orthogonal projection matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ +mat4.ortho = function (out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right), + bt = 1 / (bottom - top), + nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; +}; + +/** + * Generates a look-at matrix with the given eye position, focal point, and up axis + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {vec3} eye Position of the viewer + * @param {vec3} center Point the viewer is looking at + * @param {vec3} up vec3 pointing up + * @returns {mat4} out + */ +mat4.lookAt = function (out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, + eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2], + centerx = center[0], + centery = center[1], + centerz = center[2]; + + if (Math.abs(eyex - centerx) < glMatrix.EPSILON && + Math.abs(eyey - centery) < glMatrix.EPSILON && + Math.abs(eyez - centerz) < glMatrix.EPSILON) { + return mat4.identity(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + + len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); + z0 *= len; + z1 *= len; + z2 *= len; + + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + + len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + + return out; +}; + +/** + * Returns a string representation of a mat4 + * + * @param {mat4} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ +mat4.str = function (a) { + return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; +}; + +/** + * Returns Frobenius norm of a mat4 + * + * @param {mat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ +mat4.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) )) +}; + + +module.exports = mat4; + +},{"./common.js":117}],122:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); +var mat3 = require("./mat3.js"); +var vec3 = require("./vec3.js"); +var vec4 = require("./vec4.js"); + +/** + * @class Quaternion + * @name quat + */ +var quat = {}; + +/** + * Creates a new identity quat + * + * @returns {quat} a new quaternion + */ +quat.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +}; + +/** + * Sets a quaternion to represent the shortest rotation from one + * vector to another. + * + * Both vectors are assumed to be unit length. + * + * @param {quat} out the receiving quaternion. + * @param {vec3} a the initial vector + * @param {vec3} b the destination vector + * @returns {quat} out + */ +quat.rotationTo = (function() { + var tmpvec3 = vec3.create(); + var xUnitVec3 = vec3.fromValues(1,0,0); + var yUnitVec3 = vec3.fromValues(0,1,0); + + return function(out, a, b) { + var dot = vec3.dot(a, b); + if (dot < -0.999999) { + vec3.cross(tmpvec3, xUnitVec3, a); + if (vec3.length(tmpvec3) < 0.000001) + vec3.cross(tmpvec3, yUnitVec3, a); + vec3.normalize(tmpvec3, tmpvec3); + quat.setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + vec3.cross(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot; + return quat.normalize(out, out); + } + }; +})(); + +/** + * Sets the specified quaternion with values corresponding to the given + * axes. Each axis is a vec3 and is expected to be unit length and + * perpendicular to all other specified axes. + * + * @param {vec3} view the vector representing the viewing direction + * @param {vec3} right the vector representing the local "right" direction + * @param {vec3} up the vector representing the local "up" direction + * @returns {quat} out + */ +quat.setAxes = (function() { + var matr = mat3.create(); + + return function(out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + + return quat.normalize(out, quat.fromMat3(out, matr)); + }; +})(); + +/** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {quat} a quaternion to clone + * @returns {quat} a new quaternion + * @function + */ +quat.clone = vec4.clone; + +/** + * Creates a new quat initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} a new quaternion + * @function + */ +quat.fromValues = vec4.fromValues; + +/** + * Copy the values from one quat to another + * + * @param {quat} out the receiving quaternion + * @param {quat} a the source quaternion + * @returns {quat} out + * @function + */ +quat.copy = vec4.copy; + +/** + * Set the components of a quat to the given values + * + * @param {quat} out the receiving quaternion + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} out + * @function + */ +quat.set = vec4.set; + +/** + * Set a quat to the identity quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ +quat.identity = function(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +}; + +/** + * Sets a quat from the given angle and rotation axis, + * then returns it. + * + * @param {quat} out the receiving quaternion + * @param {vec3} axis the axis around which to rotate + * @param {Number} rad the angle in radians + * @returns {quat} out + **/ +quat.setAxisAngle = function(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; +}; + +/** + * Adds two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {quat} out + * @function + */ +quat.add = vec4.add; + +/** + * Multiplies two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {quat} out + */ +quat.multiply = function(out, a, b) { + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = b[0], by = b[1], bz = b[2], bw = b[3]; + + out[0] = ax * bw + aw * bx + ay * bz - az * by; + out[1] = ay * bw + aw * by + az * bx - ax * bz; + out[2] = az * bw + aw * bz + ax * by - ay * bx; + out[3] = aw * bw - ax * bx - ay * by - az * bz; + return out; +}; + +/** + * Alias for {@link quat.multiply} + * @function + */ +quat.mul = quat.multiply; + +/** + * Scales a quat by a scalar number + * + * @param {quat} out the receiving vector + * @param {quat} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {quat} out + * @function + */ +quat.scale = vec4.scale; + +/** + * Rotates a quaternion by the given angle about the X axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ +quat.rotateX = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw + aw * bx; + out[1] = ay * bw + az * bx; + out[2] = az * bw - ay * bx; + out[3] = aw * bw - ax * bx; + return out; +}; + +/** + * Rotates a quaternion by the given angle about the Y axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ +quat.rotateY = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + by = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw - az * by; + out[1] = ay * bw + aw * by; + out[2] = az * bw + ax * by; + out[3] = aw * bw - ay * by; + return out; +}; + +/** + * Rotates a quaternion by the given angle about the Z axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ +quat.rotateZ = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bz = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw + ay * bz; + out[1] = ay * bw - ax * bz; + out[2] = az * bw + aw * bz; + out[3] = aw * bw - az * bz; + return out; +}; + +/** + * Calculates the W component of a quat from the X, Y, and Z components. + * Assumes that quaternion is 1 unit in length. + * Any existing W component will be ignored. + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate W component of + * @returns {quat} out + */ +quat.calculateW = function (out, a) { + var x = a[0], y = a[1], z = a[2]; + + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); + return out; +}; + +/** + * Calculates the dot product of two quat's + * + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {Number} dot product of a and b + * @function + */ +quat.dot = vec4.dot; + +/** + * Performs a linear interpolation between two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {quat} out + * @function + */ +quat.lerp = vec4.lerp; + +/** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {quat} out + */ +quat.slerp = function (out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = b[0], by = b[1], bz = b[2], bw = b[3]; + + var omega, cosom, sinom, scale0, scale1; + + // calc cosine + cosom = ax * bx + ay * by + az * bz + aw * bw; + // adjust signs (if necessary) + if ( cosom < 0.0 ) { + cosom = -cosom; + bx = - bx; + by = - by; + bz = - bz; + bw = - bw; + } + // calculate coefficients + if ( (1.0 - cosom) > 0.000001 ) { + // standard case (slerp) + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1.0 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t; + scale1 = t; + } + // calculate final values + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + + return out; +}; + +/** + * Performs a spherical linear interpolation with two control points + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {quat} c the third operand + * @param {quat} d the fourth operand + * @param {Number} t interpolation amount + * @returns {quat} out + */ +quat.sqlerp = (function () { + var temp1 = quat.create(); + var temp2 = quat.create(); + + return function (out, a, b, c, d, t) { + quat.slerp(temp1, a, d, t); + quat.slerp(temp2, b, c, t); + quat.slerp(out, temp1, temp2, 2 * t * (1 - t)); + + return out; + }; +}()); + +/** + * Calculates the inverse of a quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate inverse of + * @returns {quat} out + */ +quat.invert = function(out, a) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + dot = a0*a0 + a1*a1 + a2*a2 + a3*a3, + invDot = dot ? 1.0/dot : 0; + + // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 + + out[0] = -a0*invDot; + out[1] = -a1*invDot; + out[2] = -a2*invDot; + out[3] = a3*invDot; + return out; +}; + +/** + * Calculates the conjugate of a quat + * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate conjugate of + * @returns {quat} out + */ +quat.conjugate = function (out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + return out; +}; + +/** + * Calculates the length of a quat + * + * @param {quat} a vector to calculate length of + * @returns {Number} length of a + * @function + */ +quat.length = vec4.length; + +/** + * Alias for {@link quat.length} + * @function + */ +quat.len = quat.length; + +/** + * Calculates the squared length of a quat + * + * @param {quat} a vector to calculate squared length of + * @returns {Number} squared length of a + * @function + */ +quat.squaredLength = vec4.squaredLength; + +/** + * Alias for {@link quat.squaredLength} + * @function + */ +quat.sqrLen = quat.squaredLength; + +/** + * Normalize a quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a quaternion to normalize + * @returns {quat} out + * @function + */ +quat.normalize = vec4.normalize; + +/** + * Creates a quaternion from the given 3x3 rotation matrix. + * + * NOTE: The resultant quaternion is not normalized, so you should be sure + * to renormalize the quaternion yourself where necessary. + * + * @param {quat} out the receiving quaternion + * @param {mat3} m rotation matrix + * @returns {quat} out + * @function + */ +quat.fromMat3 = function(out, m) { + // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes + // article "Quaternion Calculus and Fast Animation". + var fTrace = m[0] + m[4] + m[8]; + var fRoot; + + if ( fTrace > 0.0 ) { + // |w| > 1/2, may as well choose w > 1/2 + fRoot = Math.sqrt(fTrace + 1.0); // 2w + out[3] = 0.5 * fRoot; + fRoot = 0.5/fRoot; // 1/(4w) + out[0] = (m[5]-m[7])*fRoot; + out[1] = (m[6]-m[2])*fRoot; + out[2] = (m[1]-m[3])*fRoot; + } else { + // |w| <= 1/2 + var i = 0; + if ( m[4] > m[0] ) + i = 1; + if ( m[8] > m[i*3+i] ) + i = 2; + var j = (i+1)%3; + var k = (i+2)%3; + + fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j*3+k] - m[k*3+j]) * fRoot; + out[j] = (m[j*3+i] + m[i*3+j]) * fRoot; + out[k] = (m[k*3+i] + m[i*3+k]) * fRoot; + } + + return out; +}; + +/** + * Returns a string representation of a quatenion + * + * @param {quat} vec vector to represent as a string + * @returns {String} string representation of the vector + */ +quat.str = function (a) { + return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; +}; + +module.exports = quat; + +},{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 2 Dimensional Vector + * @name vec2 + */ +var vec2 = {}; + +/** + * Creates a new, empty vec2 + * + * @returns {vec2} a new 2D vector + */ +vec2.create = function() { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = 0; + out[1] = 0; + return out; +}; + +/** + * Creates a new vec2 initialized with values from an existing vector + * + * @param {vec2} a vector to clone + * @returns {vec2} a new 2D vector + */ +vec2.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = a[0]; + out[1] = a[1]; + return out; +}; + +/** + * Creates a new vec2 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} a new 2D vector + */ +vec2.fromValues = function(x, y) { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = x; + out[1] = y; + return out; +}; + +/** + * Copy the values from one vec2 to another + * + * @param {vec2} out the receiving vector + * @param {vec2} a the source vector + * @returns {vec2} out + */ +vec2.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + return out; +}; + +/** + * Set the components of a vec2 to the given values + * + * @param {vec2} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} out + */ +vec2.set = function(out, x, y) { + out[0] = x; + out[1] = y; + return out; +}; + +/** + * Adds two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + return out; +}; + +/** + * Subtracts vector b from vector a + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + return out; +}; + +/** + * Alias for {@link vec2.subtract} + * @function + */ +vec2.sub = vec2.subtract; + +/** + * Multiplies two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + return out; +}; + +/** + * Alias for {@link vec2.multiply} + * @function + */ +vec2.mul = vec2.multiply; + +/** + * Divides two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + return out; +}; + +/** + * Alias for {@link vec2.divide} + * @function + */ +vec2.div = vec2.divide; + +/** + * Returns the minimum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + return out; +}; + +/** + * Returns the maximum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ +vec2.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + return out; +}; + +/** + * Scales a vec2 by a scalar number + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec2} out + */ +vec2.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + return out; +}; + +/** + * Adds two vec2's after scaling the second operand by a scalar value + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec2} out + */ +vec2.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + return out; +}; + +/** + * Calculates the euclidian distance between two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} distance between a and b + */ +vec2.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return Math.sqrt(x*x + y*y); +}; + +/** + * Alias for {@link vec2.distance} + * @function + */ +vec2.dist = vec2.distance; + +/** + * Calculates the squared euclidian distance between two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} squared distance between a and b + */ +vec2.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return x*x + y*y; +}; + +/** + * Alias for {@link vec2.squaredDistance} + * @function + */ +vec2.sqrDist = vec2.squaredDistance; + +/** + * Calculates the length of a vec2 + * + * @param {vec2} a vector to calculate length of + * @returns {Number} length of a + */ +vec2.length = function (a) { + var x = a[0], + y = a[1]; + return Math.sqrt(x*x + y*y); +}; + +/** + * Alias for {@link vec2.length} + * @function + */ +vec2.len = vec2.length; + +/** + * Calculates the squared length of a vec2 + * + * @param {vec2} a vector to calculate squared length of + * @returns {Number} squared length of a + */ +vec2.squaredLength = function (a) { + var x = a[0], + y = a[1]; + return x*x + y*y; +}; + +/** + * Alias for {@link vec2.squaredLength} + * @function + */ +vec2.sqrLen = vec2.squaredLength; + +/** + * Negates the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to negate + * @returns {vec2} out + */ +vec2.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + return out; +}; + +/** + * Returns the inverse of the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to invert + * @returns {vec2} out + */ +vec2.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + return out; +}; + +/** + * Normalize a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to normalize + * @returns {vec2} out + */ +vec2.normalize = function(out, a) { + var x = a[0], + y = a[1]; + var len = x*x + y*y; + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + out[0] = a[0] * len; + out[1] = a[1] * len; + } + return out; +}; + +/** + * Calculates the dot product of two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} dot product of a and b + */ +vec2.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1]; +}; + +/** + * Computes the cross product of two vec2's + * Note that the cross product must by definition produce a 3D vector + * + * @param {vec3} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec3} out + */ +vec2.cross = function(out, a, b) { + var z = a[0] * b[1] - a[1] * b[0]; + out[0] = out[1] = 0; + out[2] = z; + return out; +}; + +/** + * Performs a linear interpolation between two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec2} out + */ +vec2.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + return out; +}; + +/** + * Generates a random vector with the given scale + * + * @param {vec2} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec2} out + */ +vec2.random = function (out, scale) { + scale = scale || 1.0; + var r = glMatrix.RANDOM() * 2.0 * Math.PI; + out[0] = Math.cos(r) * scale; + out[1] = Math.sin(r) * scale; + return out; +}; + +/** + * Transforms the vec2 with a mat2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat2} m matrix to transform with + * @returns {vec2} out + */ +vec2.transformMat2 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y; + out[1] = m[1] * x + m[3] * y; + return out; +}; + +/** + * Transforms the vec2 with a mat2d + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat2d} m matrix to transform with + * @returns {vec2} out + */ +vec2.transformMat2d = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; +}; + +/** + * Transforms the vec2 with a mat3 + * 3rd vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat3} m matrix to transform with + * @returns {vec2} out + */ +vec2.transformMat3 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[3] * y + m[6]; + out[1] = m[1] * x + m[4] * y + m[7]; + return out; +}; + +/** + * Transforms the vec2 with a mat4 + * 3rd vector component is implicitly '0' + * 4th vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec2} out + */ +vec2.transformMat4 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[4] * y + m[12]; + out[1] = m[1] * x + m[5] * y + m[13]; + return out; +}; + +/** + * Perform some operation over an array of vec2s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ +vec2.forEach = (function() { + var vec = vec2.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 2; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; + } + + return a; + }; +})(); + +/** + * Returns a string representation of a vector + * + * @param {vec2} vec vector to represent as a string + * @returns {String} string representation of the vector + */ +vec2.str = function (a) { + return 'vec2(' + a[0] + ', ' + a[1] + ')'; +}; + +module.exports = vec2; + +},{"./common.js":117}],124:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 3 Dimensional Vector + * @name vec3 + */ +var vec3 = {}; + +/** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ +vec3.create = function() { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = 0; + out[1] = 0; + out[2] = 0; + return out; +}; + +/** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {vec3} a vector to clone + * @returns {vec3} a new 3D vector + */ +vec3.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +}; + +/** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ +vec3.fromValues = function(x, y, z) { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; +}; + +/** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {vec3} a the source vector + * @returns {vec3} out + */ +vec3.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +}; + +/** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ +vec3.set = function(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; +}; + +/** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; +}; + +/** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; +}; + +/** + * Alias for {@link vec3.subtract} + * @function + */ +vec3.sub = vec3.subtract; + +/** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; +}; + +/** + * Alias for {@link vec3.multiply} + * @function + */ +vec3.mul = vec3.multiply; + +/** + * Divides two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; +}; + +/** + * Alias for {@link vec3.divide} + * @function + */ +vec3.div = vec3.divide; + +/** + * Returns the minimum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + return out; +}; + +/** + * Returns the maximum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + return out; +}; + +/** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ +vec3.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; +}; + +/** + * Adds two vec3's after scaling the second operand by a scalar value + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec3} out + */ +vec3.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + out[2] = a[2] + (b[2] * scale); + return out; +}; + +/** + * Calculates the euclidian distance between two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} distance between a and b + */ +vec3.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2]; + return Math.sqrt(x*x + y*y + z*z); +}; + +/** + * Alias for {@link vec3.distance} + * @function + */ +vec3.dist = vec3.distance; + +/** + * Calculates the squared euclidian distance between two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} squared distance between a and b + */ +vec3.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2]; + return x*x + y*y + z*z; +}; + +/** + * Alias for {@link vec3.squaredDistance} + * @function + */ +vec3.sqrDist = vec3.squaredDistance; + +/** + * Calculates the length of a vec3 + * + * @param {vec3} a vector to calculate length of + * @returns {Number} length of a + */ +vec3.length = function (a) { + var x = a[0], + y = a[1], + z = a[2]; + return Math.sqrt(x*x + y*y + z*z); +}; + +/** + * Alias for {@link vec3.length} + * @function + */ +vec3.len = vec3.length; + +/** + * Calculates the squared length of a vec3 + * + * @param {vec3} a vector to calculate squared length of + * @returns {Number} squared length of a + */ +vec3.squaredLength = function (a) { + var x = a[0], + y = a[1], + z = a[2]; + return x*x + y*y + z*z; +}; + +/** + * Alias for {@link vec3.squaredLength} + * @function + */ +vec3.sqrLen = vec3.squaredLength; + +/** + * Negates the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to negate + * @returns {vec3} out + */ +vec3.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + return out; +}; + +/** + * Returns the inverse of the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to invert + * @returns {vec3} out + */ +vec3.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + return out; +}; + +/** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to normalize + * @returns {vec3} out + */ +vec3.normalize = function(out, a) { + var x = a[0], + y = a[1], + z = a[2]; + var len = x*x + y*y + z*z; + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + } + return out; +}; + +/** + * Calculates the dot product of two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} dot product of a and b + */ +vec3.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +}; + +/** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +vec3.cross = function(out, a, b) { + var ax = a[0], ay = a[1], az = a[2], + bx = b[0], by = b[1], bz = b[2]; + + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; +}; + +/** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ +vec3.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1], + az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; +}; + +/** + * Performs a hermite interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {vec3} c the third operand + * @param {vec3} d the fourth operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ +vec3.hermite = function (out, a, b, c, d, t) { + var factorTimes2 = t * t, + factor1 = factorTimes2 * (2 * t - 3) + 1, + factor2 = factorTimes2 * (t - 2) + t, + factor3 = factorTimes2 * (t - 1), + factor4 = factorTimes2 * (3 - 2 * t); + + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + + return out; +}; + +/** + * Performs a bezier interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {vec3} c the third operand + * @param {vec3} d the fourth operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ +vec3.bezier = function (out, a, b, c, d, t) { + var inverseFactor = 1 - t, + inverseFactorTimesTwo = inverseFactor * inverseFactor, + factorTimes2 = t * t, + factor1 = inverseFactorTimesTwo * inverseFactor, + factor2 = 3 * t * inverseFactorTimesTwo, + factor3 = 3 * factorTimes2 * inverseFactor, + factor4 = factorTimes2 * t; + + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + + return out; +}; + +/** + * Generates a random vector with the given scale + * + * @param {vec3} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec3} out + */ +vec3.random = function (out, scale) { + scale = scale || 1.0; + + var r = glMatrix.RANDOM() * 2.0 * Math.PI; + var z = (glMatrix.RANDOM() * 2.0) - 1.0; + var zScale = Math.sqrt(1.0-z*z) * scale; + + out[0] = Math.cos(r) * zScale; + out[1] = Math.sin(r) * zScale; + out[2] = z * scale; + return out; +}; + +/** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec3} out + */ +vec3.transformMat4 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2], + w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; +}; + +/** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {mat4} m the 3x3 matrix to transform with + * @returns {vec3} out + */ +vec3.transformMat3 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; +}; + +/** + * Transforms the vec3 with a quat + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {quat} q quaternion to transform with + * @returns {vec3} out + */ +vec3.transformQuat = function(out, a, q) { + // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations + + var x = a[0], y = a[1], z = a[2], + qx = q[0], qy = q[1], qz = q[2], qw = q[3], + + // calculate quat * vec + ix = qw * x + qy * z - qz * y, + iy = qw * y + qz * x - qx * z, + iz = qw * z + qx * y - qy * x, + iw = -qx * x - qy * y - qz * z; + + // calculate result * inverse quat + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + return out; +}; + +/** + * Rotate a 3D vector around the x-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ +vec3.rotateX = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[0]; + r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c); + r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c); + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; +}; + +/** + * Rotate a 3D vector around the y-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ +vec3.rotateY = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c); + r[1] = p[1]; + r[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c); + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; +}; + +/** + * Rotate a 3D vector around the z-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ +vec3.rotateZ = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c); + r[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c); + r[2] = p[2]; + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; +}; + +/** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ +vec3.forEach = (function() { + var vec = vec3.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 3; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; + } + + return a; + }; +})(); + +/** + * Get the angle between two 3D vectors + * @param {vec3} a The first operand + * @param {vec3} b The second operand + * @returns {Number} The angle in radians + */ +vec3.angle = function(a, b) { + + var tempA = vec3.fromValues(a[0], a[1], a[2]); + var tempB = vec3.fromValues(b[0], b[1], b[2]); + + vec3.normalize(tempA, tempA); + vec3.normalize(tempB, tempB); + + var cosine = vec3.dot(tempA, tempB); + + if(cosine > 1.0){ + return 0; + } else { + return Math.acos(cosine); + } +}; + +/** + * Returns a string representation of a vector + * + * @param {vec3} vec vector to represent as a string + * @returns {String} string representation of the vector + */ +vec3.str = function (a) { + return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; +}; + +module.exports = vec3; + +},{"./common.js":117}],125:[function(require,module,exports){ +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +var glMatrix = require("./common.js"); + +/** + * @class 4 Dimensional Vector + * @name vec4 + */ +var vec4 = {}; + +/** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ +vec4.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + return out; +}; + +/** + * Creates a new vec4 initialized with values from an existing vector + * + * @param {vec4} a vector to clone + * @returns {vec4} a new 4D vector + */ +vec4.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +}; + +/** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ +vec4.fromValues = function(x, y, z, w) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +}; + +/** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {vec4} a the source vector + * @returns {vec4} out + */ +vec4.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +}; + +/** + * Set the components of a vec4 to the given values + * + * @param {vec4} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} out + */ +vec4.set = function(out, x, y, z, w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +}; + +/** + * Adds two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; +}; + +/** + * Subtracts vector b from vector a + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; +}; + +/** + * Alias for {@link vec4.subtract} + * @function + */ +vec4.sub = vec4.subtract; + +/** + * Multiplies two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; +}; + +/** + * Alias for {@link vec4.multiply} + * @function + */ +vec4.mul = vec4.multiply; + +/** + * Divides two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + out[3] = a[3] / b[3]; + return out; +}; + +/** + * Alias for {@link vec4.divide} + * @function + */ +vec4.div = vec4.divide; + +/** + * Returns the minimum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + out[3] = Math.min(a[3], b[3]); + return out; +}; + +/** + * Returns the maximum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ +vec4.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + out[3] = Math.max(a[3], b[3]); + return out; +}; + +/** + * Scales a vec4 by a scalar number + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec4} out + */ +vec4.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; +}; + +/** + * Adds two vec4's after scaling the second operand by a scalar value + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec4} out + */ +vec4.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + out[2] = a[2] + (b[2] * scale); + out[3] = a[3] + (b[3] * scale); + return out; +}; + +/** + * Calculates the euclidian distance between two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} distance between a and b + */ +vec4.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2], + w = b[3] - a[3]; + return Math.sqrt(x*x + y*y + z*z + w*w); +}; + +/** + * Alias for {@link vec4.distance} + * @function + */ +vec4.dist = vec4.distance; + +/** + * Calculates the squared euclidian distance between two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} squared distance between a and b + */ +vec4.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2], + w = b[3] - a[3]; + return x*x + y*y + z*z + w*w; +}; + +/** + * Alias for {@link vec4.squaredDistance} + * @function + */ +vec4.sqrDist = vec4.squaredDistance; + +/** + * Calculates the length of a vec4 + * + * @param {vec4} a vector to calculate length of + * @returns {Number} length of a + */ +vec4.length = function (a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + return Math.sqrt(x*x + y*y + z*z + w*w); +}; + +/** + * Alias for {@link vec4.length} + * @function + */ +vec4.len = vec4.length; + +/** + * Calculates the squared length of a vec4 + * + * @param {vec4} a vector to calculate squared length of + * @returns {Number} squared length of a + */ +vec4.squaredLength = function (a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + return x*x + y*y + z*z + w*w; +}; + +/** + * Alias for {@link vec4.squaredLength} + * @function + */ +vec4.sqrLen = vec4.squaredLength; + +/** + * Negates the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to negate + * @returns {vec4} out + */ +vec4.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = -a[3]; + return out; +}; + +/** + * Returns the inverse of the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to invert + * @returns {vec4} out + */ +vec4.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + out[3] = 1.0 / a[3]; + return out; +}; + +/** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to normalize + * @returns {vec4} out + */ +vec4.normalize = function(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = x*x + y*y + z*z + w*w; + if (len > 0) { + len = 1 / Math.sqrt(len); + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + } + return out; +}; + +/** + * Calculates the dot product of two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} dot product of a and b + */ +vec4.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +}; + +/** + * Performs a linear interpolation between two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec4} out + */ +vec4.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + out[3] = aw + t * (b[3] - aw); + return out; +}; + +/** + * Generates a random vector with the given scale + * + * @param {vec4} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec4} out + */ +vec4.random = function (out, scale) { + scale = scale || 1.0; + + //TODO: This is a pretty awful way of doing this. Find something better. + out[0] = glMatrix.RANDOM(); + out[1] = glMatrix.RANDOM(); + out[2] = glMatrix.RANDOM(); + out[3] = glMatrix.RANDOM(); + vec4.normalize(out, out); + vec4.scale(out, out, scale); + return out; +}; + +/** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec4} out + */ +vec4.transformMat4 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2], w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; +}; + +/** + * Transforms the vec4 with a quat + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to transform + * @param {quat} q quaternion to transform with + * @returns {vec4} out + */ +vec4.transformQuat = function(out, a, q) { + var x = a[0], y = a[1], z = a[2], + qx = q[0], qy = q[1], qz = q[2], qw = q[3], + + // calculate quat * vec + ix = qw * x + qy * z - qz * y, + iy = qw * y + qz * x - qx * z, + iz = qw * z + qx * y - qy * x, + iw = -qx * x - qy * y - qz * z; + + // calculate result * inverse quat + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + out[3] = a[3]; + return out; +}; + +/** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ +vec4.forEach = (function() { + var vec = vec4.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 4; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3]; + } + + return a; + }; +})(); + +/** + * Returns a string representation of a vector + * + * @param {vec4} vec vector to represent as a string + * @returns {String} string representation of the vector + */ +vec4.str = function (a) { + return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; +}; + +module.exports = vec4; + +},{"./common.js":117}],126:[function(require,module,exports){ +'use strict'; + +function constant(value) { + return function() { + return value; + } +} + +function interpolateNumber(a, b, t) { + return (a * (1 - t)) + (b * t); +} + +function interpolateArray(a, b, t) { + var result = []; + for (var i = 0; i < a.length; i++) { + result[i] = interpolateNumber(a[i], b[i], t); + } + return result; +} + +exports['interpolated'] = function(f) { + if (!f.stops) { + return constant(f); + } + + var stops = f.stops, + base = f.base || 1, + interpolate = Array.isArray(stops[0][1]) ? interpolateArray : interpolateNumber; + + return function(z) { + // find the two stops which the current z is between + var low, high; + + for (var i = 0; i < stops.length; i++) { + var stop = stops[i]; + + if (stop[0] <= z) { + low = stop; + } + + if (stop[0] > z) { + high = stop; + break; + } + } + + if (low && high) { + var zoomDiff = high[0] - low[0], + zoomProgress = z - low[0], + + t = base === 1 ? + zoomProgress / zoomDiff : + (Math.pow(base, zoomProgress) - 1) / (Math.pow(base, zoomDiff) - 1); + + return interpolate(low[1], high[1], t); + + } else if (low) { + return low[1]; + + } else if (high) { + return high[1]; + } + }; +}; + +exports['piecewise-constant'] = function(f) { + if (!f.stops) { + return constant(f); + } + + var stops = f.stops; + + return function(z) { + for (var i = 0; i < stops.length; i++) { + if (stops[i][0] > z) { + return stops[i === 0 ? 0 : i - 1][1]; + } + } + + return stops[stops.length - 1][1]; + } +}; + +},{}],127:[function(require,module,exports){ +'use strict'; + +var reference = require('../../reference/latest.js'); +var validate = require('./parsed'); + +module.exports = function(style) { + return validate(style, reference); +}; + +},{"../../reference/latest.js":129,"./parsed":128}],128:[function(require,module,exports){ +'use strict'; + +var parseCSSColor = require('csscolorparser').parseCSSColor; +var format = require('util').format; + +module.exports = function(style, reference) { + + var constants = style.constants || {}, + layers = {}, + errors = []; + + function error(key, val /*, message, ...*/) { + var err = { + message: (key ? key + ': ' : '') + + format.apply(format, Array.prototype.slice.call(arguments, 2)) + }; + + if (val !== null && val !== undefined && val.__line__) { + err.line = val.__line__; + } + + errors.push(err); + } + + // Main recursive validation function. Tracks: + // + // - key: string representing location of validation in style tree. Used only + // for more informative error reporting. + // - val: current value from style being evaluated. May be anything from a + // high level object that needs to be descended into deeper or a simple + // scalar value. + // - spec: current spec being evaluated. Tracks val. + // + function validate(key, val, spec) { + var type = typeof_(val); + + // Constants + if (type === 'string' && val[0] === '@') { + if (!(val in constants)) { + return error(key, val, 'constant "%s" not found', val); + } + val = constants[val]; + type = typeof_(val); + } + + // Functions + if (spec.function && type === 'object') { + return validate.function(key, val, spec); + } + + if (spec.type) { + var validator = validate[spec.type]; + if (validator) { + return validator(key, val, spec); + } + spec = reference[spec.type]; + } + + validate.object(key, val, spec); + } + + validate.constants = function(key, val) { + var type = typeof_(val); + if (type !== 'object') { + return error(key, val, 'object expected, %s found', type); + } + + for (var k in val) { + if (k[0] !== '@') { + error(key + '.' + k, val[k], 'constants must start with "@"'); + } + } + }; + + validate.source = function(key, val) { + if (!val.type) { + error(key, val, '"type" is required'); + return; + } + + var type = unbundle(val.type); + switch (type) { + case 'vector': + case 'raster': + validate.object(key, val, reference.source_tile); + + if ('url' in val) { + for (var prop in val) { + if (['type', 'url', 'tileSize'].indexOf(prop) < 0) { + error(key + '.' + prop, val[prop], 'a source with a "url" property may not include a "%s" property', prop); + } + } + } + + break; + case 'geojson': + validate.object(key, val, reference.source_geojson); + break; + case 'video': + validate.object(key, val, reference.source_video); + break; + default: + validate.enum(key + '.type', val.type, {values: ['vector', 'raster', 'geojson', 'video']}); + } + }; + + validate.layer = function(key, val) { + if (!val.type && !val.ref) { + error(key, val, 'either "type" or "ref" is required'); + } + + var type = unbundle(val.type), + ref = unbundle(val.ref); + + if (val.id) { + if (layers[val.id]) { + error(key, val.id, 'duplicate layer id "%s", previously used at line %d', val.id, layers[val.id]); + } else { + layers[val.id] = val.id.__line__; + } + } + + if ('ref' in val) { + ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { + if (p in val) { + error(key, val[p], '"%s" is prohibited for ref layers', p); + } + }); + + var parent; + + style.layers.forEach(function(layer) { + if (layer.id == ref) parent = layer; + }); + + if (!parent) { + error(key, val.ref, 'ref layer "%s" not found', ref); + } else if (parent.ref) { + error(key, val.ref, 'ref cannot reference another ref layer'); + } else { + type = parent.type; + } + } else if (type !== 'background') { + if (!val.source) { + error(key, val, 'missing required property "source"'); + } else { + var source = style.sources[val.source]; + if (!source) { + error(key, val.source, 'source "%s" not found', val.source); + } else if (source.type == 'vector' && type == 'raster') { + error(key, val.source, 'layer "%s" requires a raster source', val.id); + } else if (source.type == 'raster' && type != 'raster') { + error(key, val.source, 'layer "%s" requires a vector source', val.id); + } + } + } + + validate.object(key, val, reference.layer, { + filter: validate.filter, + layout: function(key, val) { + var spec = reference['layout_' + type]; + return type && spec && validate(key, val, spec); + }, + paint: function(key, val) { + var spec = reference['paint_' + type]; + return type && spec && validate(key, val, spec); + } + }); + }; + + validate.object = function (key, val, spec, validators) { + validators = validators || {}; + + var type = typeof_(val); + if (type !== 'object') { + return error(key, val, 'object expected, %s found', type); + } + + for (var k in val) { + var speckey = k.split('.')[0]; // treat 'paint.*' as 'paint' + var def = spec[speckey] || spec['*']; + var transition = speckey.match(/^(.*)-transition$/); + + if (def) { + (validators[speckey] || validate)((key ? key + '.' : key) + k, val[k], def); + } else if (transition && spec[transition[1]] && spec[transition[1]].transition) { + validate((key ? key + '.' : key) + k, val[k], reference.transition); + // tolerate root-level extra keys & arbitrary layer properties + } else if (key !== '' && key.split('.').length !== 1) { + error(key, val[k], 'unknown property "%s"', k); + } + } + + for (var l in spec) { + if (spec[l].required && spec[l]['default'] === undefined && val[l] === undefined) { + error(key, val, 'missing required property "%s"', l); + } + } + }; + + validate.array = function (key, val, spec, validator) { + if (typeof_(val) !== 'array') { + return error(key, val, 'array expected, %s found', typeof_(val)); + } + + if (spec.length && val.length !== spec.length) { + return error(key, val, 'array length %d expected, length %d found', spec.length, val.length); + } + + var value = { + "type": spec.value + }; + + if (style.version < 7) { + value.function = spec.function; + } + + if (typeof_(spec.value) === 'object') { + value = spec.value; + } + + for (var i = 0; i < val.length; i++) { + (validator || validate)(key + '[' + i + ']', val[i], value); + } + }; + + validate.filter = function(key, val) { + var type; + + if (typeof_(val) !== 'array') { + return error(key, val, 'array expected, %s found', typeof_(val)); + } + + if (val.length < 1) { + return error(key, val, 'filter array must have at least 1 element'); + } + + validate.enum(key + '[0]', val[0], reference.filter_operator); + + switch (unbundle(val[0])) { + case '<': + case '<=': + case '>': + case '>=': + if (val.length >= 2 && val[1] == '$type') { + error(key, val, '"$type" cannot be use with operator "%s"', val[0]); + } + /* falls through */ + case '==': + case '!=': + if (val.length != 3) { + error(key, val, 'filter array for operator "%s" must have 3 elements', val[0]); + } + /* falls through */ + case 'in': + case '!in': + if (val.length >= 2) { + type = typeof_(val[1]); + if (type !== 'string') { + error(key + '[1]', val[1], 'string expected, %s found', type); + } else if (val[1][0] === '@') { + error(key + '[1]', val[1], 'filter key cannot be a constant'); + } + } + for (var i = 2; i < val.length; i++) { + type = typeof_(val[i]); + if (val[1] == '$type') { + validate.enum(key + '[' + i + ']', val[i], reference.geometry_type); + } else if (type === 'string' && val[i][0] === '@') { + error(key + '[' + i + ']', val[i], 'filter value cannot be a constant'); + } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { + error(key + '[' + i + ']', val[i], 'string, number, or boolean expected, %s found', type); + } + } + break; + + case 'any': + case 'all': + case 'none': + for (i = 1; i < val.length; i++) { + validate.filter(key + '[' + i + ']', val[i]); + } + break; + } + }; + + validate.function = function(key, val, spec) { + validate.object(key, val, reference.function, { + stops: function (key, val, arraySpec) { + var lastStop = -Infinity; + validate.array(key, val, arraySpec, function validateStop(key, val) { + if (typeof_(val) !== 'array') { + return error(key, val, 'array expected, %s found', typeof_(val)); + } + + if (val.length !== 2) { + return error(key, val, 'array length %d expected, length %d found', 2, val.length); + } + + validate(key + '[0]', val[0], {type: 'number'}); + validate(key + '[1]', val[1], spec); + + if (typeof_(val[0]) === 'number') { + if (spec.function === 'piecewise-constant' && val[0] % 1 !== 0) { + error(key + '[0]', val[0], 'zoom level for piecewise-constant functions must be an integer'); + } + + if (val[0] < lastStop) { + error(key + '[0]', val[0], 'array stops must appear in ascending order'); + } + + lastStop = val[0]; + } + }); + + if (typeof_(val) === 'array' && val.length === 0) { + error(key, val, 'array must have at least one stop'); + } + } + }); + }; + + validate.enum = function (key, val, spec) { + if (spec.values.indexOf(unbundle(val)) === -1) { + error(key, val, 'expected one of [%s], %s found', spec.values.join(', '), val); + } + }; + + validate.color = function(key, val) { + var type = typeof_(val); + if (type !== 'string') { + error(key, val, 'color expected, %s found', type); + } else if (parseCSSColor(val) === null) { + error(key, val, 'color expected, "%s" found', val); + } + }; + + function typeValidator(expected) { + return function(key, val, spec) { + var actual = typeof_(val); + if (actual !== expected) { + error(key, val, '%s expected, %s found', expected, actual); + } + + if ('minimum' in spec && val < spec.minimum) { + error(key, val, '%s is less than the minimum value %s', val, spec.minimum); + } + + if ('maximum' in spec && val > spec.maximum) { + error(key, val, '%s is greater than the maximum value %s', val, spec.maximum); + } + }; + } + + validate.number = typeValidator('number'); + validate.string = typeValidator('string'); + validate.boolean = typeValidator('boolean'); + + validate['*'] = function() {}; + + validate('', style, reference.$root); + + return errors; +}; + +function typeof_(val) { + if (val instanceof Number) + return 'number'; + if (val instanceof String) + return 'string'; + if (val instanceof Boolean) + return 'boolean'; + if (Array.isArray(val)) + return 'array'; + if (val === null) + return 'null'; + return typeof val; +} + +function unbundle(_) { + if (_ instanceof Number || + _ instanceof String || + _ instanceof Boolean) { + return _.valueOf(); + } else { + return _; + } +} + +},{"csscolorparser":108,"util":107}],129:[function(require,module,exports){ +module.exports = require('./v7.json'); + +},{"./v7.json":130}],130:[function(require,module,exports){ +module.exports={ + "$version": 7, + "$root": { + "version": { + "required": true, + "type": "enum", + "values": [ + 7 + ], + "doc": "Stylesheet version number. Must be 7." + }, + "name": { + "type": "string", + "doc": "A human-readable name for the style." + }, + "constants": { + "type": "constants", + "doc": "An object of constants to be referenced in layers." + }, + "sources": { + "required": true, + "type": "sources", + "doc": "Data source specifications." + }, + "sprite": { + "type": "string", + "doc": "A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended." + }, + "glyphs": { + "type": "string", + "doc": "A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}." + }, + "transition": { + "type": "transition", + "doc": "A global transition definition to use as a default across properties." + }, + "layers": { + "required": true, + "type": "array", + "value": "layer", + "doc": "Layers will be drawn in the order of this array." + } + }, + "constants": { + "*": { + "type": "*", + "doc": "A constant that will be replaced verbatim in the referencing place. This can be anything, including objects and arrays. All variable names must be prefixed with an `@` symbol." + } + }, + "sources": { + "*": { + "type": "source", + "doc": "Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided." + } + }, + "source": [ + "source_tile", + "source_geojson", + "source_video" + ], + "source_tile": { + "type": { + "required": true, + "type": "enum", + "values": [ + "vector", + "raster" + ], + "doc": "The data type of the source." + }, + "url": { + "type": "string", + "doc": "A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`." + }, + "tiles": { + "type": "array", + "value": "string", + "doc": "An array of one or more tile source URLs, as in the TileJSON spec." + }, + "minzoom": { + "type": "number", + "default": 0, + "doc": "Minimum zoom level for which tiles are available, as in the TileJSON spec." + }, + "maxzoom": { + "type": "number", + "default": 22, + "doc": "Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels." + }, + "tileSize": { + "type": "number", + "default": 512, + "units": "pixels", + "doc": "The minimum visual size to display tiles for this layer. Only configurable for raster layers." + }, + "*": { + "type": "*", + "doc": "Other keys to configure the data source." + } + }, + "source_geojson": { + "type": { + "required": true, + "type": "enum", + "values": [ + "geojson" + ] + }, + "data": { + "type": "*" + } + }, + "source_video": { + "type": { + "required": true, + "type": "enum", + "values": [ + "video" + ] + }, + "url": { + "required": true, + "type": "array", + "value": "string", + "doc": "URLs to video content in order of preferred format." + }, + "coordinates": { + "required": true, + "type": "array", + "length": 4, + "value": { + "type": "array", + "length": 2, + "value": "number" + } + } + }, + "layer": { + "id": { + "type": "string", + "doc": "Unique layer name." + }, + "type": { + "type": "enum", + "values": [ + "fill", + "line", + "symbol", + "raster", + "background" + ], + "doc": "Rendering type of this layer." + }, + "ref": { + "type": "string", + "doc": "References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient." + }, + "source": { + "type": "string", + "doc": "Name of a source description to be used for this layer." + }, + "source-layer": { + "type": "string", + "doc": "Layer to use from a vector tile source. Required if the source supports multiple layers." + }, + "minzoom": { + "type": "number", + "minimum": 0, + "maximum": 22, + "doc": "The minimum zoom level on which the layer gets parsed and appears on." + }, + "maxzoom": { + "type": "number", + "minimum": 0, + "maximum": 22, + "doc": "The maximum zoom level on which the layer gets parsed and appears on." + }, + "interactive": { + "type": "boolean", + "doc": "Enable querying of feature data from this layer for interactivity.", + "default": false + }, + "filter": { + "type": "filter", + "doc": "A expression specifying conditions on source features. Only features that match the filter are displayed." + }, + "layout": { + "type": "layout", + "doc": "Layout properties for the layer." + }, + "paint": { + "type": "paint", + "doc": "Default paint properties for this layer." + }, + "paint.*": { + "type": "paint", + "doc": "Class-specific paint properties for this layer. The class name is the part after the first dot." + } + }, + "layout": [ + "layout_fill", + "layout_line", + "layout_symbol", + "layout_raster", + "layout_background" + ], + "layout_background": { + "visibility": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "visible", + "none" + ], + "default": "visible", + "doc": "The display of this layer. `none` hides this layer." + } + }, + "layout_fill": { + "visibility": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "visible", + "none" + ], + "default": "visible", + "doc": "The display of this layer. `none` hides this layer." + } + }, + "layout_line": { + "line-cap": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "butt", + "round", + "square" + ], + "default": "butt", + "doc": "The display of line endings." + }, + "line-join": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "bevel", + "round", + "miter" + ], + "default": "miter", + "doc": "The display of lines when joining." + }, + "line-miter-limit": { + "type": "number", + "default": 2, + "function": "interpolated", + "doc": "Used to automatically convert miter joins to bevel joins for sharp angles.", + "requires": [ + { + "line-join": "miter" + } + ] + }, + "line-round-limit": { + "type": "number", + "default": 1, + "function": "interpolated", + "doc": "Used to automatically convert round joins to miter joins for shallow angles.", + "requires": [ + { + "line-join": "round" + } + ] + }, + "visibility": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "visible", + "none" + ], + "default": "visible", + "doc": "The display of this layer. `none` hides this layer." + } + }, + "layout_symbol": { + "symbol-placement": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "point", + "line" + ], + "default": "point", + "doc": "Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons." + }, + "symbol-min-distance": { + "type": "number", + "default": 250, + "minimum": 1, + "function": "interpolated", + "units": "pixels", + "doc": "Minimum distance between two symbol anchors.", + "requires": [ + { + "symbol-placement": "line" + } + ] + }, + "symbol-avoid-edges": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer." + }, + "icon-allow-overlap": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the icon will be visible even if it collides with other icons and text.", + "requires": [ + "icon-image" + ] + }, + "icon-ignore-placement": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the icon won't affect placement of other icons and text.", + "requires": [ + "icon-image" + ] + }, + "icon-optional": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the symbol will appear without its icon, in spaces where the icon would make it too large to fit.", + "requires": [ + "icon-image", + "text-field" + ] + }, + "icon-rotation-alignment": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "default": "viewport", + "doc": "Orientation of icon when map is rotated.", + "requires": [ + "icon-image" + ] + }, + "icon-max-size": { + "type": "number", + "default": 1, + "minimum": 0, + "function": "interpolated", + "doc": "The maximum factor to scale the icon.", + "requires": [ + "icon-image" + ] + }, + "icon-image": { + "type": "string", + "function": "piecewise-constant", + "doc": "A string with {tokens} replaced, referencing the data property to pull from.", + "tokens": true + }, + "icon-rotate": { + "type": "number", + "default": 0, + "period": 360, + "function": "interpolated", + "units": "degrees", + "doc": "Rotates the icon clockwise.", + "requires": [ + "icon-image" + ] + }, + "icon-padding": { + "type": "number", + "default": 2, + "minimum": 0, + "function": "interpolated", + "units": "pixels", + "doc": "Padding value around icon bounding box to avoid icon collisions.", + "requires": [ + "icon-image" + ] + }, + "icon-keep-upright": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the icon may be flipped to prevent it from being rendered upside-down", + "requires": [ + "icon-image", + { + "icon-rotation-alignment": "map" + } + ] + }, + "icon-offset": { + "type": "array", + "value": "number", + "length": 2, + "default": [ + 0, + 0 + ], + "function": "interpolated", + "doc": "Icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.", + "requires": [ + "icon-image" + ] + }, + "text-rotation-alignment": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "default": "viewport", + "doc": "Orientation of icon or text when map is rotated.", + "requires": [ + "text-field" + ] + }, + "text-field": { + "type": "string", + "function": "piecewise-constant", + "default": "", + "tokens": true, + "doc": "Value to use for a text label. Feature properties are specified using tokens like {field_name}." + }, + "text-font": { + "type": "string", + "function": "piecewise-constant", + "default": "Open Sans Regular, Arial Unicode MS Regular", + "doc": "Font stack to use for displaying text.", + "requires": [ + "text-field" + ] + }, + "text-max-size": { + "type": "number", + "default": 16, + "minimum": 0, + "units": "pixels", + "function": "interpolated", + "doc": "The maximum size text will be laid out, to calculate collisions with.", + "requires": [ + "text-field" + ] + }, + "text-max-width": { + "type": "number", + "default": 15, + "minimum": 0, + "units": "em", + "function": "interpolated", + "doc": "The maximum line width for text wrapping.", + "requires": [ + "text-field" + ] + }, + "text-line-height": { + "type": "number", + "default": 1.2, + "units": "em", + "function": "interpolated", + "doc": "Text leading value for multi-line text.", + "requires": [ + "text-field" + ] + }, + "text-letter-spacing": { + "type": "number", + "default": 0, + "units": "em", + "function": "interpolated", + "doc": "Text kerning value.", + "requires": [ + "text-field" + ] + }, + "text-justify": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "left", + "center", + "right" + ], + "default": "center", + "doc": "Text justification options.", + "requires": [ + "text-field" + ] + }, + "text-anchor": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "center", + "left", + "right", + "top", + "bottom", + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "default": "center", + "doc": "Which part of the text to place closest to the anchor.", + "requires": [ + "text-field" + ] + }, + "text-max-angle": { + "type": "number", + "default": 45, + "units": "degrees", + "function": "interpolated", + "doc": "Maximum angle change between adjacent characters.", + "requires": [ + "text-field", + { + "symbol-placement": "line" + } + ] + }, + "text-rotate": { + "type": "number", + "default": 0, + "period": 360, + "units": "degrees", + "function": "interpolated", + "doc": "Rotates the text clockwise.", + "requires": [ + "text-field" + ] + }, + "text-padding": { + "type": "number", + "default": 2, + "minimum": 0, + "units": "pixels", + "function": "interpolated", + "doc": "Padding value around text bounding box to avoid label collisions.", + "requires": [ + "text-field" + ] + }, + "text-keep-upright": { + "type": "boolean", + "function": "piecewise-constant", + "default": true, + "doc": "If true, the text may be flipped vertically to prevent it from being rendered upside-down.", + "requires": [ + "text-field", + { + "text-rotation-alignment": "map" + } + ] + }, + "text-transform": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "none", + "uppercase", + "lowercase" + ], + "default": "none", + "doc": "Specifies how to capitalize text, similar to the CSS `text-transform` property.", + "requires": [ + "text-field" + ] + }, + "text-offset": { + "type": "array", + "doc": "Specifies the distance that text is offset from its anchor horizontally and vertically.", + "value": "number", + "units": "ems", + "function": "interpolated", + "length": 2, + "default": [ + 0, + 0 + ], + "requires": [ + "text-field" + ] + }, + "text-allow-overlap": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the text will be visible even if it collides with other icons and labels.", + "requires": [ + "text-field" + ] + }, + "text-ignore-placement": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the text won't affect placement of other icons and labels.", + "requires": [ + "text-field" + ] + }, + "text-optional": { + "type": "boolean", + "function": "piecewise-constant", + "default": false, + "doc": "If true, the symbol will appear without its text, in spaces where the text would make it too large to fit.", + "requires": [ + "text-field", + "icon-image" + ] + }, + "visibility": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "visible", + "none" + ], + "default": "visible", + "doc": "The display of this layer. `none` hides this layer." + } + }, + "layout_raster": { + "visibility": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "visible", + "none" + ], + "default": "visible", + "doc": "The display of this layer. `none` hides this layer." + } + }, + "filter": { + "type": "array", + "value": "*" + }, + "filter_operator": { + "type": "enum", + "values": [ + "==", + "!=", + ">", + ">=", + "<", + "<=", + "in", + "!in", + "all", + "any", + "none" + ] + }, + "geometry_type": { + "type": "enum", + "values": [ + "Point", + "LineString", + "Polygon" + ] + }, + "function": { + "stops": { + "type": "array", + "required": true, + "doc": "An array of stops.", + "value": "function_stop" + }, + "base": { + "type": "number", + "default": 1, + "minimum": 0, + "doc": "The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly." + } + }, + "function_stop": { + "type": "array", + "minimum": 0, + "maximum": 22, + "value": [ + "number", + "color" + ], + "length": 2, + "doc": "Zoom level and value pair." + }, + "paint": [ + "paint_fill", + "paint_line", + "paint_symbol", + "paint_raster", + "paint_background" + ], + "paint_fill": { + "fill-antialias": { + "type": "boolean", + "function": "piecewise-constant", + "default": true, + "doc": "Whether or not the fill should be antialiased." + }, + "fill-opacity": { + "type": "number", + "function": "interpolated", + "default": 1, + "minimum": 0, + "maximum": 1, + "doc": "The opacity given to the fill color.", + "transition": true + }, + "fill-color": { + "type": "color", + "default": "#000000", + "doc": "The color of the fill.", + "function": "interpolated", + "transition": true, + "requires": [ + { + "!": "fill-image" + } + ] + }, + "fill-outline-color": { + "type": "color", + "doc": "The outline color of the fill. Matches the value of `fill-color` if unspecified.", + "function": "interpolated", + "transition": true, + "requires": [ + { + "!": "fill-image" + }, + { + "fill-antialias": true + } + ] + }, + "fill-translate": { + "type": "array", + "value": "number", + "length": 2, + "default": [ + 0, + 0 + ], + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively." + }, + "fill-translate-anchor": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", + "default": "map", + "requires": [ + "fill-translate" + ] + }, + "fill-image": { + "type": "string", + "function": "piecewise-constant", + "transition": true, + "doc": "Name of image in sprite to use for drawing image fills." + } + }, + "paint_line": { + "line-opacity": { + "type": "number", + "doc": "The opacity at which the line will be drawn.", + "function": "interpolated", + "default": 1, + "minimum": 0, + "maximum": 1, + "transition": true + }, + "line-color": { + "type": "color", + "doc": "The color with which the line will be drawn.", + "default": "#000000", + "function": "interpolated", + "transition": true, + "requires": [ + { + "!": "line-image" + } + ] + }, + "line-translate": { + "type": "array", + "value": "number", + "length": 2, + "default": [ + 0, + 0 + ], + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively." + }, + "line-translate-anchor": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", + "default": "map", + "requires": [ + "line-translate" + ] + }, + "line-width": { + "type": "number", + "default": 1, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Stroke thickness." + }, + "line-gap-width": { + "type": "number", + "default": 0, + "minimum": 0, + "doc": "Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.", + "function": "interpolated", + "transition": true, + "units": "pixels" + }, + "line-blur": { + "type": "number", + "default": 0, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Blur applied to the line, in pixels." + }, + "line-dasharray": { + "type": "array", + "function": "piecewise-constant", + "value": "number", + "doc": "Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.", + "minimum": 0, + "transition": true, + "units": "line widths", + "requires": [ + { + "!": "line-image" + } + ] + }, + "line-image": { + "type": "string", + "function": "piecewise-constant", + "transition": true, + "doc": "Name of image in sprite to use for drawing image lines." + } + }, + "paint_symbol": { + "icon-opacity": { + "doc": "The opacity at which the icon will be drawn.", + "type": "number", + "default": 1, + "minimum": 0, + "maximum": 1, + "function": "interpolated", + "transition": true, + "requires": [ + "icon-image" + ] + }, + "icon-size": { + "type": "number", + "default": 1, + "function": "interpolated", + "transition": true, + "doc": "Scale factor for icon. 1 is original size, 3 triples the size.", + "requires": [ + "icon-image" + ] + }, + "icon-color": { + "type": "color", + "default": "#000000", + "function": "interpolated", + "transition": true, + "doc": "The color of the icon. This can only be used with sdf icons.", + "requires": [ + "icon-image" + ] + }, + "icon-halo-color": { + "type": "color", + "default": "rgba(0, 0, 0, 0)", + "function": "interpolated", + "transition": true, + "doc": "The color of the icon's halo. Icon halos can only be used with sdf icons.", + "requires": [ + "icon-image" + ] + }, + "icon-halo-width": { + "type": "number", + "default": 0, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Distance of halo to the icon outline.", + "requires": [ + "icon-image" + ] + }, + "icon-halo-blur": { + "type": "number", + "default": 0, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Fade out the halo towards the outside.", + "requires": [ + "icon-image" + ] + }, + "icon-translate": { + "type": "array", + "value": "number", + "length": 2, + "default": [ + 0, + 0 + ], + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "An icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.", + "requires": [ + "icon-image" + ] + }, + "icon-translate-anchor": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", + "default": "map", + "requires": [ + "icon-image", + "icon-translate" + ] + }, + "text-opacity": { + "type": "number", + "doc": "The opacity at which the text will be drawn.", + "default": 1, + "minimum": 0, + "maximum": 1, + "function": "interpolated", + "transition": true, + "requires": [ + "text-field" + ] + }, + "text-size": { + "type": "number", + "default": 16, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Font size. If unspecified, the text will be as big as allowed by the layer definition.", + "requires": [ + "text-field" + ] + }, + "text-color": { + "type": "color", + "doc": "The color with which the text will be drawn.", + "default": "#000000", + "function": "interpolated", + "transition": true, + "requires": [ + "text-field" + ] + }, + "text-halo-color": { + "type": "color", + "default": "rgba(0, 0, 0, 0)", + "function": "interpolated", + "transition": true, + "doc": "The color of the text's halo, which helps it stand out from backgrounds.", + "requires": [ + "text-field" + ] + }, + "text-halo-width": { + "type": "number", + "default": 0, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.", + "requires": [ + "text-field" + ] + }, + "text-halo-blur": { + "type": "number", + "default": 0, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "The halo's fadeout distance towards the outside.", + "requires": [ + "text-field" + ] + }, + "text-translate": { + "type": "array", + "value": "number", + "length": 2, + "default": [ + 0, + 0 + ], + "function": "interpolated", + "transition": true, + "units": "pixels", + "doc": "Label offset. Values are [x, y] where negatives indicate left and up, respectively.", + "requires": [ + "text-field" + ] + }, + "text-translate-anchor": { + "type": "enum", + "function": "piecewise-constant", + "values": [ + "map", + "viewport" + ], + "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", + "default": "map", + "requires": [ + "text-field", + "text-translate" + ] + } + }, + "paint_raster": { + "raster-opacity": { + "type": "number", + "doc": "The opacity at which the image will be drawn.", + "default": 1, + "minimum": 0, + "maximum": 1, + "function": "interpolated", + "transition": true + }, + "raster-hue-rotate": { + "type": "number", + "default": 0, + "period": 360, + "function": "interpolated", + "transition": true, + "units": "degrees", + "doc": "Rotates hues around the color wheel." + }, + "raster-brightness-min": { + "type": "number", + "function": "interpolated", + "doc": "Increase or reduce the brightness of the image. The value is the minimum brightness.", + "default": 0, + "minimum": 0, + "maximum": 1, + "transition": true + }, + "raster-brightness-max": { + "type": "number", + "function": "interpolated", + "doc": "Increase or reduce the brightness of the image. The value is the maximum brightness.", + "default": 1, + "minimum": 0, + "maximum": 1, + "transition": true + }, + "raster-saturation": { + "type": "number", + "doc": "Increase or reduce the saturation of the image.", + "default": 0, + "minimum": -1, + "maximum": 1, + "function": "interpolated", + "transition": true + }, + "raster-contrast": { + "type": "number", + "doc": "Increase or reduce the contrast of the image.", + "default": 0, + "minimum": -1, + "maximum": 1, + "function": "interpolated", + "transition": true + }, + "raster-fade-duration": { + "type": "number", + "default": 300, + "minimum": 0, + "function": "interpolated", + "transition": true, + "units": "milliseconds", + "doc": "Fade duration when a new tile is added." + } + }, + "paint_background": { + "background-color": { + "type": "color", + "default": "#000000", + "doc": "The color with which the background will be drawn.", + "function": "interpolated", + "transition": true, + "requires": [ + { + "!": "background-image" + } + ] + }, + "background-image": { + "type": "string", + "function": "piecewise-constant", + "transition": true, + "doc": "Optionally an image which is drawn as the background." + }, + "background-opacity": { + "type": "number", + "default": 1, + "minimum": 0, + "maximum": 1, + "doc": "The opacity at which the background will be drawn.", + "function": "interpolated", + "transition": true + } + }, + "transition": { + "duration": { + "type": "number", + "default": 300, + "minimum": 0, + "units": "milliseconds", + "doc": "Time allotted for transitions to complete." + }, + "delay": { + "type": "number", + "default": 0, + "minimum": 0, + "units": "milliseconds", + "doc": "Length of time before a transition begins." + } + } +} + +},{}],131:[function(require,module,exports){ +'use strict'; + +// lightweight Buffer shim for pbf browser build +// based on code from github.com/feross/buffer (MIT-licensed) + +module.exports = Buffer; + +var ieee754 = require('ieee754'); + +var BufferMethods; + +function Buffer(length) { + var arr; + if (length && length.length) { + arr = length; + length = arr.length; + } + var buf = new Uint8Array(length || 0); + if (arr) buf.set(arr); + + buf.readUInt32LE = BufferMethods.readUInt32LE; + buf.writeUInt32LE = BufferMethods.writeUInt32LE; + buf.readInt32LE = BufferMethods.readInt32LE; + buf.writeInt32LE = BufferMethods.writeInt32LE; + buf.readFloatLE = BufferMethods.readFloatLE; + buf.writeFloatLE = BufferMethods.writeFloatLE; + buf.readDoubleLE = BufferMethods.readDoubleLE; + buf.writeDoubleLE = BufferMethods.writeDoubleLE; + buf.toString = BufferMethods.toString; + buf.write = BufferMethods.write; + buf.slice = BufferMethods.slice; + buf.copy = BufferMethods.copy; + + buf._isBuffer = true; + return buf; +} + +var lastStr, lastStrEncoded; + +BufferMethods = { + readUInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] * 0x1000000); + }, + + writeUInt32LE: function(val, pos) { + this[pos] = val; + this[pos + 1] = (val >>> 8); + this[pos + 2] = (val >>> 16); + this[pos + 3] = (val >>> 24); + }, + + readInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] << 24); + }, + + readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, + readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, + + writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, + writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, + + toString: function(encoding, start, end) { + var str = '', + tmp = ''; + + start = start || 0; + end = Math.min(this.length, end || this.length); + + for (var i = start; i < end; i++) { + var ch = this[i]; + if (ch <= 0x7F) { + str += decodeURIComponent(tmp) + String.fromCharCode(ch); + tmp = ''; + } else { + tmp += '%' + ch.toString(16); + } + } + + str += decodeURIComponent(tmp); + + return str; + }, + + write: function(str, pos) { + var bytes = str === lastStr ? lastStrEncoded : encodeString(str); + for (var i = 0; i < bytes.length; i++) { + this[pos + i] = bytes[i]; + } + }, + + slice: function(start, end) { + return this.subarray(start, end); + }, + + copy: function(buf, pos) { + pos = pos || 0; + for (var i = 0; i < this.length; i++) { + buf[pos + i] = this[i]; + } + } +}; + +BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; + +Buffer.byteLength = function(str) { + lastStr = str; + lastStrEncoded = encodeString(str); + return lastStrEncoded.length; +}; + +Buffer.isBuffer = function(buf) { + return !!(buf && buf._isBuffer); +}; + +function encodeString(str) { + var length = str.length, + bytes = []; + + for (var i = 0, c, lead; i < length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + + if (lead) { + if (c < 0xDC00) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = c; + continue; + + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + + } else { + if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); + else lead = c; + + continue; + } + + } else if (lead) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = null; + } + + if (c < 0x80) bytes.push(c); + else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); + else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + return bytes; +} + +},{"ieee754":133}],132:[function(require,module,exports){ +(function (global){ +'use strict'; + +module.exports = Pbf; + +var Buffer = global.Buffer || require('./buffer'); + +function Pbf(buf) { + this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; + this.pos = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, + POW_2_63 = Math.pow(2, 63); + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + end = end || this.length; + + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; + + readField(tag, result, this); + + if (this.pos === startPos) this.skip(val); + } + return result; + }, + + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + + readFixed32: function() { + var val = this.buf.readUInt32LE(this.pos); + this.pos += 4; + return val; + }, + + readSFixed32: function() { + var val = this.buf.readInt32LE(this.pos); + this.pos += 4; + return val; + }, + + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readFloat: function() { + var val = this.buf.readFloatLE(this.pos); + this.pos += 4; + return val; + }, + + readDouble: function() { + var val = this.buf.readDoubleLE(this.pos); + this.pos += 8; + return val; + }, + + readVarint: function() { + var buf = this.buf, + val, b, b0, b1, b2, b3; + + b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; + b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; + b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; + b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; + + val = b0 | b1 | b2 | (b3 & 0x7f) << 21; + + b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; + + throw new Error('Expected varint not more than 10 bytes'); + }, + + readVarint64: function() { + var startPos = this.pos, + val = this.readVarint(); + + if (val < POW_2_63) return val; + + var pos = this.pos - 2; + while (this.buf[pos] === 0xff) pos--; + if (pos < startPos) pos = startPos; + + val = 0; + for (var i = 0; i < pos - startPos + 1; i++) { + var b = ~this.buf[startPos + i] & 0x7f; + val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); + } + + return -val - 1; + }, + + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + + readBoolean: function() { + return Boolean(this.readVarint()); + }, + + readString: function() { + var end = this.readVarint() + this.pos, + str = this.buf.toString('utf8', this.pos, end); + this.pos = end; + return str; + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.slice(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + readPackedVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readVarint()); + return arr; + }, + readPackedSVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, + + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) length *= 2; + + if (length !== this.length) { + var buf = new Buffer(length); + this.buf.copy(buf); + this.buf = buf; + this.length = length; + } + }, + + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.slice(0, this.length); + }, + + writeFixed32: function(val) { + this.realloc(4); + this.buf.writeUInt32LE(val, this.pos); + this.pos += 4; + }, + + writeSFixed32: function(val) { + this.realloc(4); + this.buf.writeInt32LE(val, this.pos); + this.pos += 4; + }, + + writeFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeSFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeVarint: function(val) { + val = +val; + + if (val <= 0x7f) { + this.realloc(1); + this.buf[this.pos++] = val; + + } else if (val <= 0x3fff) { + this.realloc(2); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f); + + } else if (val <= 0x1fffff) { + this.realloc(3); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f); + + } else if (val <= 0xfffffff) { + this.realloc(4); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 21) & 0x7f); + + } else { + var pos = this.pos; + while (val >= 0x80) { + this.realloc(1); + this.buf[this.pos++] = (val & 0xff) | 0x80; + val /= 0x80; + } + this.realloc(1); + this.buf[this.pos++] = val | 0; + if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + var bytes = Buffer.byteLength(str); + this.writeVarint(bytes); + this.realloc(bytes); + this.buf.write(str, this.pos); + this.pos += bytes; + }, + + writeFloat: function(val) { + this.realloc(4); + this.buf.writeFloatLE(val, this.pos); + this.pos += 4; + }, + + writeDouble: function(val) { + this.realloc(8); + this.buf.writeDoubleLE(val, this.pos); + this.pos += 8; + }, + + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + + this.pos++; // reserve 1 byte for short message length + + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + + var varintLen = + len <= 0x7f ? 1 : + len <= 0x3fff ? 2 : + len <= 0x1fffff ? 3 : + len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + + // if 1 byte isn't enough for encoding message length, shift the data to the right + if (varintLen > 1) { + this.realloc(varintLen - 1); + for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; + } + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, + + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./buffer":131}],133:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],134:[function(require,module,exports){ +'use strict'; + +module.exports = Point; + +function Point(x, y) { + this.x = x; + this.y = y; +} + +Point.prototype = { + clone: function() { return new Point(this.x, this.y); }, + + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, + + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, + + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + angle: function() { + return Math.atan2(this.y, this.x); + }, + + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, + + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, + + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, + + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, + + _unit: function() { + this._div(this.mag()); + return this; + }, + + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; + +// constructs Point from an array if necessary +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; + +},{}],135:[function(require,module,exports){ +/* + (c) 2013, Vladimir Agafonkin + RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles. + https://github.com/mourner/rbush +*/ + +(function () { 'use strict'; + +function rbush(maxEntries, format) { + + // jshint newcap: false, validthis: true + if (!(this instanceof rbush)) return new rbush(maxEntries, format); + + // max entries in a node is 9 by default; min node fill is 40% for best performance + this._maxEntries = Math.max(4, maxEntries || 9); + this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)); + + if (format) { + this._initFormat(format); + } + + this.clear(); +} + +rbush.prototype = { + + all: function () { + return this._all(this.data, []); + }, + + search: function (bbox) { + + var node = this.data, + result = [], + toBBox = this.toBBox; + + if (!intersects(bbox, node.bbox)) return result; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child.bbox; + + if (intersects(bbox, childBBox)) { + if (node.leaf) result.push(child); + else if (contains(bbox, childBBox)) this._all(child, result); + else nodesToSearch.push(child); + } + } + node = nodesToSearch.pop(); + } + + return result; + }, + + collides: function (bbox) { + + var node = this.data, + toBBox = this.toBBox; + + if (!intersects(bbox, node.bbox)) return false; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child.bbox; + + if (intersects(bbox, childBBox)) { + if (node.leaf || contains(bbox, childBBox)) return true; + nodesToSearch.push(child); + } + } + node = nodesToSearch.pop(); + } + + return false; + }, + + load: function (data) { + if (!(data && data.length)) return this; + + if (data.length < this._minEntries) { + for (var i = 0, len = data.length; i < len; i++) { + this.insert(data[i]); + } + return this; + } + + // recursively build the tree with the given data from stratch using OMT algorithm + var node = this._build(data.slice(), 0, data.length - 1, 0); + + if (!this.data.children.length) { + // save as is if tree is empty + this.data = node; + + } else if (this.data.height === node.height) { + // split root if trees have the same height + this._splitRoot(this.data, node); + + } else { + if (this.data.height < node.height) { + // swap trees if inserted one is bigger + var tmpNode = this.data; + this.data = node; + node = tmpNode; + } + + // insert the small tree into the large tree at appropriate level + this._insert(node, this.data.height - node.height - 1, true); + } + + return this; + }, + + insert: function (item) { + if (item) this._insert(item, this.data.height - 1); + return this; + }, + + clear: function () { + this.data = { + children: [], + height: 1, + bbox: empty(), + leaf: true + }; + return this; + }, + + remove: function (item) { + if (!item) return this; + + var node = this.data, + bbox = this.toBBox(item), + path = [], + indexes = [], + i, parent, index, goingUp; + + // depth-first iterative tree traversal + while (node || path.length) { + + if (!node) { // go up + node = path.pop(); + parent = path[path.length - 1]; + i = indexes.pop(); + goingUp = true; + } + + if (node.leaf) { // check current node + index = node.children.indexOf(item); + + if (index !== -1) { + // item found, remove the item and condense tree upwards + node.children.splice(index, 1); + path.push(node); + this._condense(path); + return this; + } + } + + if (!goingUp && !node.leaf && contains(node.bbox, bbox)) { // go down + path.push(node); + indexes.push(i); + i = 0; + parent = node; + node = node.children[0]; + + } else if (parent) { // go right + i++; + node = parent.children[i]; + goingUp = false; + + } else node = null; // nothing found + } + + return this; + }, + + toBBox: function (item) { return item; }, + + compareMinX: function (a, b) { return a[0] - b[0]; }, + compareMinY: function (a, b) { return a[1] - b[1]; }, + + toJSON: function () { return this.data; }, + + fromJSON: function (data) { + this.data = data; + return this; + }, + + _all: function (node, result) { + var nodesToSearch = []; + while (node) { + if (node.leaf) result.push.apply(result, node.children); + else nodesToSearch.push.apply(nodesToSearch, node.children); + + node = nodesToSearch.pop(); + } + return result; + }, + + _build: function (items, left, right, height) { + + var N = right - left + 1, + M = this._maxEntries, + node; + + if (N <= M) { + // reached leaf level; return leaf + node = { + children: items.slice(left, right + 1), + height: 1, + bbox: null, + leaf: true + }; + calcBBox(node, this.toBBox); + return node; + } + + if (!height) { + // target height of the bulk-loaded tree + height = Math.ceil(Math.log(N) / Math.log(M)); + + // target number of root entries to maximize storage utilization + M = Math.ceil(N / Math.pow(M, height - 1)); + } + + // TODO eliminate recursion? + + node = { + children: [], + height: height, + bbox: null + }; + + // split the items into M mostly square tiles + + var N2 = Math.ceil(N / M), + N1 = N2 * Math.ceil(Math.sqrt(M)), + i, j, right2, right3; + + multiSelect(items, left, right, N1, this.compareMinX); + + for (i = left; i <= right; i += N1) { + + right2 = Math.min(i + N1 - 1, right); + + multiSelect(items, i, right2, N2, this.compareMinY); + + for (j = i; j <= right2; j += N2) { + + right3 = Math.min(j + N2 - 1, right2); + + // pack each entry recursively + node.children.push(this._build(items, j, right3, height - 1)); + } + } + + calcBBox(node, this.toBBox); + + return node; + }, + + _chooseSubtree: function (bbox, node, level, path) { + + var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + + while (true) { + path.push(node); + + if (node.leaf || path.length - 1 === level) break; + + minArea = minEnlargement = Infinity; + + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + area = bboxArea(child.bbox); + enlargement = enlargedArea(bbox, child.bbox) - area; + + // choose entry with the least area enlargement + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = area < minArea ? area : minArea; + targetNode = child; + + } else if (enlargement === minEnlargement) { + // otherwise choose one with the smallest area + if (area < minArea) { + minArea = area; + targetNode = child; + } + } + } + + node = targetNode; + } + + return node; + }, + + _insert: function (item, level, isNode) { + + var toBBox = this.toBBox, + bbox = isNode ? item.bbox : toBBox(item), + insertPath = []; + + // find the best node for accommodating the item, saving all nodes along the path too + var node = this._chooseSubtree(bbox, this.data, level, insertPath); + + // put the item into the node + node.children.push(item); + extend(node.bbox, bbox); + + // split on node overflow; propagate upwards if necessary + while (level >= 0) { + if (insertPath[level].children.length > this._maxEntries) { + this._split(insertPath, level); + level--; + } else break; + } + + // adjust bboxes along the insertion path + this._adjustParentBBoxes(bbox, insertPath, level); + }, + + // split overflowed node into two + _split: function (insertPath, level) { + + var node = insertPath[level], + M = node.children.length, + m = this._minEntries; + + this._chooseSplitAxis(node, m, M); + + var newNode = { + children: node.children.splice(this._chooseSplitIndex(node, m, M)), + height: node.height + }; + + if (node.leaf) newNode.leaf = true; + + calcBBox(node, this.toBBox); + calcBBox(newNode, this.toBBox); + + if (level) insertPath[level - 1].children.push(newNode); + else this._splitRoot(node, newNode); + }, + + _splitRoot: function (node, newNode) { + // split root node + this.data = { + children: [node, newNode], + height: node.height + 1 + }; + calcBBox(this.data, this.toBBox); + }, + + _chooseSplitIndex: function (node, m, M) { + + var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + + minOverlap = minArea = Infinity; + + for (i = m; i <= M - m; i++) { + bbox1 = distBBox(node, 0, i, this.toBBox); + bbox2 = distBBox(node, i, M, this.toBBox); + + overlap = intersectionArea(bbox1, bbox2); + area = bboxArea(bbox1) + bboxArea(bbox2); + + // choose distribution with minimum overlap + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + + minArea = area < minArea ? area : minArea; + + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } + } + } + + return index; + }, + + // sorts node children by the best axis for split + _chooseSplitAxis: function (node, m, M) { + + var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, + compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, + xMargin = this._allDistMargin(node, m, M, compareMinX), + yMargin = this._allDistMargin(node, m, M, compareMinY); + + // if total distributions margin value is minimal for x, sort by minX, + // otherwise it's already sorted by minY + if (xMargin < yMargin) node.children.sort(compareMinX); + }, + + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function (node, m, M, compare) { + + node.children.sort(compare); + + var toBBox = this.toBBox, + leftBBox = distBBox(node, 0, m, toBBox), + rightBBox = distBBox(node, M - m, M, toBBox), + margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), + i, child; + + for (i = m; i < M - m; i++) { + child = node.children[i]; + extend(leftBBox, node.leaf ? toBBox(child) : child.bbox); + margin += bboxMargin(leftBBox); + } + + for (i = M - m - 1; i >= m; i--) { + child = node.children[i]; + extend(rightBBox, node.leaf ? toBBox(child) : child.bbox); + margin += bboxMargin(rightBBox); + } + + return margin; + }, + + _adjustParentBBoxes: function (bbox, path, level) { + // adjust bboxes along the given tree path + for (var i = level; i >= 0; i--) { + extend(path[i].bbox, bbox); + } + }, + + _condense: function (path) { + // go through the path, removing empty nodes and updating bboxes + for (var i = path.length - 1, siblings; i >= 0; i--) { + if (path[i].children.length === 0) { + if (i > 0) { + siblings = path[i - 1].children; + siblings.splice(siblings.indexOf(path[i]), 1); + + } else this.clear(); + + } else calcBBox(path[i], this.toBBox); + } + }, + + _initFormat: function (format) { + // data format (minX, minY, maxX, maxY accessors) + + // uses eval-type function compilation instead of just accepting a toBBox function + // because the algorithms are very sensitive to sorting functions performance, + // so they should be dead simple and without inner calls + + // jshint evil: true + + var compareArr = ['return a', ' - b', ';']; + + this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); + this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + + this.toBBox = new Function('a', 'return [a' + format.join(', a') + '];'); + } +}; + + +// calculate node's bbox from bboxes of its children +function calcBBox(node, toBBox) { + node.bbox = distBBox(node, 0, node.children.length, toBBox); +} + +// min bounding rectangle of node children from k to p-1 +function distBBox(node, k, p, toBBox) { + var bbox = empty(); + + for (var i = k, child; i < p; i++) { + child = node.children[i]; + extend(bbox, node.leaf ? toBBox(child) : child.bbox); + } + + return bbox; +} + +function empty() { return [Infinity, Infinity, -Infinity, -Infinity]; } + +function extend(a, b) { + a[0] = Math.min(a[0], b[0]); + a[1] = Math.min(a[1], b[1]); + a[2] = Math.max(a[2], b[2]); + a[3] = Math.max(a[3], b[3]); + return a; +} + +function compareNodeMinX(a, b) { return a.bbox[0] - b.bbox[0]; } +function compareNodeMinY(a, b) { return a.bbox[1] - b.bbox[1]; } + +function bboxArea(a) { return (a[2] - a[0]) * (a[3] - a[1]); } +function bboxMargin(a) { return (a[2] - a[0]) + (a[3] - a[1]); } + +function enlargedArea(a, b) { + return (Math.max(b[2], a[2]) - Math.min(b[0], a[0])) * + (Math.max(b[3], a[3]) - Math.min(b[1], a[1])); +} + +function intersectionArea(a, b) { + var minX = Math.max(a[0], b[0]), + minY = Math.max(a[1], b[1]), + maxX = Math.min(a[2], b[2]), + maxY = Math.min(a[3], b[3]); + + return Math.max(0, maxX - minX) * + Math.max(0, maxY - minY); +} + +function contains(a, b) { + return a[0] <= b[0] && + a[1] <= b[1] && + b[2] <= a[2] && + b[3] <= a[3]; +} + +function intersects(a, b) { + return b[0] <= a[2] && + b[1] <= a[3] && + b[2] >= a[0] && + b[3] >= a[1]; +} + +// sort an array so that items come in groups of n unsorted items, with groups sorted between each other; +// combines selection algorithm with binary divide & conquer approach + +function multiSelect(arr, left, right, n, compare) { + var stack = [left, right], + mid; + + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + + if (right - left <= n) continue; + + mid = left + Math.ceil((right - left) / n / 2) * n; + select(arr, left, right, mid, compare); + + stack.push(left, mid, mid, right); + } +} + +// Floyd-Rivest selection algorithm: +// sort an array between left and right (inclusive) so that the smallest k elements come first (unordered) +function select(arr, left, right, k, compare) { + var n, i, z, s, sd, newLeft, newRight, t, j; + + while (right > left) { + if (right - left > 600) { + n = right - left + 1; + i = k - left + 1; + z = Math.log(n); + s = 0.5 * Math.exp(2 * z / 3); + sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (i - n / 2 < 0 ? -1 : 1); + newLeft = Math.max(left, Math.floor(k - i * s / n + sd)); + newRight = Math.min(right, Math.floor(k + (n - i) * s / n + sd)); + select(arr, newLeft, newRight, k, compare); + } + + t = arr[k]; + i = left; + j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) i++; + while (compare(arr[j], t) > 0) j--; + } + + if (compare(arr[left], t) === 0) swap(arr, left, j); + else { + j++; + swap(arr, j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + + +// export as AMD/CommonJS module or global variable +if (typeof define === 'function' && define.amd) define('rbush', function() { return rbush; }); +else if (typeof module !== 'undefined') module.exports = rbush; +else if (typeof self !== 'undefined') self.rbush = rbush; +else window.rbush = rbush; + +})(); + +},{}],136:[function(require,module,exports){ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +void (function(root, factory) { + if (typeof define === "function" && define.amd) { + define(factory) + } else if (typeof exports === "object") { + module.exports = factory() + } else { + root.resolveUrl = factory() + } +}(this, function() { + + function resolveUrl(/* ...urls */) { + var numUrls = arguments.length + + if (numUrls === 0) { + throw new Error("resolveUrl requires at least one argument; got none.") + } + + var base = document.createElement("base") + base.href = arguments[0] + + if (numUrls === 1) { + return base.href + } + + var head = document.getElementsByTagName("head")[0] + head.insertBefore(base, head.firstChild) + + var a = document.createElement("a") + var resolved + + for (var index = 1; index < numUrls; index++) { + a.href = arguments[index] + resolved = a.href + base.href = resolved + } + + head.removeChild(base) + + return resolved + } + + return resolveUrl + +})); + +},{}],137:[function(require,module,exports){ +/* + * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Ported from Webkit + * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h + */ + +module.exports = UnitBezier; + +function UnitBezier(p1x, p1y, p2x, p2y) { + // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). + this.cx = 3.0 * p1x; + this.bx = 3.0 * (p2x - p1x) - this.cx; + this.ax = 1.0 - this.cx - this.bx; + + this.cy = 3.0 * p1y; + this.by = 3.0 * (p2y - p1y) - this.cy; + this.ay = 1.0 - this.cy - this.by; + + this.p1x = p1x; + this.p1y = p2y; + this.p2x = p2x; + this.p2y = p2y; +} + +UnitBezier.prototype.sampleCurveX = function(t) { + // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. + return ((this.ax * t + this.bx) * t + this.cx) * t; +}; + +UnitBezier.prototype.sampleCurveY = function(t) { + return ((this.ay * t + this.by) * t + this.cy) * t; +}; + +UnitBezier.prototype.sampleCurveDerivativeX = function(t) { + return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; +}; + +UnitBezier.prototype.solveCurveX = function(x, epsilon) { + if (typeof epsilon === 'undefined') epsilon = 1e-6; + + var t0, t1, t2, x2, i; + + // First try a few iterations of Newton's method -- normally very fast. + for (t2 = x, i = 0; i < 8; i++) { + + x2 = this.sampleCurveX(t2) - x; + if (Math.abs(x2) < epsilon) return t2; + + var d2 = this.sampleCurveDerivativeX(t2); + if (Math.abs(d2) < 1e-6) break; + + t2 = t2 - x2 / d2; + } + + // Fall back to the bisection method for reliability. + t0 = 0.0; + t1 = 1.0; + t2 = x; + + if (t2 < t0) return t0; + if (t2 > t1) return t1; + + while (t0 < t1) { + + x2 = this.sampleCurveX(t2); + if (Math.abs(x2 - x) < epsilon) return t2; + + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + + t2 = (t1 - t0) * 0.5 + t0; + } + + // Failure. + return t2; +}; + +UnitBezier.prototype.solve = function(x, epsilon) { + return this.sampleCurveY(this.solveCurveX(x, epsilon)); +}; + +},{}],138:[function(require,module,exports){ +module.exports.VectorTile = require('./lib/vectortile.js'); +module.exports.VectorTileFeature = require('./lib/vectortilefeature.js'); +module.exports.VectorTileLayer = require('./lib/vectortilelayer.js'); + +},{"./lib/vectortile.js":139,"./lib/vectortilefeature.js":140,"./lib/vectortilelayer.js":141}],139:[function(require,module,exports){ +'use strict'; + +var VectorTileLayer = require('./vectortilelayer'); + +module.exports = VectorTile; + +function VectorTile(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) layers[layer.name] = layer; + } +} + + +},{"./vectortilelayer":141}],140:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = VectorTileFeature; + +function VectorTileFeature(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; + + // Private + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) feature._id = pbf.readVarint(); + else if (tag == 2) readTag(pbf, feature); + else if (tag == 3) feature.type = pbf.readVarint(); + else if (tag == 4) feature._geometry = pbf.pos; +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + feature.properties[key] = value; + } +} + +VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature.prototype.loadGeometry = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { // moveTo + if (line) lines.push(line); + line = []; + } + + line.push(new Point(x, y)); + + } else if (cmd === 7) { + + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) lines.push(line); + + return lines; +}; + +VectorTileFeature.prototype.bbox = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) x1 = x; + if (x > x2) x2 = x; + if (y < y1) y1 = y; + if (y > y2) y2 = y; + + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature.types[this.type]; + + for (var i = 0; i < coords.length; i++) { + var line = coords[i]; + for (var j = 0; j < line.length; j++) { + var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [ + (p.x + x0) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + ]; + } + } + + if (type === 'Point' && coords.length === 1) { + coords = coords[0][0]; + } else if (type === 'Point') { + coords = coords[0]; + type = 'MultiPoint'; + } else if (type === 'LineString' && coords.length === 1) { + coords = coords[0]; + } else if (type === 'LineString') { + type = 'MultiLineString'; + } + + return { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; +}; + +},{"point-geometry":134}],141:[function(require,module,exports){ +'use strict'; + +var VectorTileFeature = require('./vectortilefeature.js'); + +module.exports = VectorTileLayer; + +function VectorTileLayer(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + + // Private + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + + pbf.readFields(readLayer, this, end); + + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) layer.version = pbf.readVarint(); + else if (tag === 1) layer.name = pbf.readString(); + else if (tag === 5) layer.extent = pbf.readVarint(); + else if (tag === 2) layer._features.push(pbf.pos); + else if (tag === 3) layer._keys.push(pbf.readString()); + else if (tag === 4) layer._values.push(readValueMessage(pbf)); +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + + value = tag === 1 ? pbf.readString() : + tag === 2 ? pbf.readFloat() : + tag === 3 ? pbf.readDouble() : + tag === 4 ? pbf.readVarint64() : + tag === 5 ? pbf.readVarint() : + tag === 6 ? pbf.readSVarint() : + tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} + +// return feature `i` from this layer as a `VectorTileFeature` +VectorTileLayer.prototype.feature = function(i) { + if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); + + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); +}; + +},{"./vectortilefeature.js":140}],142:[function(require,module,exports){ +var bundleFn = arguments[3]; +var sources = arguments[4]; +var cache = arguments[5]; + +var stringify = JSON.stringify; + +module.exports = function (fn) { + var keys = []; + var wkey; + var cacheKeys = Object.keys(cache); + + for (var i = 0, l = cacheKeys.length; i < l; i++) { + var key = cacheKeys[i]; + if (cache[key].exports === fn) { + wkey = key; + break; + } + } + + if (!wkey) { + wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); + var wcache = {}; + for (var i = 0, l = cacheKeys.length; i < l; i++) { + var key = cacheKeys[i]; + wcache[key] = key; + } + sources[wkey] = [ + Function(['require','module','exports'], '(' + fn + ')(self)'), + wcache + ]; + } + var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); + + var scache = {}; scache[wkey] = wkey; + sources[skey] = [ + Function(['require'],'require(' + stringify(wkey) + ')(self)'), + scache + ]; + + var src = '(' + bundleFn + ')({' + + Object.keys(sources).map(function (key) { + return stringify(key) + ':[' + + sources[key][0] + + ',' + stringify(sources[key][1]) + ']' + ; + }).join(',') + + '},{},[' + stringify(skey) + '])' + ; + + var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; + + return new Worker(URL.createObjectURL( + new Blob([src], { type: 'text/javascript' }) + )); +}; + +},{}]},{},[22])(22) +}); +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcy9kYXRhL2J1ZmZlci9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9idWZmZXJfc2V0LmpzIiwianMvZGF0YS9idWZmZXIvY29sbGlzaW9uX2JveF92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvZmlsbF92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvZ2x5cGhfdmVydGV4X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2ljb25fdmVydGV4X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2xpbmVfZWxlbWVudF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9saW5lX3ZlcnRleF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9vdXRsaW5lX2VsZW1lbnRfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvdHJpYW5nbGVfZWxlbWVudF9idWZmZXIuanMiLCJqcy9kYXRhL2NyZWF0ZV9idWNrZXQuanMiLCJqcy9kYXRhL2VsZW1lbnRfZ3JvdXBzLmpzIiwianMvZGF0YS9mZWF0dXJlX3RyZWUuanMiLCJqcy9kYXRhL2ZpbGxfYnVja2V0LmpzIiwianMvZGF0YS9saW5lX2J1Y2tldC5qcyIsImpzL2RhdGEvc3ltYm9sX2J1Y2tldC5qcyIsImpzL2dlby9jb29yZGluYXRlLmpzIiwianMvZ2VvL2xhdF9sbmcuanMiLCJqcy9nZW8vbGF0X2xuZ19ib3VuZHMuanMiLCJqcy9nZW8vdHJhbnNmb3JtLmpzIiwianMvbGliL2RlYnVndGV4dC5qcyIsImpzL21hcGJveC1nbC5qcyIsImpzL3JlbmRlci9kcmF3X2JhY2tncm91bmQuanMiLCJqcy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcuanMiLCJqcy9yZW5kZXIvZHJhd19kZWJ1Zy5qcyIsImpzL3JlbmRlci9kcmF3X2ZpbGwuanMiLCJqcy9yZW5kZXIvZHJhd19saW5lLmpzIiwianMvcmVuZGVyL2RyYXdfcmFzdGVyLmpzIiwianMvcmVuZGVyL2RyYXdfc3ltYm9sLmpzIiwianMvcmVuZGVyL2RyYXdfdmVydGljZXMuanMiLCJqcy9yZW5kZXIvZnJhbWVfaGlzdG9yeS5qcyIsImpzL3JlbmRlci9nbF91dGlsLmpzIiwianMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCJqcy9yZW5kZXIvcGFpbnRlci5qcyIsImpzL3JlbmRlci9zaGFkZXJzLmpzIiwianMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwianMvc291cmNlL2dlb2pzb25fd3JhcHBlci5qcyIsImpzL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCJqcy9zb3VyY2Uvc291cmNlLmpzIiwianMvc291cmNlL3RpbGUuanMiLCJqcy9zb3VyY2UvdGlsZV9jb29yZC5qcyIsImpzL3NvdXJjZS90aWxlX3B5cmFtaWQuanMiLCJqcy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwianMvc291cmNlL3ZpZGVvX3NvdXJjZS5qcyIsImpzL3NvdXJjZS93b3JrZXIuanMiLCJqcy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCJqcy9zdHlsZS9hbmltYXRpb25fbG9vcC5qcyIsImpzL3N0eWxlL2ltYWdlX3Nwcml0ZS5qcyIsImpzL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzLmpzIiwianMvc3R5bGUvcGFpbnRfcHJvcGVydGllcy5qcyIsImpzL3N0eWxlL3JlZmVyZW5jZS5qcyIsImpzL3N0eWxlL3N0eWxlLmpzIiwianMvc3R5bGUvc3R5bGVfYmF0Y2guanMiLCJqcy9zdHlsZS9zdHlsZV9jb25zdGFudC5qcyIsImpzL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uLmpzIiwianMvc3R5bGUvc3R5bGVfZGVjbGFyYXRpb25fc2V0LmpzIiwianMvc3R5bGUvc3R5bGVfbGF5ZXIuanMiLCJqcy9zdHlsZS9zdHlsZV90cmFuc2l0aW9uLmpzIiwianMvc3ltYm9sL2FuY2hvci5qcyIsImpzL3N5bWJvbC9iaW5fcGFjay5qcyIsImpzL3N5bWJvbC9jaGVja19tYXhfYW5nbGUuanMiLCJqcy9zeW1ib2wvY2xpcF9saW5lLmpzIiwianMvc3ltYm9sL2NvbGxpc2lvbl9ib3guanMiLCJqcy9zeW1ib2wvY29sbGlzaW9uX2ZlYXR1cmUuanMiLCJqcy9zeW1ib2wvY29sbGlzaW9uX3RpbGUuanMiLCJqcy9zeW1ib2wvZ2V0X2FuY2hvcnMuanMiLCJqcy9zeW1ib2wvZ2x5cGhfYXRsYXMuanMiLCJqcy9zeW1ib2wvZ2x5cGhfc291cmNlLmpzIiwianMvc3ltYm9sL21lcmdlbGluZXMuanMiLCJqcy9zeW1ib2wvcXVhZHMuanMiLCJqcy9zeW1ib2wvcmVzb2x2ZV9pY29ucy5qcyIsImpzL3N5bWJvbC9yZXNvbHZlX3RleHQuanMiLCJqcy9zeW1ib2wvc2hhcGluZy5qcyIsImpzL3N5bWJvbC9zcHJpdGVfYXRsYXMuanMiLCJqcy91aS9jYW1lcmEuanMiLCJqcy91aS9jb250cm9sL2F0dHJpYnV0aW9uLmpzIiwianMvdWkvY29udHJvbC9jb250cm9sLmpzIiwianMvdWkvY29udHJvbC9uYXZpZ2F0aW9uLmpzIiwianMvdWkvaGFuZGxlci9ib3hfem9vbS5qcyIsImpzL3VpL2hhbmRsZXIvZGJsY2xpY2tfem9vbS5qcyIsImpzL3VpL2hhbmRsZXIvZHJhZ19wYW4uanMiLCJqcy91aS9oYW5kbGVyL2RyYWdfcm90YXRlLmpzIiwianMvdWkvaGFuZGxlci9rZXlib2FyZC5qcyIsImpzL3VpL2hhbmRsZXIvcGluY2guanMiLCJqcy91aS9oYW5kbGVyL3Njcm9sbF96b29tLmpzIiwianMvdWkvaGFzaC5qcyIsImpzL3VpL2ludGVyYWN0aW9uLmpzIiwianMvdWkvbWFwLmpzIiwianMvdWkvcG9wdXAuanMiLCJqcy91dGlsL2FjdG9yLmpzIiwianMvdXRpbC9icm93c2VyL2FqYXguanMiLCJqcy91dGlsL2Jyb3dzZXIvYnJvd3Nlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9jYW52YXMuanMiLCJqcy91dGlsL2Jyb3dzZXIvZGlzcGF0Y2hlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9kb20uanMiLCJqcy91dGlsL2NvbmZpZy5qcyIsImpzL3V0aWwvZXZlbnRlZC5qcyIsImpzL3V0aWwvZ2x5cGhzLmpzIiwianMvdXRpbC9pbnRlcnBvbGF0ZS5qcyIsImpzL3V0aWwvbWFwYm94LmpzIiwianMvdXRpbC9tcnVfY2FjaGUuanMiLCJqcy91dGlsL3Rva2VuLmpzIiwianMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2ZlYXR1cmUtZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXguanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L21hdDIuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0MmQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0My5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3F1YXQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvdmVjMi5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMzLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3ZlYzQuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3QuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3BhcnNlZC5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL3JlZmVyZW5jZS92Ny5qc29uIiwibm9kZV9tb2R1bGVzL3BiZi9idWZmZXIuanMiLCJub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BiZi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYnVzaC9yYnVzaC5qcyIsIm5vZGVfbW9kdWxlcy9yZXNvbHZlLXVybC9yZXNvbHZlLXVybC5qcyIsIm5vZGVfbW9kdWxlcy91bml0YmV6aWVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwibm9kZV9tb2R1bGVzL3dlYndvcmtpZnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDellBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ROQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ253Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6aUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2dCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDemhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwWUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2cUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdm1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIHNpbmdsZSBhcnJheWJ1ZmZlclxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlcjtcblxuZnVuY3Rpb24gQnVmZmVyKGJ1ZmZlcikge1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5kZWZhdWx0TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmRlZmF1bHRMZW5ndGg7XG4gICAgICAgIHRoaXMuc2V0dXBWaWV3cygpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2Ugb25seSByZWNyZWF0ZSBidWZmZXJzIGFmdGVyIHJlY2VpdmluZyB0aGVtIGZyb20gd29ya2VycyBmb3IgYmluZGluZyB0byBnbCxcbiAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRoZXNlIDIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLmFycmF5ID0gYnVmZmVyLmFycmF5O1xuICAgICAgICB0aGlzLnBvcyA9IGJ1ZmZlci5wb3M7XG4gICAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlID0ge1xuICAgIHBvczogMCxcbiAgICBpdGVtU2l6ZTogNCwgLy8gYnl0ZXMgaW4gb25lIGl0ZW1cbiAgICBkZWZhdWx0TGVuZ3RoOiA4MTkyLCAvLyBpbml0aWFsIGJ1ZmZlciBzaXplXG4gICAgYXJyYXlUeXBlOiAnQVJSQVlfQlVGRkVSJywgLy8gZ2wgYnVmZmVyIHR5cGVcblxuICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zIC8gdGhpcy5pdGVtU2l6ZTtcbiAgICB9LFxuXG4gICAgc2V0dXBWaWV3czogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHNldCB1cCB2aWV3cyBmb3IgZWFjaCB0eXBlIHRvIGFkZCBkYXRhIG9mIGRpZmZlcmVudCB0eXBlcyB0byB0aGUgc2FtZSBidWZmZXJcbiAgICAgICAgdGhpcy51Ynl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IG5ldyBJbnQ4QXJyYXkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMudXNob3J0cyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5zaG9ydHMgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLy8gYmluZHMgdGhlIGJ1ZmZlciB0byBhIHdlYmdsIGNvbnRleHRcbiAgICBiaW5kOiBmdW5jdGlvbihnbCkge1xuICAgICAgICB2YXIgdHlwZSA9IGdsW3RoaXMuYXJyYXlUeXBlXTtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIodHlwZSwgdGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YSh0eXBlLCB0aGlzLmFycmF5LnNsaWNlKDAsIHRoaXMucG9zKSwgZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgICAgICAvLyBkdW1wIGFycmF5IGJ1ZmZlciBvbmNlIGl0J3MgYm91bmQgdG8gZ2xcbiAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcih0eXBlLCB0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oZ2wpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZSBieSA1MCUgaWYgYSBuZXcgaXRlbSBkb2Vzbid0IGZpdFxuICAgIHJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMucG9zICsgdGhpcy5pdGVtU2l6ZSkge1xuXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGggPCB0aGlzLnBvcyArIHRoaXMuaXRlbVNpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgbGVuZ3RoIGJ5IDUwJSBidXQga2VlcCBpdCBldmVuXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLnJvdW5kKHRoaXMubGVuZ3RoICogMS41IC8gMikgKiAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhcnJheSBidWZmZXJzIGNhbid0IGJlIHJlc2l6ZWQsIHNvIHdlIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHJlc2V0IGFsbCBieXRlcyB0aGVyZVxuICAgICAgICAgICAgdGhpcy5hcnJheSA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHZhciB1Ynl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgICAgIHVieXRlcy5zZXQodGhpcy51Ynl0ZXMpO1xuXG4gICAgICAgICAgICB0aGlzLnNldHVwVmlld3MoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBMaW5lVmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9saW5lX3ZlcnRleF9idWZmZXInKTtcbnZhciBMaW5lRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vbGluZV9lbGVtZW50X2J1ZmZlcicpO1xudmFyIEZpbGxWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL2ZpbGxfdmVydGV4X2J1ZmZlcicpO1xudmFyIEZpbGxFbGVtZW50QnVmZmVyID0gcmVxdWlyZSgnLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlcicpO1xudmFyIE91dGxpbmVFbGVtZW50QnVmZmVyID0gcmVxdWlyZSgnLi9vdXRsaW5lX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgR2x5cGhWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL2dseXBoX3ZlcnRleF9idWZmZXInKTtcbnZhciBHbHlwaEVsZW1lbnRCdWZmZXIgPSByZXF1aXJlKCcuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgSWNvblZlcnRleEJ1ZmZlciA9IHJlcXVpcmUoJy4vaWNvbl92ZXJ0ZXhfYnVmZmVyJyk7XG52YXIgSWNvbkVsZW1lbnRCdWZmZXIgPSByZXF1aXJlKCcuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9jb2xsaXNpb25fYm94X3ZlcnRleF9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihidWZmZXJzZXQpIHtcbiAgICBidWZmZXJzZXQgPSBidWZmZXJzZXQgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2x5cGhWZXJ0ZXg6IG5ldyBHbHlwaFZlcnRleEJ1ZmZlcihidWZmZXJzZXQuZ2x5cGhWZXJ0ZXgpLFxuICAgICAgICBnbHlwaEVsZW1lbnQ6IG5ldyBHbHlwaEVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmdseXBoRWxlbWVudCksXG4gICAgICAgIGljb25WZXJ0ZXg6IG5ldyBJY29uVmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5pY29uVmVydGV4KSxcbiAgICAgICAgaWNvbkVsZW1lbnQ6IG5ldyBJY29uRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQuaWNvbkVsZW1lbnQpLFxuICAgICAgICBmaWxsVmVydGV4OiBuZXcgRmlsbFZlcnRleEJ1ZmZlcihidWZmZXJzZXQuZmlsbFZlcnRleCksXG4gICAgICAgIGZpbGxFbGVtZW50OiBuZXcgRmlsbEVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmZpbGxFbGVtZW50KSxcbiAgICAgICAgb3V0bGluZUVsZW1lbnQ6IG5ldyBPdXRsaW5lRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQub3V0bGluZUVsZW1lbnQpLFxuICAgICAgICBsaW5lVmVydGV4OiBuZXcgTGluZVZlcnRleEJ1ZmZlcihidWZmZXJzZXQubGluZVZlcnRleCksXG4gICAgICAgIGxpbmVFbGVtZW50OiBuZXcgTGluZUVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmxpbmVFbGVtZW50KSxcbiAgICAgICAgY29sbGlzaW9uQm94VmVydGV4OiBuZXcgQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5jb2xsaXNpb25Cb3hWZXJ0ZXgpXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXI7XG5cbmZ1bmN0aW9uIENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5Db2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiAxMiwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ICsgMSAqIHNob3J0ICsgMiAqIGJ5dGUgPSA4IGJ5dGVzKVxuICAgIGRlZmF1bHRMZW5ndGg6IDMyNzY4LFxuXG4gICAgLy8gYWRkIGEgdmVydGV4IHRvIHRoaXMgYnVmZmVyO1xuICAgIC8vIHgsIHkgLSB2ZXJ0ZXggcG9zaXRpb25cbiAgICAvLyBleCwgZXkgLSBleHRydWRlIG5vcm1hbFxuICAgIGFkZDogZnVuY3Rpb24ocG9pbnQsIGV4dHJ1ZGUsIG1heFpvb20sIHBsYWNlbWVudFpvb20pIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgcG9zMiA9IHBvcyAvIDIsXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXg7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMF0gPSBwb2ludC54O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSBwb2ludC55O1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAyXSA9IE1hdGgucm91bmQoZXh0cnVkZS54KTtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDNdID0gTWF0aC5yb3VuZChleHRydWRlLnkpO1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA4XSA9IE1hdGguZmxvb3IobWF4Wm9vbSAqIDEwKTtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOV0gPSBNYXRoLmZsb29yKHBsYWNlbWVudFpvb20gKiAxMCk7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsbFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gRmlsbFZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5GaWxsVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBpdGVtU2l6ZTogNCwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ID09IDQgYnl0ZXMpXG5cbiAgICBhZGQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgdmFyIHBvczIgPSB0aGlzLnBvcyAvIDI7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMF0gPSB4O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSB5O1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gR2x5cGhWZXJ0ZXhCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuXG5HbHlwaFZlcnRleEJ1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgZGVmYXVsdExlbmd0aDogMjA0OCAqIDE2LFxuICAgIGl0ZW1TaXplOiAxNixcblxuICAgIGFkZDogZnVuY3Rpb24oeCwgeSwgb3gsIG95LCB0eCwgdHksIG1pbnpvb20sIG1heHpvb20sIGxhYmVsbWluem9vbSkge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICBwb3MyID0gcG9zIC8gMjtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IHg7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAxXSA9IHk7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAyXSA9IE1hdGgucm91bmQob3ggKiA2NCk7IC8vIHVzZSAxLzY0IHBpeGVscyBmb3IgcGxhY2VtZW50XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAzXSA9IE1hdGgucm91bmQob3kgKiA2NCk7XG5cbiAgICAgICAgLy8gYV9kYXRhMVxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA4XSAvKiB0ZXggKi8gPSBNYXRoLmZsb29yKHR4IC8gNCk7XG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDldIC8qIHRleCAqLyA9IE1hdGguZmxvb3IodHkgLyA0KTtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgMTBdIC8qIGxhYmVsbWluem9vbSAqLyA9IE1hdGguZmxvb3IoKGxhYmVsbWluem9vbSkgKiAxMCk7XG5cbiAgICAgICAgLy8gYV9kYXRhMlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMl0gLyogbWluem9vbSAqLyA9IE1hdGguZmxvb3IoKG1pbnpvb20pICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxM10gLyogbWF4em9vbSAqLyA9IE1hdGguZmxvb3IoTWF0aC5taW4obWF4em9vbSwgMjUpICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uKGdsLCBzaGFkZXIsIG9mZnNldCkge1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLCBnbCk7XG5cbiAgICAgICAgdmFyIHN0cmlkZSA9IHRoaXMuaXRlbVNpemU7XG5cbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyAwKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9vZmZzZXQsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA0KTtcblxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGExLCA0LCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA4KTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhMiwgMiwgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIHN0cmlkZSwgb2Zmc2V0ICsgMTIpO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gSWNvblZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gSWNvblZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5JY29uVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBkZWZhdWx0TGVuZ3RoOiAyMDQ4ICogMTYsXG4gICAgaXRlbVNpemU6IDE2LFxuXG4gICAgYWRkOiBmdW5jdGlvbih4LCB5LCBveCwgb3ksIHR4LCB0eSwgbWluem9vbSwgbWF4em9vbSwgbGFiZWxtaW56b29tKSB7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICAgIHBvczIgPSBwb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDBdID0geDtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDFdID0geTtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDJdID0gTWF0aC5yb3VuZChveCAqIDY0KTsgLy8gdXNlIDEvNjQgcGl4ZWxzIGZvciBwbGFjZW1lbnRcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDNdID0gTWF0aC5yb3VuZChveSAqIDY0KTtcblxuICAgICAgICAvLyBhX2RhdGExXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDhdIC8qIHRleCAqLyA9IHR4IC8gNDtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOV0gLyogdGV4ICovID0gdHkgLyA0O1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMF0gLyogbGFiZWxtaW56b29tICovID0gTWF0aC5mbG9vcigobGFiZWxtaW56b29tIHx8IDApICogMTApO1xuXG4gICAgICAgIC8vIGFfZGF0YTJcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgMTJdIC8qIG1pbnpvb20gKi8gPSBNYXRoLmZsb29yKChtaW56b29tIHx8IDApICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxM10gLyogbWF4em9vbSAqLyA9IE1hdGguZmxvb3IoTWF0aC5taW4obWF4em9vbSB8fCAyNSwgMjUpICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uKGdsLCBzaGFkZXIsIG9mZnNldCkge1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLCBnbCk7XG5cbiAgICAgICAgdmFyIHN0cmlkZSA9IHRoaXMuaXRlbVNpemU7XG5cbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyAwKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9vZmZzZXQsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA0KTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhMSwgNCwgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIHN0cmlkZSwgb2Zmc2V0ICsgOCk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfZGF0YTIsIDIsIGdsLlVOU0lHTkVEX0JZVEUsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDEyKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVFbGVtZW50QnVmZmVyO1xuXG5mdW5jdGlvbiBMaW5lRWxlbWVudEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5MaW5lRWxlbWVudEJ1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgaXRlbVNpemU6IDYsIC8vIGJ5dGVzIHBlciB0cmlhbmdsZSAoMyAqIHVuc2lnbmVkIHNob3J0ID09IDYgYnl0ZXMpXG4gICAgYXJyYXlUeXBlOiAnRUxFTUVOVF9BUlJBWV9CVUZGRVInLFxuXG4gICAgYWRkOiBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICAgIHZhciBwb3MyID0gdGhpcy5wb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAwXSA9IGE7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMV0gPSBiO1xuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDJdID0gYztcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGluZVZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gTGluZVZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG4vLyBzY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBzbyB0aGF0IHRoZSBub3JtYWwgbGVuZ3RoIGlzIHRoaXMgdmFsdWUuXG4vLyBjb250YWlucyB0aGUgXCJ0ZXh0dXJlXCIgbm9ybWFscyAoLTEuLjEpLiB0aGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGV4dHJ1ZGVcbi8vIG5vcm1hbHMgZm9yIGxpbmUgam9pbnMsIGJlY2F1c2UgdGhlIHgtdmFsdWUgcmVtYWlucyAwIGZvciB0aGUgdGV4dHVyZVxuLy8gbm9ybWFsIGFycmF5LCB3aGlsZSB0aGUgZXh0cnVkZSBub3JtYWwgYWN0dWFsbHkgbW92ZXMgdGhlIHZlcnRleCB0byBjcmVhdGVcbi8vIHRoZSBhY3V0ZS9iZXZlbGxlZCBsaW5lIGpvaW4uXG5MaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZSA9IDYzO1xuXG5MaW5lVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBpdGVtU2l6ZTogOCwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ICsgMSAqIHNob3J0ICsgMiAqIGJ5dGUgPSA4IGJ5dGVzKVxuICAgIGRlZmF1bHRMZW5ndGg6IDMyNzY4LFxuXG4gICAgLy8gYWRkIGEgdmVydGV4IHRvIHRoaXMgYnVmZmVyO1xuICAgIC8vIHgsIHkgLSB2ZXJ0ZXggcG9zaXRpb25cbiAgICAvLyBleCwgZXkgLSBleHRydWRlIG5vcm1hbFxuICAgIC8vIHR4LCB0eSAtIHRleHR1cmUgbm9ybWFsXG4gICAgYWRkOiBmdW5jdGlvbihwb2ludCwgZXh0cnVkZSwgdHgsIHR5LCBsaW5lc29mYXIpIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgcG9zMiA9IHBvcyAvIDIsXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXgsXG4gICAgICAgICAgICBleHRydWRlU2NhbGUgPSBMaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IChNYXRoLmZsb29yKHBvaW50LngpICogMikgfCB0eDtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDFdID0gKE1hdGguZmxvb3IocG9pbnQueSkgKiAyKSB8IHR5O1xuXG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNF0gPSBNYXRoLnJvdW5kKGV4dHJ1ZGVTY2FsZSAqIGV4dHJ1ZGUueCk7XG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNV0gPSBNYXRoLnJvdW5kKGV4dHJ1ZGVTY2FsZSAqIGV4dHJ1ZGUueSk7XG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNl0gPSAobGluZXNvZmFyIHx8IDApIC8gMTI4O1xuICAgICAgICB0aGlzLmJ5dGVzW3BvcyArIDddID0gKGxpbmVzb2ZhciB8fCAwKSAlIDEyODtcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPdXRsaW5lRWxlbWVudEJ1ZmZlcjtcblxuZnVuY3Rpb24gT3V0bGluZUVsZW1lbnRCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuT3V0bGluZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA0LCAvLyBieXRlcyBwZXIgbGluZSAoMiAqIHVuc2lnbmVkIHNob3J0ID09IDQgYnl0ZXMpXG4gICAgYXJyYXlUeXBlOiAnRUxFTUVOVF9BUlJBWV9CVUZGRVInLFxuXG4gICAgYWRkOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHZhciBwb3MyID0gdGhpcy5wb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAwXSA9IGE7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMV0gPSBiO1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmlhbmdsZUVsZW1lbnRCdWZmZXI7XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlRWxlbWVudEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5UcmlhbmdsZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA2LCAvLyBieXRlcyBwZXIgdHJpYW5nbGUgKDMgKiB1bnNpZ25lZCBzaG9ydCA9PSA2IGJ5dGVzKVxuICAgIGFycmF5VHlwZTogJ0VMRU1FTlRfQVJSQVlfQlVGRkVSJyxcblxuICAgIGFkZDogZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICB2YXIgcG9zMiA9IHRoaXMucG9zIC8gMjtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMF0gPSBhO1xuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDFdID0gYjtcbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAyXSA9IGM7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCdWNrZXQ7XG5cbnZhciBMaW5lQnVja2V0ID0gcmVxdWlyZSgnLi9saW5lX2J1Y2tldCcpO1xudmFyIEZpbGxCdWNrZXQgPSByZXF1aXJlKCcuL2ZpbGxfYnVja2V0Jyk7XG52YXIgU3ltYm9sQnVja2V0ID0gcmVxdWlyZSgnLi9zeW1ib2xfYnVja2V0Jyk7XG52YXIgTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzJyk7XG52YXIgZmVhdHVyZUZpbHRlciA9IHJlcXVpcmUoJ2ZlYXR1cmUtZmlsdGVyJyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvblNldCA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldCcpO1xuXG5mdW5jdGlvbiBjcmVhdGVCdWNrZXQobGF5ZXIsIGJ1ZmZlcnMsIHosIG92ZXJzY2FsaW5nLCBjb2xsaXNpb25EZWJ1Zykge1xuICAgIHZhciB2YWx1ZXMgPSBuZXcgU3R5bGVEZWNsYXJhdGlvblNldCgnbGF5b3V0JywgbGF5ZXIudHlwZSwgbGF5ZXIubGF5b3V0LCB7fSkudmFsdWVzKCksXG4gICAgICAgIGZha2Vab29tSGlzdG9yeSA9IHsgbGFzdEludGVnZXJab29tOiBJbmZpbml0eSwgbGFzdEludGVnZXJab29tVGltZTogMCwgbGFzdFpvb206IDAgfSxcbiAgICAgICAgbGF5b3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrIGluIHZhbHVlcykge1xuICAgICAgICBsYXlvdXRba10gPSB2YWx1ZXNba10uY2FsY3VsYXRlKHosIGZha2Vab29tSGlzdG9yeSk7XG4gICAgfVxuXG4gICAgdmFyIEJ1Y2tldENsYXNzID1cbiAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2xpbmUnID8gTGluZUJ1Y2tldCA6XG4gICAgICAgIGxheWVyLnR5cGUgPT09ICdmaWxsJyA/IEZpbGxCdWNrZXQgOlxuICAgICAgICBsYXllci50eXBlID09PSAnc3ltYm9sJyA/IFN5bWJvbEJ1Y2tldCA6IG51bGw7XG5cbiAgICB2YXIgYnVja2V0ID0gbmV3IEJ1Y2tldENsYXNzKGJ1ZmZlcnMsIG5ldyBMYXlvdXRQcm9wZXJ0aWVzW2xheWVyLnR5cGVdKGxheW91dCksIG92ZXJzY2FsaW5nLCB6LCBjb2xsaXNpb25EZWJ1Zyk7XG5cbiAgICBidWNrZXQuaWQgPSBsYXllci5pZDtcbiAgICBidWNrZXQudHlwZSA9IGxheWVyLnR5cGU7XG4gICAgYnVja2V0Wydzb3VyY2UtbGF5ZXInXSA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICBidWNrZXQuaW50ZXJhY3RpdmUgPSBsYXllci5pbnRlcmFjdGl2ZTtcbiAgICBidWNrZXQubWluWm9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgYnVja2V0Lm1heFpvb20gPSBsYXllci5tYXh6b29tO1xuICAgIGJ1Y2tldC5maWx0ZXIgPSBmZWF0dXJlRmlsdGVyKGxheWVyLmZpbHRlcik7XG4gICAgYnVja2V0LmZlYXR1cmVzID0gW107XG5cbiAgICByZXR1cm4gYnVja2V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnRHcm91cHM7XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cHModmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyLCBzZWNvbmRFbGVtZW50QnVmZmVyKSB7XG5cbiAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjtcbiAgICB0aGlzLmVsZW1lbnRCdWZmZXIgPSBlbGVtZW50QnVmZmVyO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudEJ1ZmZlciA9IHNlY29uZEVsZW1lbnRCdWZmZXI7XG4gICAgdGhpcy5ncm91cHMgPSBbXTtcbn1cblxuRWxlbWVudEdyb3Vwcy5wcm90b3R5cGUubWFrZVJvb21Gb3IgPSBmdW5jdGlvbihudW1WZXJ0aWNlcykge1xuICAgIGlmICghdGhpcy5jdXJyZW50IHx8IHRoaXMuY3VycmVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IDY1NTM1KSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50QnVmZmVyICYmIHRoaXMuZWxlbWVudEJ1ZmZlci5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIgJiYgdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyLmluZGV4KTtcbiAgICAgICAgdGhpcy5ncm91cHMucHVzaCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cCh2ZXJ0ZXhTdGFydEluZGV4LCBlbGVtZW50U3RhcnRJbmRleCwgc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgpIHtcbiAgICAvLyB0aGUgb2Zmc2V0IGludG8gdGhlIHZlcnRleCBidWZmZXIgb2YgdGhlIGZpcnN0IHZlcnRleCBpbiB0aGlzIGdyb3VwXG4gICAgdGhpcy52ZXJ0ZXhTdGFydEluZGV4ID0gdmVydGV4U3RhcnRJbmRleDtcbiAgICB0aGlzLmVsZW1lbnRTdGFydEluZGV4ID0gZWxlbWVudFN0YXJ0SW5kZXg7XG4gICAgdGhpcy5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCA9IHNlY29uZEVsZW1lbnRTdGFydEluZGV4O1xuICAgIHRoaXMuZWxlbWVudExlbmd0aCA9IDA7XG4gICAgdGhpcy52ZXJ0ZXhMZW5ndGggPSAwO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudExlbmd0aCA9IDA7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByYnVzaCA9IHJlcXVpcmUoJ3JidXNoJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xudmFyIHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmVhdHVyZVRyZWU7XG5cbmZ1bmN0aW9uIEZlYXR1cmVUcmVlKGNvb3JkLCBvdmVyc2NhbGluZykge1xuICAgIHRoaXMueCA9IGNvb3JkLng7XG4gICAgdGhpcy55ID0gY29vcmQueTtcbiAgICB0aGlzLnogPSBjb29yZC56IC0gTWF0aC5sb2cob3ZlcnNjYWxpbmcpIC8gTWF0aC5MTjI7XG4gICAgdGhpcy5ydHJlZSA9IHJidXNoKDkpO1xuICAgIHRoaXMudG9CZUluc2VydGVkID0gW107XG59XG5cbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihiYm94LCBsYXllcnMsIGZlYXR1cmUpIHtcbiAgICBiYm94LmxheWVycyA9IGxheWVycztcbiAgICBiYm94LmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgIHRoaXMudG9CZUluc2VydGVkLnB1c2goYmJveCk7XG59O1xuXG4vLyBidWxrIGluc2VydCBpbnRvIHRyZWVcbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucnRyZWUubG9hZCh0aGlzLnRvQmVJbnNlcnRlZCk7XG4gICAgdGhpcy50b0JlSW5zZXJ0ZWQgPSBbXTtcbn07XG5cbi8vIEZpbmRzIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG5GZWF0dXJlVHJlZS5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbihhcmdzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnRvQmVJbnNlcnRlZC5sZW5ndGgpIHRoaXMuX2xvYWQoKTtcblxuICAgIHZhciBwYXJhbXMgPSBhcmdzLnBhcmFtcyB8fCB7fSxcbiAgICAgICAgcmFkaXVzID0gKHBhcmFtcy5yYWRpdXMgfHwgMCkgKiA0MDk2IC8gYXJncy5zY2FsZSxcbiAgICAgICAgeCA9IGFyZ3MueCxcbiAgICAgICAgeSA9IGFyZ3MueSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB2YXIgbWF0Y2hpbmcgPSB0aGlzLnJ0cmVlLnNlYXJjaChbIHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMgXSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IG1hdGNoaW5nW2ldLmZlYXR1cmUsXG4gICAgICAgICAgICBsYXllcnMgPSBtYXRjaGluZ1tpXS5sYXllcnMsXG4gICAgICAgICAgICB0eXBlID0gdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXTtcblxuICAgICAgICBpZiAocGFyYW1zLiR0eXBlICYmIHR5cGUgIT09IHBhcmFtcy4kdHlwZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWdlb21ldHJ5Q29udGFpbnNQb2ludChmZWF0dXJlLmxvYWRHZW9tZXRyeSgpLCB0eXBlLCBuZXcgUG9pbnQoeCwgeSksIHJhZGl1cykpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgZ2VvSlNPTiA9IGZlYXR1cmUudG9HZW9KU09OKHRoaXMueCwgdGhpcy55LCB0aGlzLnopO1xuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxheWVycy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2xdO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVyICYmIGxheWVyICE9PSBwYXJhbXMubGF5ZXIuaWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHV0aWwuZXh0ZW5kKHtsYXllcjogbGF5ZXJ9LCBnZW9KU09OKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufTtcblxuZnVuY3Rpb24gZ2VvbWV0cnlDb250YWluc1BvaW50KHJpbmdzLCB0eXBlLCBwLCByYWRpdXMpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ1BvaW50JyA/IHBvaW50Q29udGFpbnNQb2ludChyaW5ncywgcCwgcmFkaXVzKSA6XG4gICAgICAgICAgIHR5cGUgPT09ICdMaW5lU3RyaW5nJyA/IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDpcbiAgICAgICAgICAgdHlwZSA9PT0gJ1BvbHlnb24nID8gcG9seUNvbnRhaW5zUG9pbnQocmluZ3MsIHApIHx8IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDogZmFsc2U7XG59XG5cbi8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTAxNzI1LzMzMTM3OS5cbmZ1bmN0aW9uIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIHtcbiAgICB2YXIgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIHZhciB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuZnVuY3Rpb24gbGluZUNvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRyZWF0IHRoZSBsaW5lIGFzIFwiY29udGFpbmluZyBwb2ludCBwXCIuXG4gICAgICAgICAgICB2YXIgdiA9IHJpbmdbaiAtIDFdLCB3ID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmIChkaXN0VG9TZWdtZW50U3F1YXJlZChwLCB2LCB3KSA8IHIpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHJpbmdzLCBwKSB7XG4gICAgdmFyIGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2ludENvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChyaW5nW2pdLmRpc3RTcXIocCkgPD0gcikgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsQnVja2V0O1xuXG5mdW5jdGlvbiBGaWxsQnVja2V0KGJ1ZmZlcnMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuZmlsbFZlcnRleCwgYnVmZmVycy5maWxsRWxlbWVudCwgYnVmZmVycy5vdXRsaW5lRWxlbWVudCk7XG59XG5cbkZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLmxvYWRHZW9tZXRyeSgpKTtcbiAgICB9XG59O1xuXG5GaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24obGluZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsbChsaW5lc1tpXSk7XG4gICAgfVxufTtcblxuRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmlsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgaWYgKHZlcnRpY2VzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgLy9jb25zb2xlLndhcm4oJ2EgZmlsbCBtdXN0IGhhdmUgYXQgbGVhc3QgdGhyZWUgdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzIHdlJ3JlIGdvaW5nIHRvIHByb2R1Y2Ugc28gdGhhdCB3ZVxuICAgIC8vIGNhbiByZXNpemUgdGhlIGJ1ZmZlciBiZWZvcmVoYW5kLCBvciBkZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBsaW5lXG4gICAgLy8gd29uJ3QgZml0IGludG8gdGhlIGJ1ZmZlciBhbnltb3JlLlxuICAgIC8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZSB2ZXJ0ZXggYnVmZmVyIGZvciBkcmF3aW5nIHRoZSBhbnRpYWxpYXNlZFxuICAgIC8vIG91dGxpbmVzLCB3ZSBzZXBhcmF0ZSBhbGwgcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgZGVnZW5lcmF0ZSAob3V0LW9mLVxuICAgIC8vIHZpZXdwbGFuZSkgdmVydGV4LlxuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBnZW9tZXRyeSBidWZmZXIgY2FuIGhvbGQgYWxsIHRoZSByZXF1aXJlZCB2ZXJ0aWNlcy5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMubWFrZVJvb21Gb3IobGVuICsgMSk7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuXG4gICAgdmFyIGZpbGxWZXJ0ZXggPSB0aGlzLmJ1ZmZlcnMuZmlsbFZlcnRleDtcbiAgICB2YXIgZmlsbEVsZW1lbnQgPSB0aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQ7XG4gICAgdmFyIG91dGxpbmVFbGVtZW50ID0gdGhpcy5idWZmZXJzLm91dGxpbmVFbGVtZW50O1xuXG4gICAgLy8gV2UncmUgZ2VuZXJhdGluZyB0cmlhbmdsZSBmYW5zLCBzbyB3ZSBhbHdheXMgc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29vcmRpbmF0ZSBpbiB0aGlzIHBvbHlnb24uXG4gICAgdmFyIGZpcnN0SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXgsXG4gICAgICAgIHByZXZJbmRleCwgY3VycmVudEluZGV4LCBjdXJyZW50VmVydGV4O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICBmaWxsVmVydGV4LmFkZChjdXJyZW50VmVydGV4LngsIGN1cnJlbnRWZXJ0ZXgueSk7XG4gICAgICAgIGVsZW1lbnRHcm91cC52ZXJ0ZXhMZW5ndGgrKztcblxuICAgICAgICAvLyBPbmx5IGFkZCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpc3RpbmN0IHZlcnRpY2VzLlxuICAgICAgICBpZiAoaSA+PSAyICYmIChjdXJyZW50VmVydGV4LnggIT09IHZlcnRpY2VzWzBdLnggfHwgY3VycmVudFZlcnRleC55ICE9PSB2ZXJ0aWNlc1swXS55KSkge1xuICAgICAgICAgICAgZmlsbEVsZW1lbnQuYWRkKGZpcnN0SW5kZXgsIHByZXZJbmRleCwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+PSAxKSB7XG4gICAgICAgICAgICBvdXRsaW5lRWxlbWVudC5hZGQocHJldkluZGV4LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwLnNlY29uZEVsZW1lbnRMZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQnVja2V0O1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lQnVja2V0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBMaW5lQnVja2V0KGJ1ZmZlcnMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMubGluZVZlcnRleCwgYnVmZmVycy5saW5lRWxlbWVudCk7XG4gICAgdGhpcy5sYXlvdXRQcm9wZXJ0aWVzID0gbGF5b3V0UHJvcGVydGllcztcbn1cblxuTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUubG9hZEdlb21ldHJ5KCkpO1xuICAgIH1cbn07XG5cbkxpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbihsaW5lcykge1xuICAgIHZhciBsYXlvdXRQcm9wZXJ0aWVzID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGRMaW5lKGxpbmVzW2ldLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1qb2luJ10sXG4gICAgICAgICAgICBsYXlvdXRQcm9wZXJ0aWVzWydsaW5lLWNhcCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1taXRlci1saW1pdCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1yb3VuZC1saW1pdCddKTtcbiAgICB9XG59O1xuXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24odmVydGljZXMsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCkge1xuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmQsIGFkanVzdCBsZW5ndGggdG8gcmVtb3ZlIHRoZW0uXG4gICAgd2hpbGUgKGxlbiA+IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICBsZW4tLTtcbiAgICB9XG5cbiAgICBpZiAodmVydGljZXMubGVuZ3RoIDwgMikge1xuICAgICAgICAvL2NvbnNvbGUud2FybignYSBsaW5lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChqb2luID09PSAnYmV2ZWwnKSBtaXRlckxpbWl0ID0gMS4wNTtcblxuICAgIHZhciBmaXJzdFZlcnRleCA9IHZlcnRpY2VzWzBdLFxuICAgICAgICBsYXN0VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMV0sXG4gICAgICAgIGNsb3NlZCA9IGZpcnN0VmVydGV4LmVxdWFscyhsYXN0VmVydGV4KTtcblxuICAgIC8vIHdlIGNvdWxkIGJlIG1vcmUgcHJlY2lzZSwgYnV0IGl0IHdvdWxkIG9ubHkgc2F2ZSBhIG5lZ2xpZ2libGUgYW1vdW50IG9mIHNwYWNlXG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKGxlbiAqIDEwKTtcblxuICAgIGlmIChsZW4gPT09IDIgJiYgY2xvc2VkKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignYSBsaW5lIG1heSBub3QgaGF2ZSBjb2luY2lkZW50IHBvaW50cycpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJlZ2luQ2FwID0gY2FwLFxuICAgICAgICBlbmRDYXAgPSBjbG9zZWQgPyAnYnV0dCcgOiBjYXAsXG4gICAgICAgIGZsaXAgPSAxLFxuICAgICAgICBkaXN0YW5jZSA9IDAsXG4gICAgICAgIHN0YXJ0T2ZMaW5lID0gdHJ1ZSxcbiAgICAgICAgY3VycmVudFZlcnRleCwgcHJldlZlcnRleCwgbmV4dFZlcnRleCwgcHJldk5vcm1hbCwgbmV4dE5vcm1hbCwgb2Zmc2V0QSwgb2Zmc2V0QjtcblxuICAgIC8vIHRoZSBsYXN0IHRocmVlIHZlcnRpY2VzIGFkZGVkXG4gICAgdGhpcy5lMSA9IHRoaXMuZTIgPSB0aGlzLmUzID0gLTE7XG5cbiAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tsZW4gLSAyXTtcbiAgICAgICAgbmV4dE5vcm1hbCA9IGZpcnN0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgIG5leHRWZXJ0ZXggPSBjbG9zZWQgJiYgaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICB2ZXJ0aWNlc1sxXSA6IC8vIGlmIHRoZSBsaW5lIGlzIGNsb3NlZCwgd2UgdHJlYXQgdGhlIGxhc3QgdmVydGV4IGxpa2UgdGhlIGZpcnN0XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpICsgMV07IC8vIGp1c3QgdGhlIG5leHQgdmVydGV4XG5cbiAgICAgICAgLy8gaWYgdHdvIGNvbnNlY3V0aXZlIHZlcnRpY2VzIGV4aXN0LCBza2lwIHRoZSBjdXJyZW50IG9uZVxuICAgICAgICBpZiAobmV4dFZlcnRleCAmJiB2ZXJ0aWNlc1tpXS5lcXVhbHMobmV4dFZlcnRleCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChuZXh0Tm9ybWFsKSBwcmV2Tm9ybWFsID0gbmV4dE5vcm1hbDtcbiAgICAgICAgaWYgKGN1cnJlbnRWZXJ0ZXgpIHByZXZWZXJ0ZXggPSBjdXJyZW50VmVydGV4O1xuXG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBhbG9uZyB0aGUgbGluZSB0aGUgY3VycmVudFZlcnRleCBpc1xuICAgICAgICBpZiAocHJldlZlcnRleCkgZGlzdGFuY2UgKz0gY3VycmVudFZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbm9ybWFsIHRvd2FyZHMgdGhlIG5leHQgdmVydGV4IGluIHRoaXMgbGluZS4gSW4gY2FzZVxuICAgICAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHZlcnRleCwgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGlzIGNvbnRpbnVpbmcgc3RyYWlnaHQsXG4gICAgICAgIC8vIG1lYW5pbmcgdGhhdCB3ZSBhcmUganVzdCB1c2luZyB0aGUgcHJldmlvdXMgbm9ybWFsLlxuICAgICAgICBuZXh0Tm9ybWFsID0gbmV4dFZlcnRleCA/IG5leHRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKSA6IHByZXZOb3JtYWw7XG5cbiAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIG5vcm1hbCwgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGFcbiAgICAgICAgLy8gbm9uLWNsb3NlZCBsaW5lLCBzbyB3ZSdyZSBkb2luZyBhIHN0cmFpZ2h0IFwiam9pblwiLlxuICAgICAgICBwcmV2Tm9ybWFsID0gcHJldk5vcm1hbCB8fCBuZXh0Tm9ybWFsO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsIG9mIHRoZSBqb2luIGV4dHJ1c2lvbi4gSXQgaXMgdGhlIGFuZ2xlIGJpc2VjdG9yXG4gICAgICAgIC8vIG9mIHRoZSBzZWdtZW50cyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLlxuICAgICAgICB2YXIgam9pbk5vcm1hbCA9IHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLl91bml0KCk7XG5cbiAgICAgICAgLyogIGpvaW5Ob3JtYWwgICAgIHByZXZOb3JtYWxcbiAgICAgICAgICogICAgICAgICAgICAg4oaWICAgICAg4oaRXG4gICAgICAgICAqICAgICAgICAgICAgICAgIC5fX19fX19fXy4gcHJldlZlcnRleFxuICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqIG5leHROb3JtYWwgIOKGkCAgfCAgY3VycmVudFZlcnRleFxuICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqICAgICBuZXh0VmVydGV4ICFcbiAgICAgICAgICpcbiAgICAgICAgICovXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1pdGVyICh0aGUgcmF0aW8gb2YgdGhlIG1pdGVyIHRvIHRoZSB3aWR0aCkuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNvc2luZSBvZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgbmV4dCBhbmQgam9pbiBub3JtYWxzXG4gICAgICAgIC8vIHVzaW5nIGRvdCBwcm9kdWN0LiBUaGUgaW52ZXJzZSBvZiB0aGF0IGlzIHRoZSBtaXRlciBsZW5ndGguXG4gICAgICAgIHZhciBjb3NIYWxmQW5nbGUgPSBqb2luTm9ybWFsLnggKiBuZXh0Tm9ybWFsLnggKyBqb2luTm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnk7XG4gICAgICAgIHZhciBtaXRlckxlbmd0aCA9IDEgLyBjb3NIYWxmQW5nbGU7XG5cbiAgICAgICAgLy8gVGhlIGpvaW4gaWYgYSBtaWRkbGUgdmVydGV4LCBvdGhlcndpc2UgdGhlIGNhcC5cbiAgICAgICAgdmFyIG1pZGRsZVZlcnRleCA9IHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgdmFyIGN1cnJlbnRKb2luID0gbWlkZGxlVmVydGV4ID8gam9pbiA6IG5leHRWZXJ0ZXggPyBiZWdpbkNhcCA6IGVuZENhcDtcblxuICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCByb3VuZExpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnbWl0ZXInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnZmFrZXJvdW5kJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJyAmJiBtaXRlckxlbmd0aCA+IG1pdGVyTGltaXQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2JldmVsJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2JldmVsJykge1xuICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gZXh0cnVkZSBsZW5ndGggaXMgMTI4IC8gNjMgPSAyIHRpbWVzIHRoZSB3aWR0aCBvZiB0aGUgbGluZVxuICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCB3aGVyZS5cbiAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBtaXRlckxlbmd0aCBpcyByZWFsbHkgc21hbGwgYW5kIHRoZSBsaW5lIGJldmVsIHdvdWxkbid0IGJlIHZpc2libGUsXG4gICAgICAgICAgICAvLyBqdXN0IGRyYXcgYSBtaXRlciBqb2luIHRvIHNhdmUgYSB0cmlhbmdsZS5cbiAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJykge1xuICAgICAgICAgICAgam9pbk5vcm1hbC5fbXVsdChtaXRlckxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIDAsIDAsIGZhbHNlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnZmxpcGJldmVsJykge1xuICAgICAgICAgICAgLy8gbWl0ZXIgaXMgdG9vIGJpZywgZmxpcCB0aGUgZGlyZWN0aW9uIHRvIG1ha2UgYSBiZXZlbGVkIGpvaW5cblxuICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IHBhcmFsbGVsIGxpbmVzXG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbCA9IG5leHROb3JtYWwuY2xvbmUoKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54ID4gMCA/IC0xIDogMTtcbiAgICAgICAgICAgICAgICB2YXIgYmV2ZWxMZW5ndGggPSBtaXRlckxlbmd0aCAqIHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLm1hZygpIC8gcHJldk5vcm1hbC5zdWIobmV4dE5vcm1hbCkubWFnKCk7XG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fcGVycCgpLl9tdWx0KGJldmVsTGVuZ3RoICogZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgam9pbk5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgZmxpcCA9IC1mbGlwO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcgfHwgY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICB2YXIgbGluZVR1cm5zTGVmdCA9IGZsaXAgKiAocHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54KSA+IDA7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gLU1hdGguc3FydChtaXRlckxlbmd0aCAqIG1pdGVyTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICAgICAgICAgIG9mZnNldEIgPSAwO1xuICAgICAgICAgICAgICAgIG9mZnNldEEgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldEEgPSAwO1xuICAgICAgICAgICAgICAgIG9mZnNldEIgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIGJldmVsXG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2Zha2Vyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgam9pbiBhbmdsZSBpcyBzaGFycCBlbm91Z2ggdGhhdCBhIHJvdW5kIGpvaW4gd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSByb3VuZCBqb2luIGJ5IGFkZGluZyBtdWx0aXBsZSBwaWUgc2xpY2VzLiBUaGUgam9pbiBpc24ndCBhY3R1YWxseSByb3VuZCwgYnV0XG4gICAgICAgICAgICAgICAgLy8gaXQgbG9va3MgbGlrZSBpdCBpcyBhdCB0aGUgc2l6ZXMgd2UgcmVuZGVyIGxpbmVzIGF0LlxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIG1vcmUgdHJpYW5nbGVzIGZvciBzaGFycGVyIGFuZ2xlcy5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1hdGggaXMganVzdCBhIGdvb2QgZW5vdWdoIGFwcHJveGltYXRpb24uIEl0IGlzbid0IFwiY29ycmVjdFwiLlxuICAgICAgICAgICAgICAgIHZhciBuID0gTWF0aC5mbG9vcigoMC41IC0gKGNvc0hhbGZBbmdsZSAtIDAuNSkpICogOCk7XG4gICAgICAgICAgICAgICAgdmFyIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBuOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLm11bHQoKG0gKyAxKSAvIChuICsgMSkpLl9hZGQocHJldk5vcm1hbCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQaWVTbGljZVZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQpO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IG4gLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgICAgICAgICBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCA9IHByZXZOb3JtYWwubXVsdCgoayArIDEpIC8gKG4gKyAxKSkuX2FkZChuZXh0Tm9ybWFsKS5fdW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCwgbGluZVR1cm5zTGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtb2Zmc2V0QSwgLW9mZnNldEIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYnV0dCcpIHtcbiAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnc3F1YXJlJykge1xuXG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgc3F1YXJlIGNhcFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgaXMgZG9uZS4gVW5zZXQgdmVydGljZXMgdG8gZGlzY29ubmVjdCBzZWdtZW50cy5cbiAgICAgICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuICAgICAgICAgICAgICAgIGZsaXAgPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtMSwgLTEsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG5cbiAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYnV0dFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBvciBsaW5lam9pbiBhdCBlbmQgb2Ygc2VnbWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgc2VnbWVudCBpcyBkb25lLiBVbnNldCB2ZXJ0aWNlcyB0byBkaXNjb25uZWN0IHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyID0gLTE7XG4gICAgICAgICAgICAgICAgZmxpcCA9IDE7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgYmVmb3JlIGZpcnN0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIC0xLCAtMSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZMaW5lID0gZmFsc2U7XG4gICAgfVxuXG5cbn07XG5cbi8qKlxuICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFZlcnRleCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmbGlwIC0xIGlmIHRoZSB2ZXJ0aWNlcyBzaG91bGQgYmUgZmxpcHBlZCwgMSBvdGhlcndpc2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnZ2luaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRMZWZ0IGV4dHJ1ZGUgdG8gc2hpZnQgdGhlIGxlZnQgdmVydGV4IGFsb25nIHRoZSBsaW5lXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kUmlnaHQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRDdXJyZW50VmVydGV4ID0gZnVuY3Rpb24oY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5vcm1hbCwgZW5kTGVmdCwgZW5kUmlnaHQsIHJvdW5kKSB7XG4gICAgdmFyIHR4ID0gcm91bmQgPyAxIDogMDtcbiAgICB2YXIgZXh0cnVkZTtcblxuICAgIHZhciBsaW5lVmVydGV4ID0gdGhpcy5idWZmZXJzLmxpbmVWZXJ0ZXg7XG4gICAgdmFyIGxpbmVFbGVtZW50ID0gdGhpcy5idWZmZXJzLmxpbmVFbGVtZW50O1xuICAgIHZhciBlbGVtZW50R3JvdXAgPSB0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudDtcbiAgICB2YXIgdmVydGV4U3RhcnRJbmRleCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LnZlcnRleFN0YXJ0SW5kZXg7XG5cbiAgICBleHRydWRlID0gbm9ybWFsLm11bHQoZmxpcCk7XG4gICAgaWYgKGVuZExlZnQpIGV4dHJ1ZGUuX3N1Yihub3JtYWwucGVycCgpLl9tdWx0KGVuZExlZnQpKTtcbiAgICB0aGlzLmUzID0gbGluZVZlcnRleC5hZGQoY3VycmVudFZlcnRleCwgZXh0cnVkZSwgdHgsIDAsIGRpc3RhbmNlKSAtIHZlcnRleFN0YXJ0SW5kZXg7XG4gICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgbGluZUVsZW1lbnQuYWRkKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICBlbGVtZW50R3JvdXAuZWxlbWVudExlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmUxID0gdGhpcy5lMjtcbiAgICB0aGlzLmUyID0gdGhpcy5lMztcblxuICAgIGV4dHJ1ZGUgPSBub3JtYWwubXVsdCgtZmxpcCk7XG4gICAgaWYgKGVuZFJpZ2h0KSBleHRydWRlLl9zdWIobm9ybWFsLnBlcnAoKS5fbXVsdChlbmRSaWdodCkpO1xuICAgIHRoaXMuZTMgPSBsaW5lVmVydGV4LmFkZChjdXJyZW50VmVydGV4LCBleHRydWRlLCB0eCwgMSwgZGlzdGFuY2UpIC0gdmVydGV4U3RhcnRJbmRleDtcbiAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICBsaW5lRWxlbWVudC5hZGQodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgfVxuICAgIHRoaXMuZTEgPSB0aGlzLmUyO1xuICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuXG4gICAgZWxlbWVudEdyb3VwLnZlcnRleExlbmd0aCArPSAyO1xufTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbmV3IHZlcnRleCBhbmQgYSB0cmlhbmdsZSB1c2luZyB0d28gcHJldmlvdXMgdmVydGljZXMuXG4gKiBUaGlzIGFkZHMgYSBwaWUgc2xpY2UgdHJpYW5nbGUgbmVhciBhIGpvaW4gdG8gc2ltdWxhdGUgcm91bmQgam9pbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFZlcnRleCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmbGlwIC0xIGlmIHRoZSB2ZXJ0aWNlcyBzaG91bGQgYmUgZmxpcHBlZCwgMSBvdGhlcndpc2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnZ2luaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBleHRydWRlIHRoZSBvZmZzZXQgb2YgdGhlIG5ldyB2ZXJ0ZXggZnJvbSB0aGUgY3VycmVudFZlcnRleFxuICogQHBhcmFtIHtib29sZWFufSB3aGV0aGVyIHRoZSBsaW5lIGlzIHR1cm5pbmcgbGVmdCBvciByaWdodCBhdCB0aGlzIGFuZ2xlXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRQaWVTbGljZVZlcnRleCA9IGZ1bmN0aW9uKGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBleHRydWRlLCBsaW5lVHVybnNMZWZ0KSB7XG4gICAgdmFyIGxpbmVWZXJ0ZXggPSB0aGlzLmJ1ZmZlcnMubGluZVZlcnRleDtcbiAgICB2YXIgbGluZUVsZW1lbnQgPSB0aGlzLmJ1ZmZlcnMubGluZUVsZW1lbnQ7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuICAgIHZhciB2ZXJ0ZXhTdGFydEluZGV4ID0gdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleDtcblxuICAgIHZhciB0eSA9IGxpbmVUdXJuc0xlZnQ7XG4gICAgZXh0cnVkZSA9IGV4dHJ1ZGUubXVsdChmbGlwICogKGxpbmVUdXJuc0xlZnQgPyAtMSA6IDEpKTtcblxuICAgIHRoaXMuZTMgPSBsaW5lVmVydGV4LmFkZChjdXJyZW50VmVydGV4LCBleHRydWRlLCAwLCB0eSwgZGlzdGFuY2UpIC0gdmVydGV4U3RhcnRJbmRleDtcbiAgICBlbGVtZW50R3JvdXAudmVydGV4TGVuZ3RoICs9IDE7XG5cbiAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICBsaW5lRWxlbWVudC5hZGQodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgfVxuXG5cbiAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICB0aGlzLmUyID0gdGhpcy5lMztcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMztcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcbnZhciBBbmNob3IgPSByZXF1aXJlKCcuLi9zeW1ib2wvYW5jaG9yJyk7XG52YXIgZ2V0QW5jaG9ycyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nZXRfYW5jaG9ycycpO1xudmFyIHJlc29sdmVUb2tlbnMgPSByZXF1aXJlKCcuLi91dGlsL3Rva2VuJyk7XG52YXIgUXVhZHMgPSByZXF1aXJlKCcuLi9zeW1ib2wvcXVhZHMnKTtcbnZhciBTaGFwaW5nID0gcmVxdWlyZSgnLi4vc3ltYm9sL3NoYXBpbmcnKTtcbnZhciByZXNvbHZlVGV4dCA9IHJlcXVpcmUoJy4uL3N5bWJvbC9yZXNvbHZlX3RleHQnKTtcbnZhciByZXNvbHZlSWNvbnMgPSByZXF1aXJlKCcuLi9zeW1ib2wvcmVzb2x2ZV9pY29ucycpO1xudmFyIG1lcmdlTGluZXMgPSByZXF1aXJlKCcuLi9zeW1ib2wvbWVyZ2VsaW5lcycpO1xudmFyIHNoYXBlVGV4dCA9IFNoYXBpbmcuc2hhcGVUZXh0O1xudmFyIHNoYXBlSWNvbiA9IFNoYXBpbmcuc2hhcGVJY29uO1xudmFyIGdldEdseXBoUXVhZHMgPSBRdWFkcy5nZXRHbHlwaFF1YWRzO1xudmFyIGdldEljb25RdWFkcyA9IFF1YWRzLmdldEljb25RdWFkcztcbnZhciBjbGlwTGluZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9jbGlwX2xpbmUnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbnZhciBDb2xsaXNpb25GZWF0dXJlID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sQnVja2V0O1xuXG5mdW5jdGlvbiBTeW1ib2xCdWNrZXQoYnVmZmVycywgbGF5b3V0UHJvcGVydGllcywgb3ZlcnNjYWxpbmcsIHpvb20sIGNvbGxpc2lvbkRlYnVnKSB7XG4gICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcbiAgICB0aGlzLmxheW91dFByb3BlcnRpZXMgPSBsYXlvdXRQcm9wZXJ0aWVzO1xuICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvdmVyc2NhbGluZztcbiAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgIHRoaXMuY29sbGlzaW9uRGVidWcgPSBjb2xsaXNpb25EZWJ1ZztcbiAgICB2YXIgdGlsZVNpemUgPSA1MTIgKiBvdmVyc2NhbGluZztcbiAgICB2YXIgdGlsZUV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy50aWxlUGl4ZWxSYXRpbyA9IHRpbGVFeHRlbnQgLyB0aWxlU2l6ZTtcbiAgICB0aGlzLmNvbXBhcmVUZXh0ID0ge307XG4gICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMgPSBbXTtcblxufVxuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLm5lZWRzUGxhY2VtZW50ID0gdHJ1ZTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uKGNvbGxpc2lvblRpbGUpIHtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXM7XG4gICAgdmFyIHRleHRGZWF0dXJlcyA9IHRoaXMudGV4dEZlYXR1cmVzO1xuXG4gICAgdmFyIGhvcml6b250YWxBbGlnbiA9IDAuNSxcbiAgICAgICAgdmVydGljYWxBbGlnbiA9IDAuNTtcblxuICAgIHN3aXRjaCAobGF5b3V0Wyd0ZXh0LWFuY2hvciddKSB7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbiA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN3aXRjaCAobGF5b3V0Wyd0ZXh0LWFuY2hvciddKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGp1c3RpZnkgPSBsYXlvdXRbJ3RleHQtanVzdGlmeSddID09PSAncmlnaHQnID8gMSA6XG4gICAgICAgIGxheW91dFsndGV4dC1qdXN0aWZ5J10gPT09ICdsZWZ0JyA/IDAgOlxuICAgICAgICAwLjU7XG5cbiAgICB2YXIgb25lRW0gPSAyNDtcbiAgICB2YXIgbGluZUhlaWdodCA9IGxheW91dFsndGV4dC1saW5lLWhlaWdodCddICogb25lRW07XG4gICAgdmFyIG1heFdpZHRoID0gbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gIT09ICdsaW5lJyA/IGxheW91dFsndGV4dC1tYXgtd2lkdGgnXSAqIG9uZUVtIDogMDtcbiAgICB2YXIgc3BhY2luZyA9IGxheW91dFsndGV4dC1sZXR0ZXItc3BhY2luZyddICogb25lRW07XG4gICAgdmFyIHRleHRPZmZzZXQgPSBbbGF5b3V0Wyd0ZXh0LW9mZnNldCddWzBdICogb25lRW0sIGxheW91dFsndGV4dC1vZmZzZXQnXVsxXSAqIG9uZUVtXTtcbiAgICB2YXIgZm9udHN0YWNrID0gbGF5b3V0Wyd0ZXh0LWZvbnQnXTtcblxuICAgIHZhciBnZW9tZXRyaWVzID0gW107XG4gICAgZm9yICh2YXIgZyA9IDA7IGcgPCBmZWF0dXJlcy5sZW5ndGg7IGcrKykge1xuICAgICAgICBnZW9tZXRyaWVzLnB1c2goZmVhdHVyZXNbZ10ubG9hZEdlb21ldHJ5KCkpO1xuICAgIH1cblxuICAgIGlmIChsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIC8vIE1lcmdlIGFkamFjZW50IGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCB0byBpbXByb3ZlIGxhYmVsbGluZy5cbiAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gcGxhY2UgbGFiZWxzIG9uIG9uZSBsb25nIGxpbmUgdGhhbiBvbiBtYW55IHNob3J0IHNlZ21lbnRzLlxuICAgICAgICB2YXIgbWVyZ2VkID0gbWVyZ2VMaW5lcyhmZWF0dXJlcywgdGV4dEZlYXR1cmVzLCBnZW9tZXRyaWVzKTtcblxuICAgICAgICBnZW9tZXRyaWVzID0gbWVyZ2VkLmdlb21ldHJpZXM7XG4gICAgICAgIGZlYXR1cmVzID0gbWVyZ2VkLmZlYXR1cmVzO1xuICAgICAgICB0ZXh0RmVhdHVyZXMgPSBtZXJnZWQudGV4dEZlYXR1cmVzO1xuICAgIH1cblxuICAgIHZhciBzaGFwZWRUZXh0LCBzaGFwZWRJY29uO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICBpZiAoIWdlb21ldHJpZXNba10pIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmICh0ZXh0RmVhdHVyZXNba10pIHtcbiAgICAgICAgICAgIHNoYXBlZFRleHQgPSBzaGFwZVRleHQodGV4dEZlYXR1cmVzW2tdLCB0aGlzLnN0YWNrc1tmb250c3RhY2tdLCBtYXhXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCBzcGFjaW5nLCB0ZXh0T2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlZFRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dFsnaWNvbi1pbWFnZSddKSB7XG4gICAgICAgICAgICB2YXIgaWNvbk5hbWUgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2tdLnByb3BlcnRpZXMsIGxheW91dFsnaWNvbi1pbWFnZSddKTtcbiAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaWNvbnNbaWNvbk5hbWVdO1xuICAgICAgICAgICAgc2hhcGVkSWNvbiA9IHNoYXBlSWNvbihpbWFnZSwgbGF5b3V0KTtcblxuICAgICAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2RmSWNvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNkZkljb25zID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZGZJY29ucyAhPT0gaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1Y2tldCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlZEljb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoYXBlZFRleHQgfHwgc2hhcGVkSWNvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGdlb21ldHJpZXNba10sIHNoYXBlZFRleHQsIHNoYXBlZEljb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wbGFjZUZlYXR1cmVzKGNvbGxpc2lvblRpbGUsIHRoaXMuYnVmZmVycywgdGhpcy5jb2xsaXNpb25EZWJ1Zyk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbihsaW5lcywgc2hhcGVkVGV4dCwgc2hhcGVkSWNvbikge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLmxheW91dFByb3BlcnRpZXM7XG5cbiAgICB2YXIgZ2x5cGhTaXplID0gMjQ7XG5cbiAgICB2YXIgZm9udFNjYWxlID0gbGF5b3V0Wyd0ZXh0LW1heC1zaXplJ10gLyBnbHlwaFNpemUsXG4gICAgICAgIHRleHRCb3hTY2FsZSA9IHRoaXMudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgIGljb25Cb3hTY2FsZSA9IHRoaXMudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRbJ2ljb24tbWF4LXNpemUnXSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSB0aGlzLnRpbGVQaXhlbFJhdGlvICogbGF5b3V0WydzeW1ib2wtbWluLWRpc3RhbmNlJ10sXG4gICAgICAgIGF2b2lkRWRnZXMgPSBsYXlvdXRbJ3N5bWJvbC1hdm9pZC1lZGdlcyddLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dFsndGV4dC1wYWRkaW5nJ10gKiB0aGlzLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dFsnaWNvbi1wYWRkaW5nJ10gKiB0aGlzLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXRbJ3RleHQtbWF4LWFuZ2xlJ10gLyAxODAgKiBNYXRoLlBJLFxuICAgICAgICB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBpY29uQWxvbmdMaW5lID0gbGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBtYXlPdmVybGFwID0gbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgICAgICBsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddIHx8IGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10sXG4gICAgICAgIGlzTGluZSA9IGxheW91dFsnc3ltYm9sLXBsYWNlbWVudCddID09PSAnbGluZScsXG4gICAgICAgIHRleHRSZXBlYXREaXN0YW5jZSA9IHN5bWJvbE1pbkRpc3RhbmNlIC8gMjtcblxuICAgIGlmIChpc0xpbmUpIHtcbiAgICAgICAgbGluZXMgPSBjbGlwTGluZShsaW5lcywgMCwgMCwgNDA5NiwgNDA5Nik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYW5jaG9yIHBvaW50cyBhcm91bmQgd2hpY2ggeW91IHdhbnQgdG8gcGxhY2UgbGFiZWxzXG4gICAgICAgIHZhciBhbmNob3JzID0gaXNMaW5lID9cbiAgICAgICAgICAgIGdldEFuY2hvcnMobGluZSwgc3ltYm9sTWluRGlzdGFuY2UsIHRleHRNYXhBbmdsZSwgc2hhcGVkVGV4dCwgc2hhcGVkSWNvbiwgZ2x5cGhTaXplLCB0ZXh0Qm94U2NhbGUsIHRoaXMub3ZlcnNjYWxpbmcpIDpcbiAgICAgICAgICAgIFsgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkgXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb3RlbnRpYWwgbGFiZWwsIGNyZWF0ZSB0aGUgcGxhY2VtZW50IGZlYXR1cmVzIHVzZWQgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMsIGFuZCB0aGUgcXVhZHMgdXNlIGZvciByZW5kZXJpbmcuXG4gICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSBhbmNob3JzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICB2YXIgYW5jaG9yID0gYW5jaG9yc1tqXTtcblxuICAgICAgICAgICAgaWYgKHNoYXBlZFRleHQgJiYgaXNMaW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYW5jaG9ySXNUb29DbG9zZShzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpbnNpZGUgPSAhKGFuY2hvci54IDwgMCB8fCBhbmNob3IueCA+IDQwOTYgfHwgYW5jaG9yLnkgPCAwIHx8IGFuY2hvci55ID4gNDA5Nik7XG5cbiAgICAgICAgICAgIGlmIChhdm9pZEVkZ2VzICYmICFpbnNpZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBzeW1ib2wgbGF5ZXJzIGFyZSBkcmF3biBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzLiBPbmx5IHN5bWJvbHNcbiAgICAgICAgICAgIC8vIHdpdGggdGhlaXIgYW5jaG9ycyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllcyBhcmUgYWRkZWQgdG8gdGhlIGJ1ZmZlcnNcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIGJlaW5nIGRyYXduIHR3aWNlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN5bWJvbHMgaW4gbGF5ZXJzIHdpdGggb3ZlcmxhcCBhcmUgc29ydGVkIGluIHRoZSB5IGRpcmVjdGlvbiBzbyB0aGF0XG4gICAgICAgICAgICAvLyBzeW1ib2xzIGxvd2VyIG9uIHRoZSBjYW52YXMgYXJlIGRyYXduIG9uIHRvcCBvZiBzeW1ib2xzIG5lYXIgdGhlIHRvcC5cbiAgICAgICAgICAgIC8vIFRvIHByZXNlcnZlIHRoaXMgb3JkZXIgYWNyb3NzIHRpbGUgYm91bmRhcmllcyB0aGVzZSBzeW1ib2xzIGNhbid0XG4gICAgICAgICAgICAvLyBiZSBkcmF3biBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzLiBJbnN0ZWFkIHRoZXkgbmVlZCB0byBiZSBpbmNsdWRlZCBpblxuICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlcnMgZm9yIGJvdGggdGlsZXMgYW5kIGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzIGF0IGRyYXcgdGltZS5cbiAgICAgICAgICAgIHZhciBhZGRUb0J1ZmZlcnMgPSBpbnNpZGUgfHwgbWF5T3ZlcmxhcDtcblxuICAgICAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMucHVzaChuZXcgU3ltYm9sSW5zdGFuY2UoYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBsYXlvdXQsIGFkZFRvQnVmZmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lKSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBDaGVjayBpZiBhbnkgb3RoZXIgYW5jaG9ycyB3aXRoIHRoZSBzYW1lIHRleHQgYXJlIGNsb3NlciB0aGFuIHJlcGVhdERpc3RhbmNlXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFuY2hvcklzVG9vQ2xvc2UgPSBmdW5jdGlvbih0ZXh0LCByZXBlYXREaXN0YW5jZSwgYW5jaG9yKSB7XG4gICAgdmFyIGNvbXBhcmVUZXh0ID0gdGhpcy5jb21wYXJlVGV4dDtcbiAgICBpZiAoISh0ZXh0IGluIGNvbXBhcmVUZXh0KSkge1xuICAgICAgICBjb21wYXJlVGV4dFt0ZXh0XSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdGhlckFuY2hvcnMgPSBjb21wYXJlVGV4dFt0ZXh0XTtcbiAgICAgICAgZm9yICh2YXIgayA9IG90aGVyQW5jaG9ycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgaWYgKGFuY2hvci5kaXN0KG90aGVyQW5jaG9yc1trXSkgPCByZXBlYXREaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIG9uZSBhbmNob3IsIHN0b3AgbG9va2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIGFuY2hvciBpcyBub3Qgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIGFueSBvdGhlciBhbmNob3IsIGFkZCB0byBhcnJheVxuICAgIGNvbXBhcmVUZXh0W3RleHRdLnB1c2goYW5jaG9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLnBsYWNlRmVhdHVyZXMgPSBmdW5jdGlvbihjb2xsaXNpb25UaWxlLCBidWZmZXJzLCBjb2xsaXNpb25EZWJ1Zykge1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdoaWNoIGxhYmVscyBjYW4gYmUgc2hvd24gYW5kIHdoZW4gdGhleSBjYW4gYmUgc2hvd24gYW5kXG4gICAgLy8gY3JlYXRlIHRoZSBidWZlcnMgdXNlZCBmb3IgcmVuZGVyaW5nLlxuXG4gICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcblxuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGhpcy5lbGVtZW50R3JvdXBzID0ge1xuICAgICAgICB0ZXh0OiBuZXcgRWxlbWVudEdyb3VwcyhidWZmZXJzLmdseXBoVmVydGV4LCBidWZmZXJzLmdseXBoRWxlbWVudCksXG4gICAgICAgIGljb246IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuaWNvblZlcnRleCwgYnVmZmVycy5pY29uRWxlbWVudCksXG4gICAgICAgIHNkZkljb25zOiB0aGlzLnNkZkljb25zXG4gICAgfTtcblxuICAgIHZhciBsYXlvdXQgPSB0aGlzLmxheW91dFByb3BlcnRpZXM7XG4gICAgdmFyIG1heFNjYWxlID0gY29sbGlzaW9uVGlsZS5tYXhTY2FsZTtcblxuICAgIHZhciB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnO1xuICAgIHZhciBpY29uQWxvbmdMaW5lID0gbGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnO1xuXG4gICAgdmFyIG1heU92ZXJsYXAgPSBsYXlvdXRbJ3RleHQtYWxsb3ctb3ZlcmxhcCddIHx8IGxheW91dFsnaWNvbi1hbGxvdy1vdmVybGFwJ10gfHxcbiAgICAgICAgbGF5b3V0Wyd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnXSB8fCBsYXlvdXRbJ2ljb24taWdub3JlLXBsYWNlbWVudCddO1xuXG4gICAgLy8gU29ydCBzeW1ib2xzIGJ5IHRoZWlyIHkgcG9zaXRpb24gb24gdGhlIGNhbnZhcyBzbyB0aGF0IHRoZXkgbG93ZXIgc3ltYm9sc1xuICAgIC8vIGFyZSBkcmF3biBvbiB0b3Agb2YgaGlnaGVyIHN5bWJvbHMuXG4gICAgLy8gRG9uJ3Qgc29ydCBzeW1ib2xzIHRoYXQgd29uJ3Qgb3ZlcmxhcCBiZWNhdXNlIGl0IGlzbid0IG5lY2Vzc2FyeSBhbmRcbiAgICAvLyBiZWNhdXNlIGl0IGNhdXNlcyBtb3JlIGxhYmVscyB0byBwb3AgaW4gYW5kIG91dCB3aGVuIHJvdGF0aW5nLlxuICAgIGlmIChtYXlPdmVybGFwKSB7XG4gICAgICAgIHZhciBhbmdsZSA9IGNvbGxpc2lvblRpbGUuYW5nbGU7XG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cbiAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICB2YXIgYVJvdGF0ZWQgPSBzaW4gKiBhLnggKyBjb3MgKiBhLnk7XG4gICAgICAgICAgICB2YXIgYlJvdGF0ZWQgPSBzaW4gKiBiLnggKyBjb3MgKiBiLnk7XG4gICAgICAgICAgICByZXR1cm4gYlJvdGF0ZWQgLSBhUm90YXRlZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCA9IDA7IHAgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHArKykge1xuICAgICAgICB2YXIgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlc1twXTtcbiAgICAgICAgdmFyIGhhc1RleHQgPSBzeW1ib2xJbnN0YW5jZS5oYXNUZXh0O1xuICAgICAgICB2YXIgaGFzSWNvbiA9IHN5bWJvbEluc3RhbmNlLmhhc0ljb247XG5cbiAgICAgICAgdmFyIGljb25XaXRob3V0VGV4dCA9IGxheW91dFsndGV4dC1vcHRpb25hbCddIHx8ICFoYXNUZXh0LFxuICAgICAgICAgICAgdGV4dFdpdGhvdXRJY29uID0gbGF5b3V0WydpY29uLW9wdGlvbmFsJ10gfHwgIWhhc0ljb247XG5cblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlcyBhdCB3aGljaCB0aGUgdGV4dCBhbmQgaWNvbiBjYW4gYmUgcGxhY2VkIHdpdGhvdXQgY29sbGlzaW9uLlxuXG4gICAgICAgIHZhciBnbHlwaFNjYWxlID0gaGFzVGV4dCAmJiAhbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSA/XG4gICAgICAgICAgICBjb2xsaXNpb25UaWxlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShzeW1ib2xJbnN0YW5jZS50ZXh0Q29sbGlzaW9uRmVhdHVyZSkgOlxuICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5taW5TY2FsZTtcblxuICAgICAgICB2YXIgaWNvblNjYWxlID0gaGFzSWNvbiAmJiAhbGF5b3V0WydpY29uLWFsbG93LW92ZXJsYXAnXSA/XG4gICAgICAgICAgICBjb2xsaXNpb25UaWxlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShzeW1ib2xJbnN0YW5jZS5pY29uQ29sbGlzaW9uRmVhdHVyZSkgOlxuICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5taW5TY2FsZTtcblxuXG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHNjYWxlcyBmb3IgaWNvbnMgYW5kIHRleHQuXG5cbiAgICAgICAgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgaWNvblNjYWxlID0gZ2x5cGhTY2FsZSA9IE1hdGgubWF4KGljb25TY2FsZSwgZ2x5cGhTY2FsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRleHRXaXRob3V0SWNvbiAmJiBnbHlwaFNjYWxlKSB7XG4gICAgICAgICAgICBnbHlwaFNjYWxlID0gTWF0aC5tYXgoaWNvblNjYWxlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaWNvbldpdGhvdXRUZXh0ICYmIGljb25TY2FsZSkge1xuICAgICAgICAgICAgaWNvblNjYWxlID0gTWF0aC5tYXgoaWNvblNjYWxlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gSW5zZXJ0IGZpbmFsIHBsYWNlbWVudCBpbnRvIGNvbGxpc2lvbiB0cmVlIGFuZCBhZGQgZ2x5cGhzL2ljb25zIHRvIGJ1ZmZlcnNcblxuICAgICAgICBpZiAoaGFzVGV4dCkge1xuICAgICAgICAgICAgaWYgKCFsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHN5bWJvbEluc3RhbmNlLnRleHRDb2xsaXNpb25GZWF0dXJlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnbHlwaFNjYWxlIDw9IG1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xzKGJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsIGJ1ZmZlcnMuZ2x5cGhFbGVtZW50LCBlbGVtZW50R3JvdXBzLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5nbHlwaFF1YWRzLCBnbHlwaFNjYWxlLCBsYXlvdXRbJ3RleHQta2VlcC11cHJpZ2h0J10sIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLmFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICBpZiAoIWxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10pIHtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLmluc2VydENvbGxpc2lvbkZlYXR1cmUoc3ltYm9sSW5zdGFuY2UuaWNvbkNvbGxpc2lvbkZlYXR1cmUsIGljb25TY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWNvblNjYWxlIDw9IG1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xzKGJ1ZmZlcnMuaWNvblZlcnRleCwgYnVmZmVycy5pY29uRWxlbWVudCwgZWxlbWVudEdyb3Vwcy5pY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvblF1YWRzLCBpY29uU2NhbGUsIGxheW91dFsnaWNvbi1rZWVwLXVwcmlnaHQnXSwgaWNvbkFsb25nTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvblRpbGUuYW5nbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAoY29sbGlzaW9uRGVidWcpIHRoaXMuYWRkVG9EZWJ1Z0J1ZmZlcnMoY29sbGlzaW9uVGlsZSk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHMgPSBmdW5jdGlvbih2ZXJ0ZXgsIGVsZW1lbnQsIGVsZW1lbnRHcm91cHMsIHF1YWRzLCBzY2FsZSwga2VlcFVwcmlnaHQsIGFsb25nTGluZSwgcGxhY2VtZW50QW5nbGUpIHtcblxuICAgIGVsZW1lbnRHcm91cHMubWFrZVJvb21Gb3IoNCAqIHF1YWRzLmxlbmd0aCk7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IGVsZW1lbnRHcm91cHMuY3VycmVudDtcblxuICAgIHZhciB6b29tID0gdGhpcy56b29tO1xuICAgIHZhciBwbGFjZW1lbnRab29tID0gTWF0aC5tYXgoTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjIgKyB6b29tLCAwKTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcXVhZHMubGVuZ3RoOyBrKyspIHtcblxuICAgICAgICB2YXIgc3ltYm9sID0gcXVhZHNba10sXG4gICAgICAgICAgICBhbmdsZSA9IHN5bWJvbC5hbmdsZTtcblxuICAgICAgICAvLyBkcm9wIHVwc2lkZSBkb3duIHZlcnNpb25zIG9mIGdseXBoc1xuICAgICAgICB2YXIgYSA9IChhbmdsZSArIHBsYWNlbWVudEFuZ2xlICsgTWF0aC5QSSkgJSAoTWF0aC5QSSAqIDIpO1xuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgYWxvbmdMaW5lICYmIChhIDw9IE1hdGguUEkgLyAyIHx8IGEgPiBNYXRoLlBJICogMyAvIDIpKSBjb250aW51ZTtcblxuICAgICAgICB2YXIgdGwgPSBzeW1ib2wudGwsXG4gICAgICAgICAgICB0ciA9IHN5bWJvbC50cixcbiAgICAgICAgICAgIGJsID0gc3ltYm9sLmJsLFxuICAgICAgICAgICAgYnIgPSBzeW1ib2wuYnIsXG4gICAgICAgICAgICB0ZXggPSBzeW1ib2wudGV4LFxuICAgICAgICAgICAgYW5jaG9yUG9pbnQgPSBzeW1ib2wuYW5jaG9yUG9pbnQsXG5cbiAgICAgICAgICAgIG1pblpvb20gPSBNYXRoLm1heCh6b29tICsgTWF0aC5sb2coc3ltYm9sLm1pblNjYWxlKSAvIE1hdGguTE4yLCBwbGFjZW1lbnRab29tKSxcbiAgICAgICAgICAgIG1heFpvb20gPSBNYXRoLm1pbih6b29tICsgTWF0aC5sb2coc3ltYm9sLm1heFNjYWxlKSAvIE1hdGguTE4yLCAyNSk7XG5cbiAgICAgICAgaWYgKG1heFpvb20gPD0gbWluWm9vbSkgY29udGludWU7XG5cbiAgICAgICAgLy8gTG93ZXIgbWluIHpvb20gc28gdGhhdCB3aGlsZSBmYWRpbmcgb3V0IHRoZSBsYWJlbCBpdCBjYW4gYmUgc2hvd24gb3V0c2lkZSBvZiBjb2xsaXNpb24tZnJlZSB6b29tIGxldmVsc1xuICAgICAgICBpZiAobWluWm9vbSA9PT0gcGxhY2VtZW50Wm9vbSkgbWluWm9vbSA9IDA7XG5cbiAgICAgICAgdmFyIHRyaWFuZ2xlSW5kZXggPSB2ZXJ0ZXguaW5kZXggLSBlbGVtZW50R3JvdXAudmVydGV4U3RhcnRJbmRleDtcblxuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvclBvaW50LngsIGFuY2hvclBvaW50LnksIHRsLngsIHRsLnksIHRleC54LCB0ZXgueSwgbWluWm9vbSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgIHZlcnRleC5hZGQoYW5jaG9yUG9pbnQueCwgYW5jaG9yUG9pbnQueSwgdHIueCwgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvclBvaW50LngsIGFuY2hvclBvaW50LnksIGJsLngsIGJsLnksIHRleC54LCB0ZXgueSArIHRleC5oLCBtaW5ab29tLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgdmVydGV4LmFkZChhbmNob3JQb2ludC54LCBhbmNob3JQb2ludC55LCBici54LCBici55LCB0ZXgueCArIHRleC53LCB0ZXgueSArIHRleC5oLCBtaW5ab29tLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgZWxlbWVudEdyb3VwLnZlcnRleExlbmd0aCArPSA0O1xuXG4gICAgICAgIGVsZW1lbnQuYWRkKHRyaWFuZ2xlSW5kZXgsIHRyaWFuZ2xlSW5kZXggKyAxLCB0cmlhbmdsZUluZGV4ICsgMik7XG4gICAgICAgIGVsZW1lbnQuYWRkKHRyaWFuZ2xlSW5kZXggKyAxLCB0cmlhbmdsZUluZGV4ICsgMiwgdHJpYW5nbGVJbmRleCArIDMpO1xuICAgICAgICBlbGVtZW50R3JvdXAuZWxlbWVudExlbmd0aCArPSAyO1xuICAgIH1cblxufTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbih0aWxlLCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmlyc3Rkb25lID0gZmFsc2U7XG4gICAgdGhpcy5nZXRUZXh0RGVwZW5kZW5jaWVzKHRpbGUsIGFjdG9yLCBkb25lKTtcbiAgICB0aGlzLmdldEljb25EZXBlbmRlbmNpZXModGlsZSwgYWN0b3IsIGRvbmUpO1xuICAgIGZ1bmN0aW9uIGRvbmUoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgfHwgZmlyc3Rkb25lKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgZmlyc3Rkb25lID0gdHJ1ZTtcbiAgICB9XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmdldEljb25EZXBlbmRlbmNpZXMgPSBmdW5jdGlvbih0aWxlLCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5sYXlvdXRQcm9wZXJ0aWVzWydpY29uLWltYWdlJ10pIHtcbiAgICAgICAgdmFyIGZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcztcbiAgICAgICAgdmFyIGljb25zID0gcmVzb2x2ZUljb25zKGZlYXR1cmVzLCB0aGlzLmxheW91dFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChpY29ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldCBpY29ucycsIHsgaWNvbnM6IGljb25zIH0sIHNldEljb25zLmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0SWNvbnMoZXJyLCBuZXdpY29ucykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgdGhpcy5pY29ucyA9IG5ld2ljb25zO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0VGV4dERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uKHRpbGUsIGFjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXM7XG4gICAgdmFyIGZvbnRzdGFjayA9IHRoaXMubGF5b3V0UHJvcGVydGllc1sndGV4dC1mb250J107XG5cbiAgICB2YXIgc3RhY2tzID0gdGhpcy5zdGFja3MgPSB0aWxlLnN0YWNrcztcbiAgICBpZiAoc3RhY2tzW2ZvbnRzdGFja10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGFja3NbZm9udHN0YWNrXSA9IHt9O1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBzdGFja3NbZm9udHN0YWNrXTtcblxuICAgIHZhciBkYXRhID0gcmVzb2x2ZVRleHQoZmVhdHVyZXMsIHRoaXMubGF5b3V0UHJvcGVydGllcywgc3RhY2spO1xuICAgIHRoaXMudGV4dEZlYXR1cmVzID0gZGF0YS50ZXh0RmVhdHVyZXM7XG5cbiAgICBhY3Rvci5zZW5kKCdnZXQgZ2x5cGhzJywge1xuICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICBmb250c3RhY2s6IGZvbnRzdGFjayxcbiAgICAgICAgY29kZXBvaW50czogZGF0YS5jb2RlcG9pbnRzXG4gICAgfSwgZnVuY3Rpb24oZXJyLCBuZXdzdGFjaykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICBmb3IgKHZhciBjb2RlcG9pbnQgaW4gbmV3c3RhY2spIHtcbiAgICAgICAgICAgIHN0YWNrW2NvZGVwb2ludF0gPSBuZXdzdGFja1tjb2RlcG9pbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnMgPSBmdW5jdGlvbihjb2xsaXNpb25UaWxlKSB7XG5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94ID0gbmV3IEVsZW1lbnRHcm91cHModGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCk7XG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5tYWtlUm9vbUZvcigwKTtcbiAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICB2YXIgYW5nbGUgPSAtY29sbGlzaW9uVGlsZS5hbmdsZTtcbiAgICB2YXIgeVN0cmV0Y2ggPSBjb2xsaXNpb25UaWxlLnlTdHJldGNoO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSB0aGlzLnN5bWJvbEluc3RhbmNlc1tqXVtpID09PSAwID8gJ3RleHRDb2xsaXNpb25GZWF0dXJlJyA6ICdpY29uQ29sbGlzaW9uRmVhdHVyZSddO1xuICAgICAgICAgICAgaWYgKCFmZWF0dXJlKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZhciBib3hlcyA9IGZlYXR1cmUuYm94ZXM7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYm94ZXMubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYm94ID0gYm94ZXNbYl07XG4gICAgICAgICAgICAgICAgdmFyIGFuY2hvclBvaW50ID0gYm94LmFuY2hvclBvaW50O1xuXG4gICAgICAgICAgICAgICAgdmFyIHRsID0gbmV3IFBvaW50KGJveC54MSwgYm94LnkxICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuICAgICAgICAgICAgICAgIHZhciB0ciA9IG5ldyBQb2ludChib3gueDIsIGJveC55MSAqIHlTdHJldGNoKS5fcm90YXRlKGFuZ2xlKTtcbiAgICAgICAgICAgICAgICB2YXIgYmwgPSBuZXcgUG9pbnQoYm94LngxLCBib3gueTIgKiB5U3RyZXRjaCkuX3JvdGF0ZShhbmdsZSk7XG4gICAgICAgICAgICAgICAgdmFyIGJyID0gbmV3IFBvaW50KGJveC54MiwgYm94LnkyICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1heFpvb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNSwgdGhpcy56b29tICsgTWF0aC5sb2coYm94Lm1heFNjYWxlKSAvIE1hdGguTE4yKSk7XG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlbWVudFpvb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNSwgdGhpcy56b29tICsgTWF0aC5sb2coYm94LnBsYWNlbWVudFNjYWxlKSAvIE1hdGguTE4yKSk7XG5cbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCB0bCwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgdHIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yUG9pbnQsIHRyLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCBiciwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgYnIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yUG9pbnQsIGJsLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCBibCwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgdGwsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5jdXJyZW50LnZlcnRleExlbmd0aCArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gU3ltYm9sSW5zdGFuY2UoYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBsYXlvdXQsIGFkZFRvQnVmZmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lKSB7XG5cbiAgICB0aGlzLnggPSBhbmNob3IueDtcbiAgICB0aGlzLnkgPSBhbmNob3IueTtcbiAgICB0aGlzLmhhc1RleHQgPSAhIXNoYXBlZFRleHQ7XG4gICAgdGhpcy5oYXNJY29uID0gISFzaGFwZWRJY29uO1xuXG4gICAgaWYgKHRoaXMuaGFzVGV4dCkge1xuICAgICAgICB0aGlzLmdseXBoUXVhZHMgPSBhZGRUb0J1ZmZlcnMgPyBnZXRHbHlwaFF1YWRzKGFuY2hvciwgc2hhcGVkVGV4dCwgdGV4dEJveFNjYWxlLCBsaW5lLCBsYXlvdXQsIHRleHRBbG9uZ0xpbmUpIDogW107XG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShsaW5lLCBhbmNob3IsIHNoYXBlZFRleHQsIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ljb24pIHtcbiAgICAgICAgdGhpcy5pY29uUXVhZHMgPSBhZGRUb0J1ZmZlcnMgPyBnZXRJY29uUXVhZHMoYW5jaG9yLCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGxpbmUsIGxheW91dCwgaWNvbkFsb25nTGluZSkgOiBbXTtcbiAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGxpbmUsIGFuY2hvciwgc2hhcGVkSWNvbiwgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgaWNvbkFsb25nTGluZSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvb3JkaW5hdGU7XG5cbi8qKlxuICogQSBjb29yZGluYXRlIGlzIGEgY29sdW1uLCByb3csIHpvb20gY29tYmluYXRpb24sIG9mdGVuIHVzZWRcbiAqIGFzIHRoZSBkYXRhIGNvbXBvbmVudCBvZiBhIHRpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtblxuICogQHBhcmFtIHtudW1iZXJ9IHJvd1xuICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvb3JkaW5hdGUoY29sdW1uLCByb3csIHpvb20pIHtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICB0aGlzLnJvdyA9IHJvdztcbiAgICB0aGlzLnpvb20gPSB6b29tO1xufVxuXG5Db29yZGluYXRlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgY29vcmRpbmF0ZSB0aGF0IGNhbiBiZSBtdXRhdGVkIHdpdGhvdXRcbiAgICAgKiBjaGFuZ2luZyB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9IGNsb25lXG4gICAgICogQHByaXZhdGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC5jbG9uZSgpO1xuICAgICAqIC8vIHNpbmNlIGNvb3JkIGlzIGNsb25lZCwgbW9kaWZ5aW5nIGEgcHJvcGVydHkgb2YgYzIgZG9lc1xuICAgICAqIC8vIG5vdCBtb2RpZnkgaXQuXG4gICAgICogYzIuem9vbSA9IDI7XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvb3JkaW5hdGUodGhpcy5jb2x1bW4sIHRoaXMucm93LCB0aGlzLnpvb20pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIHRoaXMgY29vcmRpbmF0ZSB0byBhIGdpdmVuIHpvb20gbGV2ZWwuIFRoaXMgcmV0dXJucyBhIG5ld1xuICAgICAqIGNvb3JkaW5hdGUgb2JqZWN0LCBub3QgbXV0YXRpbmcgdGhlIG9sZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSB6b29tZWQgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC56b29tVG8oMSk7XG4gICAgICogYzIgLy8gZXF1YWxzIG5ldyBDb29yZGluYXRlKDAsIDAsIDEpO1xuICAgICAqL1xuICAgIHpvb21UbzogZnVuY3Rpb24oem9vbSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8oem9vbSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGUgY29sdW1uIGFuZCByb3cgdmFsdWVzIG9mIHRoaXMgY29vcmRpbmF0ZSBmcm9tIHRob3NlXG4gICAgICogb2YgYW5vdGhlciBjb29yZGluYXRlLiBUaGUgb3RoZXIgY29vcmRpbmF0IHdpbGwgYmUgem9vbWVkIHRvIHRoZVxuICAgICAqIHNhbWUgbGV2ZWwgYXMgYHRoaXNgIGJlZm9yZSB0aGUgc3VidHJhY3Rpb24gb2NjdXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGMgb3RoZXIgY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSByZXN1bHRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YjogZnVuY3Rpb24oYykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIoYyk7IH0sXG5cbiAgICBfem9vbVRvOiBmdW5jdGlvbih6b29tKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIHpvb20gLSB0aGlzLnpvb20pO1xuICAgICAgICB0aGlzLmNvbHVtbiAqPSBzY2FsZTtcbiAgICAgICAgdGhpcy5yb3cgKj0gc2NhbGU7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihjKSB7XG4gICAgICAgIGMgPSBjLnpvb21Ubyh0aGlzLnpvb20pO1xuICAgICAgICB0aGlzLmNvbHVtbiAtPSBjLmNvbHVtbjtcbiAgICAgICAgdGhpcy5yb3cgLT0gYy5yb3c7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF0TG5nO1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpLndyYXA7XG5cbi8qKlxuICogQ3JlYXRlIGEgbGF0aXR1ZGUsIGxvbmdpdHVkZSBvYmplY3QgZnJvbSBhIGdpdmVuIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgcGFpciBpbiBkZWdyZWVzLlxuICpcbiAqIEBjbGFzcyBMYXRMbmdcbiAqIEBjbGFzc2Rlc2MgQSByZXByZXNlbnRhdGlvbiBvZiBhIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgcG9pbnQsIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IGxhdGl0dWRlXG4gKiBAcGFyYW0ge251bWJlcn0gbG5nIGxvbmdpdHVkZVxuICogQGV4YW1wbGVcbiAqIHZhciBsYXRsbmcgPSBuZXcgbWFwYm94Z2wuTGF0TG5nKDM3Ljc2LCAtMTIyLjQ0KTtcbiAqL1xuZnVuY3Rpb24gTGF0TG5nKGxhdCwgbG5nKSB7XG4gICAgaWYgKGlzTmFOKGxhdCkgfHwgaXNOYU4obG5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTGF0TG5nIG9iamVjdDogKCcgKyBsYXQgKyAnLCAnICsgbG5nICsgJyknKTtcbiAgICB9XG4gICAgdGhpcy5sYXQgPSArbGF0O1xuICAgIHRoaXMubG5nID0gK2xuZztcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgYExhdExuZ2Agb2JqZWN0IHdob3NlIGxvbmdpdHVkZSBpcyB3cmFwcGVkIHRvIHRoZSByYW5nZSAoLTE4MCwgMTgwKS5cbiAqXG4gKiBAcmV0dXJucyB7TGF0TG5nfSB3cmFwcGVkIExhdExuZyBvYmplY3RcbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9pbnQgPSBtYXBib3hnbC5MYXRMbmcoMCwgMjAwKTtcbiAqIHZhciB3cmFwcGVkID0gcG9pbnQud3JhcCgpO1xuICogd3JhcHBlZC5sbmc7IC8vID0gLTE2MFxuICovXG5MYXRMbmcucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBMYXRMbmcodGhpcy5sYXQsIHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCkpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGEgYExhdExuZ2Agb2JqZWN0LCBvciByZXR1cm4gYW4gZXhpc3RpbmcgYExhdExuZ2Agb2JqZWN0XG4gKiB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fExhdExuZ30gaW5wdXQgYGlucHV0YCB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7TGF0TG5nfSBMYXRMbmcgb2JqZWN0IG9yIG9yaWdpbmFsIGlucHV0XG4gKiBAZXhhbXBsZVxuICogdmFyIGxsID0gbWFwYm94Z2wuTGF0TG5nLmNvbnZlcnQoWzEwLCAxMF0pO1xuICogdmFyIGxsMiA9IG5ldyBtYXBib3hnbC5MYXRMbmcoMTAsIDEwKTtcbiAqIGxsIC8vID0gbGwyXG4gKi9cbkxhdExuZy5jb252ZXJ0ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF0TG5nKGlucHV0WzBdLCBpbnB1dFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF0TG5nQm91bmRzO1xuXG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi9sYXRfbG5nJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJvdW5kaW5nIGJveCBmcm9tIHRoZSBnaXZlbiBwYWlyIG9mIHBvaW50cy4gSWYgcGFyYW1ldGVyZXMgYXJlIG9taXR0ZWQsIGEgYG51bGxgIGJvdW5kaW5nIGJveCBpcyBjcmVhdGVkLlxuICpcbiAqIEBjbGFzcyBMYXRMbmdCb3VuZHNcbiAqIEBjbGFzc2Rlc2MgQSByZXByZXNlbnRhdGlvbiBvZiByZWN0YW5ndWxhciBib3ggb24gdGhlIGVhcnRoLCBkZWZpbmVkIGJ5IGl0cyBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgaW4gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS5cbiAqIEBwYXJhbSB7TGF0TG5nfSBzdyBzb3V0aHdlc3RcbiAqIEBwYXJhbSB7TGF0TG5nfSBuZSBub3J0aGVhc3RcbiAqIEBleGFtcGxlXG4gKiB2YXIgc3cgPSBuZXcgbWFwYm94Z2wuTGF0TG5nKDAsIDApO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxhdExuZygxMCwgLTEwKTtcbiAqIHZhciBib3VuZHMgPSBuZXcgbWFwYm94Z2wuTGF0TG5nQm91bmRzKHN3LCBuZSk7XG4gKlxuICovXG5mdW5jdGlvbiBMYXRMbmdCb3VuZHMoc3csIG5lKSB7XG4gICAgaWYgKCFzdykgcmV0dXJuO1xuXG4gICAgdmFyIGxhdGxuZ3MgPSBuZSA/IFtzdywgbmVdIDogc3c7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGF0bG5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0aGlzLmV4dGVuZChsYXRsbmdzW2ldKTtcbiAgICB9XG59XG5cbkxhdExuZ0JvdW5kcy5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgdGhlIGJvdW5kcyB0byBpbmNsdWRlIGEgZ2l2ZW4gTGF0TG5nIG9yIExhdExuZ0JvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TGF0TG5nfExhdExuZ0JvdW5kc30gb2JqIG9iamVjdCB0byBleHRlbmQgdG9cbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nQm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBleHRlbmQ6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICB2YXIgc3cgPSB0aGlzLl9zdyxcbiAgICAgICAgICAgIG5lID0gdGhpcy5fbmUsXG4gICAgICAgICAgICBzdzIsIG5lMjtcblxuICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgICAgICAgICBzdzIgPSBvYmo7XG4gICAgICAgICAgICBuZTIgPSBvYmo7XG5cbiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iai5fc3c7XG4gICAgICAgICAgICBuZTIgPSBvYmouX25lO1xuXG4gICAgICAgICAgICBpZiAoIXN3MiB8fCAhbmUyKSByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiA/IHRoaXMuZXh0ZW5kKExhdExuZy5jb252ZXJ0KG9iaikgfHwgTGF0TG5nQm91bmRzLmNvbnZlcnQob2JqKSkgOiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExhdExuZyhzdzIubGF0LCBzdzIubG5nKTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExhdExuZyhuZTIubGF0LCBuZTIubG5nKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubGF0ID0gTWF0aC5taW4oc3cyLmxhdCwgc3cubGF0KTtcbiAgICAgICAgICAgIHN3LmxuZyA9IE1hdGgubWluKHN3Mi5sbmcsIHN3LmxuZyk7XG4gICAgICAgICAgICBuZS5sYXQgPSBNYXRoLm1heChuZTIubGF0LCBuZS5sYXQpO1xuICAgICAgICAgICAgbmUubG5nID0gTWF0aC5tYXgobmUyLmxuZywgbmUubG5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvaW50IGVxdWlkaXN0YW50IGZyb20gdGhpcyBib3gncyBjb3JuZXJzXG4gICAgICogQHJldHVybnMge0xhdExuZ30gY2VudGVycG9pbnRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBib3VuZHMgPSBuZXcgbWFwYm94Z2wuTGF0TG5nQm91bmRzKFxuICAgICAqICAgbmV3IG1hcGJveGdsLkxhdExuZygxMCwgMTApLFxuICAgICAqICAgbmV3IG1hcGJveGdsLkxhdExuZygtMTAsIC0xMCk7XG4gICAgICogYm91bmRzLmdldENlbnRlcigpOyAvLyBlcXVhbHMgbWFwYm94Z2wuTGF0TG5nKDAsIDApXG4gICAgICovXG4gICAgZ2V0Q2VudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyLCAodGhpcy5fc3cubG5nICsgdGhpcy5fbmUubG5nKSAvIDIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgc291dGh3ZXN0IGNvcm5lclxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IHNvdXRod2VzdFxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zdzsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBub3J0aGVhc3QgY29ybmVyXG4gICAgICogQHJldHVybnMge0xhdExuZ30gbm9ydGhlYXN0XG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX25lOyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vcnRod2VzdCBjb3JuZXJcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBub3J0aHdlc3RcbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExhdExuZyh0aGlzLmdldE5vcnRoKCksIHRoaXMuZ2V0V2VzdCgpKTsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzb3V0aGVhc3QgY29ybmVyXG4gICAgICogQHJldHVybnMge0xhdExuZ30gc291dGhlYXN0XG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMYXRMbmcodGhpcy5nZXRTb3V0aCgpLCB0aGlzLmdldEVhc3QoKSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgd2VzdCBlZGdlIGxvbmdpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHdlc3RcbiAgICAgKi9cbiAgICBnZXRXZXN0OiAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgc291dGggZWRnZSBsYXRpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHNvdXRoXG4gICAgICovXG4gICAgZ2V0U291dGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc3cubGF0OyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGVhc3QgZWRnZSBsb25naXR1ZGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBlYXN0XG4gICAgICovXG4gICAgZ2V0RWFzdDogIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vcnRoIGVkZ2UgbGF0aXR1ZGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBub3J0aFxuICAgICAqL1xuICAgIGdldE5vcnRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX25lLmxhdDsgfVxufTtcblxuLyoqXG4gKiBjb25zdHJ1Y3RzIExhdExuZ0JvdW5kcyBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuICogQHBhcmFtIHtMYXRMbmdCb3VuZHN8Kn0gYSBhbnkgaW5wdXRcbiAqIEByZXR1cm5zIHtMYXRMbmdCb3VuZHN8ZmFsc2V9XG4gKiBAZXhhbXBsZVxuICogLy8gY2FsbHMgTGF0TG5nLmNvbnZlcnQgaW50ZXJuYWxseSB0b1xuICogLy8gc3VwcG9ydCBhcnJheXMgYXMgbGF0bG5nIHZhbHVlc1xuICogTGF0TG5nQm91bmRzLmNvbnZlcnQoW1stMTAsIC0xMF0sIFsxMCwgMTBdXSk7XG4gKi9cbkxhdExuZ0JvdW5kcy5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoIWEgfHwgYSBpbnN0YW5jZW9mIExhdExuZ0JvdW5kcykgcmV0dXJuIGE7XG4gICAgcmV0dXJuIG5ldyBMYXRMbmdCb3VuZHMoYSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi9sYXRfbG5nJyksXG4gICAgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpLFxuICAgIENvb3JkaW5hdGUgPSByZXF1aXJlKCcuL2Nvb3JkaW5hdGUnKSxcbiAgICB3cmFwID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJykud3JhcCxcbiAgICBpbnRlcnAgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyksXG4gICAgdmVjNCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLnZlYzQsXG4gICAgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG4vKlxuICogQSBzaW5nbGUgdHJhbnNmb3JtLCBnZW5lcmFsbHkgdXNlZCBmb3IgYSBzaW5nbGUgdGlsZSB0byBiZVxuICogc2NhbGVkLCByb3RhdGVkLCBhbmQgem9vbWVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5ab29tXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4Wm9vbVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gVHJhbnNmb3JtKG1pblpvb20sIG1heFpvb20pIHtcbiAgICB0aGlzLnRpbGVTaXplID0gNTEyOyAvLyBjb25zdGFudFxuXG4gICAgdGhpcy5fbWluWm9vbSA9IG1pblpvb20gfHwgMDtcbiAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcblxuICAgIHRoaXMubGF0UmFuZ2UgPSBbLTg1LjA1MTEzLCA4NS4wNTExM107XG5cbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdGhpcy56b29tID0gMDtcbiAgICB0aGlzLmNlbnRlciA9IG5ldyBMYXRMbmcoMCwgMCk7XG4gICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgdGhpcy5fYWx0aXR1ZGUgPSAxLjU7XG4gICAgdGhpcy5fcGl0Y2ggPSAwO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICAgIGdldCBtaW5ab29tKCkgeyByZXR1cm4gdGhpcy5fbWluWm9vbTsgfSxcbiAgICBzZXQgbWluWm9vbSh6b29tKSB7XG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCh0aGlzLnpvb20sIHpvb20pO1xuICAgIH0sXG5cbiAgICBnZXQgbWF4Wm9vbSgpIHsgcmV0dXJuIHRoaXMuX21heFpvb207IH0sXG4gICAgc2V0IG1heFpvb20oem9vbSkge1xuICAgICAgICB0aGlzLl9tYXhab29tID0gem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy56b29tLCB6b29tKTtcbiAgICB9LFxuXG4gICAgZ2V0IHdvcmxkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZVNpemUgKiB0aGlzLnNjYWxlO1xuICAgIH0sXG5cbiAgICBnZXQgY2VudGVyUG9pbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemUuX2RpdigyKTtcbiAgICB9LFxuXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICBnZXQgYmVhcmluZygpIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LFxuICAgIHNldCBiZWFyaW5nKGJlYXJpbmcpIHtcbiAgICAgICAgdGhpcy5hbmdsZSA9IC13cmFwKGJlYXJpbmcsIC0xODAsIDE4MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIH0sXG5cbiAgICBnZXQgcGl0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXRjaCAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcbiAgICBzZXQgcGl0Y2gocGl0Y2gpIHtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBNYXRoLm1pbig2MCwgcGl0Y2gpIC8gMTgwICogTWF0aC5QSTtcbiAgICB9LFxuXG4gICAgZ2V0IGFsdGl0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWx0aXR1ZGU7XG4gICAgfSxcbiAgICBzZXQgYWx0aXR1ZGUoYWx0aXR1ZGUpIHtcbiAgICAgICAgdGhpcy5fYWx0aXR1ZGUgPSBNYXRoLm1heCgwLjc1LCBhbHRpdHVkZSk7XG4gICAgfSxcblxuICAgIGdldCB6b29tKCkgeyByZXR1cm4gdGhpcy5fem9vbTsgfSxcbiAgICBzZXQgem9vbSh6b29tKSB7XG4gICAgICAgIHpvb20gPSBNYXRoLm1pbihNYXRoLm1heCh6b29tLCB0aGlzLm1pblpvb20pLCB0aGlzLm1heFpvb20pO1xuICAgICAgICB0aGlzLl96b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKHpvb20pO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcih6b29tKTtcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6b29tIC0gdGhpcy50aWxlWm9vbTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgfSxcblxuICAgIHpvb21TY2FsZTogZnVuY3Rpb24oem9vbSkgeyByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7IH0sXG4gICAgc2NhbGVab29tOiBmdW5jdGlvbihzY2FsZSkgeyByZXR1cm4gTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjI7IH0sXG5cbiAgICBwcm9qZWN0OiBmdW5jdGlvbihsYXRsbmcsIHdvcmxkU2l6ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxhdGxuZy5sbmcsIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICB0aGlzLmxhdFkobGF0bG5nLmxhdCwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIHVucHJvamVjdDogZnVuY3Rpb24ocG9pbnQsIHdvcmxkU2l6ZSkge1xuICAgICAgICByZXR1cm4gbmV3IExhdExuZyhcbiAgICAgICAgICAgIHRoaXMueUxhdChwb2ludC55LCB3b3JsZFNpemUpLFxuICAgICAgICAgICAgdGhpcy54TG5nKHBvaW50LngsIHdvcmxkU2l6ZSkpO1xuICAgIH0sXG5cbiAgICBnZXQgeCgpIHsgcmV0dXJuIHRoaXMubG5nWCh0aGlzLmNlbnRlci5sbmcpOyB9LFxuICAgIGdldCB5KCkgeyByZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCk7IH0sXG5cbiAgICBnZXQgcG9pbnQoKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgLyoqXG4gICAgICogbGF0L2xvbiA8LT4gYWJzb2x1dGUgcGl4ZWwgY29vcmRzIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3b3JsZFNpemU9dGhpcy53b3JsZFNpemVdXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG5nWDogZnVuY3Rpb24obG9uLCB3b3JsZFNpemUpIHtcbiAgICAgICAgcmV0dXJuICgxODAgKyBsb24pICogKHdvcmxkU2l6ZSB8fCB0aGlzLndvcmxkU2l6ZSkgLyAzNjA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBsYXRpdHVkZSB0byBhYnNvbHV0ZSB5IGNvb3JkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGF0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3b3JsZFNpemU9dGhpcy53b3JsZFNpemVdXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbGF0WTogZnVuY3Rpb24obGF0LCB3b3JsZFNpemUpIHtcbiAgICAgICAgdmFyIHkgPSAxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSk7XG4gICAgICAgIHJldHVybiAoMTgwIC0geSkgKiAod29ybGRTaXplIHx8IHRoaXMud29ybGRTaXplKSAvIDM2MDtcbiAgICB9LFxuXG4gICAgeExuZzogZnVuY3Rpb24oeCwgd29ybGRTaXplKSB7XG4gICAgICAgIHJldHVybiB4ICogMzYwIC8gKHdvcmxkU2l6ZSB8fCB0aGlzLndvcmxkU2l6ZSkgLSAxODA7XG4gICAgfSxcbiAgICB5TGF0OiBmdW5jdGlvbih5LCB3b3JsZFNpemUpIHtcbiAgICAgICAgdmFyIHkyID0gMTgwIC0geSAqIDM2MCAvICh3b3JsZFNpemUgfHwgdGhpcy53b3JsZFNpemUpO1xuICAgICAgICByZXR1cm4gMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwO1xuICAgIH0sXG5cbiAgICBwYW5CeTogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuY2VudGVyUG9pbnQuX2FkZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMucG9pbnRMb2NhdGlvbihwb2ludCk7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgIH0sXG5cbiAgICBzZXRMb2NhdGlvbkF0UG9pbnQ6IGZ1bmN0aW9uKGxhdGxuZywgcG9pbnQpIHtcbiAgICAgICAgdmFyIGMgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsYXRsbmcpO1xuICAgICAgICB2YXIgY29vcmRBdFBvaW50ID0gdGhpcy5wb2ludENvb3JkaW5hdGUocG9pbnQpO1xuICAgICAgICB2YXIgY29vcmRDZW50ZXIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KTtcblxuICAgICAgICB2YXIgdHJhbnNsYXRlID0gY29vcmRBdFBvaW50Ll9zdWIoYyk7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24oY29vcmRDZW50ZXIuX3N1Yih0cmFuc2xhdGUpKTtcblxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICB9LFxuXG4gICAgc2V0Wm9vbUFyb3VuZDogZnVuY3Rpb24oem9vbSwgY2VudGVyKSB7XG4gICAgICAgIHZhciBwO1xuICAgICAgICBpZiAoY2VudGVyKSBwID0gdGhpcy5sb2NhdGlvblBvaW50KGNlbnRlcik7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIGlmIChjZW50ZXIpIHRoaXMuc2V0TG9jYXRpb25BdFBvaW50KGNlbnRlciwgcCk7XG4gICAgfSxcblxuICAgIHNldEJlYXJpbmdBcm91bmQ6IGZ1bmN0aW9uKGJlYXJpbmcsIGNlbnRlcikge1xuICAgICAgICB2YXIgcDtcbiAgICAgICAgaWYgKGNlbnRlcikgcCA9IHRoaXMubG9jYXRpb25Qb2ludChjZW50ZXIpO1xuICAgICAgICB0aGlzLmJlYXJpbmcgPSBiZWFyaW5nO1xuICAgICAgICBpZiAoY2VudGVyKSB0aGlzLnNldExvY2F0aW9uQXRQb2ludChjZW50ZXIsIHApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGxvY2F0aW9uLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZyBsb2NhdGlvblxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50OiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxhdGxuZykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsYXRsbmdcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHNjcmVlbiBwb2ludFxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IGxhdGxuZyBsb2NhdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcG9pbnRMb2NhdGlvbjogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5wb2ludENvb3JkaW5hdGUocCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsYXRsbmcsIHJldHVybiBhbiB1bnJvdW5kZWRcbiAgICAgKiBjb29yZGluYXRlIHRoYXQgcmVwcmVzZW50cyBpdCBhdCB0aGlzIHRyYW5zZm9ybSdzIHpvb20gbGV2ZWwgYW5kXG4gICAgICogd29ybGRzaXplLlxuICAgICAqIEBwYXJhbSB7TGF0TG5nfSBsYXRsbmdcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZTogZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgIHZhciBrID0gdGhpcy56b29tU2NhbGUodGhpcy50aWxlWm9vbSkgLyB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxhdGxuZy5sbmcpICogayxcbiAgICAgICAgICAgIHRoaXMubGF0WShsYXRsbmcubGF0KSAqIGssXG4gICAgICAgICAgICB0aGlzLnRpbGVab29tKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBDb29yZGluYXRlLCByZXR1cm4gaXRzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge0xhdExuZ30gbGF0bG5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb29yZGluYXRlTG9jYXRpb246IGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgIHZhciB3b3JsZFNpemUgPSB0aGlzLnpvb21TY2FsZShjb29yZC56b29tKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoXG4gICAgICAgICAgICB0aGlzLnlMYXQoY29vcmQucm93LCB3b3JsZFNpemUpLFxuICAgICAgICAgICAgdGhpcy54TG5nKGNvb3JkLmNvbHVtbiwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIHBvaW50Q29vcmRpbmF0ZTogZnVuY3Rpb24ocCwgdGFyZ2V0Wikge1xuXG4gICAgICAgIGlmICh0YXJnZXRaID09PSB1bmRlZmluZWQpIHRhcmdldFogPSAwO1xuXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKTtcbiAgICAgICAgdmFyIGludmVydGVkID0gbWF0NC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIG1hdHJpeCk7XG5cbiAgICAgICAgaWYgKCFpbnZlcnRlZCkgdGhyb3cgXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiO1xuXG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3QgcHJvamVjdGVkIHogdmFsdWUgZm9yIHRoZSBwb2ludCxcbiAgICAgICAgLy8gdW5wcm9qZWN0IHR3byBwb2ludHMgdG8gZ2V0IGEgbGluZSBhbmQgdGhlbiBmaW5kIHRoZSBwb2ludCBvbiB0aGF0XG4gICAgICAgIC8vIGxpbmUgd2l0aCB6PTBcblxuICAgICAgICB2YXIgY29vcmQwID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIDAsIDFdLCBpbnZlcnRlZCk7XG4gICAgICAgIHZhciBjb29yZDEgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgMSwgMV0sIGludmVydGVkKTtcblxuICAgICAgICB2YXIgdzAgPSBjb29yZDBbM107XG4gICAgICAgIHZhciB3MSA9IGNvb3JkMVszXTtcbiAgICAgICAgdmFyIHgwID0gY29vcmQwWzBdIC8gdzA7XG4gICAgICAgIHZhciB4MSA9IGNvb3JkMVswXSAvIHcxO1xuICAgICAgICB2YXIgeTAgPSBjb29yZDBbMV0gLyB3MDtcbiAgICAgICAgdmFyIHkxID0gY29vcmQxWzFdIC8gdzE7XG4gICAgICAgIHZhciB6MCA9IGNvb3JkMFsyXSAvIHcwO1xuICAgICAgICB2YXIgejEgPSBjb29yZDFbMl0gLyB3MTtcblxuXG4gICAgICAgIHZhciB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycCh4MCwgeDEsIHQpLFxuICAgICAgICAgICAgaW50ZXJwKHkwLCB5MSwgdCksXG4gICAgICAgICAgICB0aGlzLnRpbGVab29tKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb29yZGluYXRlUG9pbnQ6IGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeChjb29yZC56b29tKTtcbiAgICAgICAgdmFyIHAgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtjb29yZC5jb2x1bW4sIGNvb3JkLnJvdywgMCwgMV0sIG1hdHJpeCk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQocFswXSAvIHBbM10sIHBbMV0gLyBwWzNdKTtcbiAgICB9LFxuXG4gICAgY29vcmRpbmF0ZVBvaW50TWF0cml4OiBmdW5jdGlvbih6KSB7XG4gICAgICAgIHZhciBwcm9qID0gdGhpcy5nZXRQcm9qTWF0cml4KCk7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMud29ybGRTaXplIC8gdGhpcy56b29tU2NhbGUoeik7XG4gICAgICAgIG1hdDQuc2NhbGUocHJvaiwgcHJvaiwgW3NjYWxlLCBzY2FsZSwgMV0pO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHByb2osIHRoaXMuZ2V0UGl4ZWxNYXRyaXgoKSwgcHJvaik7XG4gICAgICAgIHJldHVybiBwcm9qO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBnbCBjb29yZGluYXRlcyAtMS4uMSB0byBwaXhlbHMgMC4ud2lkdGhcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBtYXRyaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFBpeGVsTWF0cml4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFt0aGlzLndpZHRoIC8gMiwgLXRoaXMuaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfSxcblxuICAgIF9jb25zdHJhaW46IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2VudGVyKSByZXR1cm47XG5cbiAgICAgICAgdmFyIG1pblksIG1heFksIG1pblgsIG1heFgsIHN5LCBzeCwgeDIsIHkyLFxuICAgICAgICAgICAgc2l6ZSA9IHRoaXMuc2l6ZTtcblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgbWluWSA9IHRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKTtcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLmxhdFkodGhpcy5sYXRSYW5nZVswXSk7XG4gICAgICAgICAgICBzeSA9IG1heFkgLSBtaW5ZIDwgc2l6ZS55ID8gc2l6ZS55IC8gKG1heFkgLSBtaW5ZKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgbWluWCA9IHRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKTtcbiAgICAgICAgICAgIG1heFggPSB0aGlzLmxuZ1godGhpcy5sbmdSYW5nZVsxXSk7XG4gICAgICAgICAgICBzeCA9IG1heFggLSBtaW5YIDwgc2l6ZS54ID8gc2l6ZS54IC8gKG1heFggLSBtaW5YKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBob3cgbXVjaCB0aGUgbWFwIHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIHNjcmVlbiBpbnRvIGdpdmVuIGxhdGl0dWRlL2xvbmdpdHVkZSByYW5nZXNcbiAgICAgICAgdmFyIHMgPSBNYXRoLm1heChzeCB8fCAwLCBzeSB8fCAwKTtcblxuICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgc3ggPyAobWF4WCArIG1pblgpIC8gMiA6IHRoaXMueCxcbiAgICAgICAgICAgICAgICBzeSA/IChtYXhZICsgbWluWSkgLyAyIDogdGhpcy55KSk7XG4gICAgICAgICAgICB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20ocyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgdmFyIHkgPSB0aGlzLnksXG4gICAgICAgICAgICAgICAgaDIgPSBzaXplLnkgLyAyO1xuXG4gICAgICAgICAgICBpZiAoeSAtIGgyIDwgbWluWSkgeTIgPSBtaW5ZICsgaDI7XG4gICAgICAgICAgICBpZiAoeSArIGgyID4gbWF4WSkgeTIgPSBtYXhZIC0gaDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgdmFyIHggPSB0aGlzLngsXG4gICAgICAgICAgICAgICAgdzIgPSBzaXplLnggLyAyO1xuXG4gICAgICAgICAgICBpZiAoeCAtIHcyIDwgbWluWCkgeDIgPSBtaW5YICsgdzI7XG4gICAgICAgICAgICBpZiAoeCArIHcyID4gbWF4WCkgeDIgPSBtYXhYIC0gdzI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW4gdGhlIG1hcCBpZiB0aGUgc2NyZWVuIGdvZXMgb2ZmIHRoZSByYW5nZVxuICAgICAgICBpZiAoeDIgIT09IHVuZGVmaW5lZCB8fCB5MiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICB4MiAhPT0gdW5kZWZpbmVkID8geDIgOiB0aGlzLngsXG4gICAgICAgICAgICAgICAgeTIgIT09IHVuZGVmaW5lZCA/IHkyIDogdGhpcy55KSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0UHJvak1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IHRvIHRoZSBjZW50ZXIgdG9wIGluIGFsdGl0dWRlIHVuaXRzIHVzaW5nIGxhdyBvZiBzaW5lcy5cbiAgICAgICAgdmFyIGhhbGZGb3YgPSBNYXRoLmF0YW4oMC41IC8gdGhpcy5hbHRpdHVkZSk7XG4gICAgICAgIHZhciB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oaGFsZkZvdikgKiB0aGlzLmFsdGl0dWRlIC8gTWF0aC5zaW4oTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCAtIGhhbGZGb3YpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgeiB2YWx1ZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAgICAgIHZhciBmYXJaID0gTWF0aC5jb3MoTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCkgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgdGhpcy5hbHRpdHVkZTtcblxuICAgICAgICBtYXQ0LnBlcnNwZWN0aXZlKG0sIDIgKiBNYXRoLmF0YW4oKHRoaXMuaGVpZ2h0IC8gMikgLyB0aGlzLmFsdGl0dWRlKSwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCAwLjEsIGZhclopO1xuXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFswLCAwLCAtdGhpcy5hbHRpdHVkZV0pO1xuXG4gICAgICAgIC8vIEFmdGVyIHRoZSByb3RhdGVYLCB6IHZhbHVlcyBhcmUgaW4gcGl4ZWwgdW5pdHMuIENvbnZlcnQgdGhlbSB0b1xuICAgICAgICAvLyBhbHRpdHVkZSB1bml0ZXMuIDEgYWx0aXR1ZGUgdW5pdCA9IHRoZSBzY3JlZW4gaGVpZ2h0LlxuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAtMSwgMSAvIHRoaXMuaGVpZ2h0XSk7XG5cbiAgICAgICAgbWF0NC5yb3RhdGVYKG0sIG0sIHRoaXMuX3BpdGNoKTtcbiAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRoaXMuYW5nbGUpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLXRoaXMueCwgLXRoaXMueSwgMF0pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBGb250IGRhdGEgRnJvbSBIZXJzaGV5IFNpbXBsZXggRm9udFxuLy8gaHR0cDovL3BhdWxib3Vya2UubmV0L2RhdGFmb3JtYXRzL2hlcnNoZXkvXG52YXIgc2ltcGxleEZvbnQgPSB7XG4gICAgXCIgXCI6IFsxNiwgW11dLFxuICAgIFwiIVwiOiBbMTAsIFs1LCAyMSwgNSwgNywgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCJcXFwiXCI6IFsxNiwgWzQsIDIxLCA0LCAxNCwgLTEsIC0xLCAxMiwgMjEsIDEyLCAxNF1dLFxuICAgIFwiI1wiOiBbMjEsIFsxMSwgMjUsIDQsIC03LCAtMSwgLTEsIDE3LCAyNSwgMTAsIC03LCAtMSwgLTEsIDQsIDEyLCAxOCwgMTIsIC0xLCAtMSwgMywgNiwgMTcsIDZdXSxcbiAgICBcIiRcIjogWzIwLCBbOCwgMjUsIDgsIC00LCAtMSwgLTEsIDEyLCAyNSwgMTIsIC00LCAtMSwgLTEsIDE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIiVcIjogWzI0LCBbMjEsIDIxLCAzLCAwLCAtMSwgLTEsIDgsIDIxLCAxMCwgMTksIDEwLCAxNywgOSwgMTUsIDcsIDE0LCA1LCAxNCwgMywgMTYsIDMsIDE4LCA0LCAyMCwgNiwgMjEsIDgsIDIxLCAxMCwgMjAsIDEzLCAxOSwgMTYsIDE5LCAxOSwgMjAsIDIxLCAyMSwgLTEsIC0xLCAxNywgNywgMTUsIDYsIDE0LCA0LCAxNCwgMiwgMTYsIDAsIDE4LCAwLCAyMCwgMSwgMjEsIDMsIDIxLCA1LCAxOSwgNywgMTcsIDddXSxcbiAgICBcIiZcIjogWzI2LCBbMjMsIDEyLCAyMywgMTMsIDIyLCAxNCwgMjEsIDE0LCAyMCwgMTMsIDE5LCAxMSwgMTcsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDcsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDYsIDQsIDgsIDUsIDksIDEyLCAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LCAxOCwgMTMsIDIwLCAxMSwgMjEsIDksIDIwLCA4LCAxOCwgOCwgMTYsIDksIDEzLCAxMSwgMTAsIDE2LCAzLCAxOCwgMSwgMjAsIDAsIDIyLCAwLCAyMywgMSwgMjMsIDJdXSxcbiAgICBcIidcIjogWzEwLCBbNSwgMTksIDQsIDIwLCA1LCAyMSwgNiwgMjAsIDYsIDE4LCA1LCAxNiwgNCwgMTVdXSxcbiAgICBcIihcIjogWzE0LCBbMTEsIDI1LCA5LCAyMywgNywgMjAsIDUsIDE2LCA0LCAxMSwgNCwgNywgNSwgMiwgNywgLTIsIDksIC01LCAxMSwgLTddXSxcbiAgICBcIilcIjogWzE0LCBbMywgMjUsIDUsIDIzLCA3LCAyMCwgOSwgMTYsIDEwLCAxMSwgMTAsIDcsIDksIDIsIDcsIC0yLCA1LCAtNSwgMywgLTddXSxcbiAgICBcIipcIjogWzE2LCBbOCwgMjEsIDgsIDksIC0xLCAtMSwgMywgMTgsIDEzLCAxMiwgLTEsIC0xLCAxMywgMTgsIDMsIDEyXV0sXG4gICAgXCIrXCI6IFsyNiwgWzEzLCAxOCwgMTMsIDAsIC0xLCAtMSwgNCwgOSwgMjIsIDldXSxcbiAgICBcIixcIjogWzEwLCBbNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiLVwiOiBbMjYsIFs0LCA5LCAyMiwgOV1dLFxuICAgIFwiLlwiOiBbMTAsIFs1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCIvXCI6IFsyMiwgWzIwLCAyNSwgMiwgLTddXSxcbiAgICBcIjBcIjogWzIwLCBbOSwgMjEsIDYsIDIwLCA0LCAxNywgMywgMTIsIDMsIDksIDQsIDQsIDYsIDEsIDksIDAsIDExLCAwLCAxNCwgMSwgMTYsIDQsIDE3LCA5LCAxNywgMTIsIDE2LCAxNywgMTQsIDIwLCAxMSwgMjEsIDksIDIxXV0sXG4gICAgXCIxXCI6IFsyMCwgWzYsIDE3LCA4LCAxOCwgMTEsIDIxLCAxMSwgMF1dLFxuICAgIFwiMlwiOiBbMjAsIFs0LCAxNiwgNCwgMTcsIDUsIDE5LCA2LCAyMCwgOCwgMjEsIDEyLCAyMSwgMTQsIDIwLCAxNSwgMTksIDE2LCAxNywgMTYsIDE1LCAxNSwgMTMsIDEzLCAxMCwgMywgMCwgMTcsIDBdXSxcbiAgICBcIjNcIjogWzIwLCBbNSwgMjEsIDE2LCAyMSwgMTAsIDEzLCAxMywgMTMsIDE1LCAxMiwgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjRcIjogWzIwLCBbMTMsIDIxLCAzLCA3LCAxOCwgNywgLTEsIC0xLCAxMywgMjEsIDEzLCAwXV0sXG4gICAgXCI1XCI6IFsyMCwgWzE1LCAyMSwgNSwgMjEsIDQsIDEyLCA1LCAxMywgOCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNlwiOiBbMjAsIFsxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCAxMCwgMjEsIDcsIDIwLCA1LCAxNywgNCwgMTIsIDQsIDcsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMSwgMCwgMTQsIDEsIDE2LCAzLCAxNywgNiwgMTcsIDcsIDE2LCAxMCwgMTQsIDEyLCAxMSwgMTMsIDEwLCAxMywgNywgMTIsIDUsIDEwLCA0LCA3XV0sXG4gICAgXCI3XCI6IFsyMCwgWzE3LCAyMSwgNywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxXV0sXG4gICAgXCI4XCI6IFsyMCwgWzgsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNCwgNywgMTMsIDExLCAxMiwgMTQsIDExLCAxNiwgOSwgMTcsIDcsIDE3LCA0LCAxNiwgMiwgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA3LCA0LCA5LCA2LCAxMSwgOSwgMTIsIDEzLCAxMywgMTUsIDE0LCAxNiwgMTYsIDE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxXV0sXG4gICAgXCI5XCI6IFsyMCwgWzE2LCAxNCwgMTUsIDExLCAxMywgOSwgMTAsIDgsIDksIDgsIDYsIDksIDQsIDExLCAzLCAxNCwgMywgMTUsIDQsIDE4LCA2LCAyMCwgOSwgMjEsIDEwLCAyMSwgMTMsIDIwLCAxNSwgMTgsIDE2LCAxNCwgMTYsIDksIDE1LCA0LCAxMywgMSwgMTAsIDAsIDgsIDAsIDUsIDEsIDQsIDNdXSxcbiAgICBcIjpcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIjtcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIjxcIjogWzI0LCBbMjAsIDE4LCA0LCA5LCAyMCwgMF1dLFxuICAgIFwiPVwiOiBbMjYsIFs0LCAxMiwgMjIsIDEyLCAtMSwgLTEsIDQsIDYsIDIyLCA2XV0sXG4gICAgXCI+XCI6IFsyNCwgWzQsIDE4LCAyMCwgOSwgNCwgMF1dLFxuICAgIFwiP1wiOiBbMTgsIFszLCAxNiwgMywgMTcsIDQsIDE5LCA1LCAyMCwgNywgMjEsIDExLCAyMSwgMTMsIDIwLCAxNCwgMTksIDE1LCAxNywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgOSwgMTAsIDksIDcsIC0xLCAtMSwgOSwgMiwgOCwgMSwgOSwgMCwgMTAsIDEsIDksIDJdXSxcbiAgICBcIkBcIjogWzI3LCBbMTgsIDEzLCAxNywgMTUsIDE1LCAxNiwgMTIsIDE2LCAxMCwgMTUsIDksIDE0LCA4LCAxMSwgOCwgOCwgOSwgNiwgMTEsIDUsIDE0LCA1LCAxNiwgNiwgMTcsIDgsIC0xLCAtMSwgMTIsIDE2LCAxMCwgMTQsIDksIDExLCA5LCA4LCAxMCwgNiwgMTEsIDUsIC0xLCAtMSwgMTgsIDE2LCAxNywgOCwgMTcsIDYsIDE5LCA1LCAyMSwgNSwgMjMsIDcsIDI0LCAxMCwgMjQsIDEyLCAyMywgMTUsIDIyLCAxNywgMjAsIDE5LCAxOCwgMjAsIDE1LCAyMSwgMTIsIDIxLCA5LCAyMCwgNywgMTksIDUsIDE3LCA0LCAxNSwgMywgMTIsIDMsIDksIDQsIDYsIDUsIDQsIDcsIDIsIDksIDEsIDEyLCAwLCAxNSwgMCwgMTgsIDEsIDIwLCAyLCAyMSwgMywgLTEsIC0xLCAxOSwgMTYsIDE4LCA4LCAxOCwgNiwgMTksIDVdXSxcbiAgICBcIkFcIjogWzE4LCBbOSwgMjEsIDEsIDAsIC0xLCAtMSwgOSwgMjEsIDE3LCAwLCAtMSwgLTEsIDQsIDcsIDE0LCA3XV0sXG4gICAgXCJCXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgLTEsIC0xLCA0LCAxMSwgMTMsIDExLCAxNiwgMTAsIDE3LCA5LCAxOCwgNywgMTgsIDQsIDE3LCAyLCAxNiwgMSwgMTMsIDAsIDQsIDBdXSxcbiAgICBcIkNcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1XV0sXG4gICAgXCJEXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMSwgMjEsIDE0LCAyMCwgMTYsIDE4LCAxNywgMTYsIDE4LCAxMywgMTgsIDgsIDE3LCA1LCAxNiwgMywgMTQsIDEsIDExLCAwLCA0LCAwXV0sXG4gICAgXCJFXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMSwgLTEsIC0xLCA0LCAwLCAxNywgMF1dLFxuICAgIFwiRlwiOiBbMTgsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTFdXSxcbiAgICBcIkdcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOCwgOCwgLTEsIC0xLCAxMywgOCwgMTgsIDhdXSxcbiAgICBcIkhcIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMCwgLTEsIC0xLCA0LCAxMSwgMTgsIDExXV0sXG4gICAgXCJJXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIkpcIjogWzE2LCBbMTIsIDIxLCAxMiwgNSwgMTEsIDIsIDEwLCAxLCA4LCAwLCA2LCAwLCA0LCAxLCAzLCAyLCAyLCA1LCAyLCA3XV0sXG4gICAgXCJLXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgNCwgNywgLTEsIC0xLCA5LCAxMiwgMTgsIDBdXSxcbiAgICBcIkxcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMCwgMTYsIDBdXSxcbiAgICBcIk1cIjogWzI0LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAyMCwgMF1dLFxuICAgIFwiTlwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTgsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMF1dLFxuICAgIFwiT1wiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxXV0sXG4gICAgXCJQXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNCwgMTcsIDEyLCAxNiwgMTEsIDEzLCAxMCwgNCwgMTBdXSxcbiAgICBcIlFcIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgLTEsIC0xLCAxMiwgNCwgMTgsIC0yXV0sXG4gICAgXCJSXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgNCwgMTEsIC0xLCAtMSwgMTEsIDExLCAxOCwgMF1dLFxuICAgIFwiU1wiOiBbMjAsIFsxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCJUXCI6IFsxNiwgWzgsIDIxLCA4LCAwLCAtMSwgLTEsIDEsIDIxLCAxNSwgMjFdXSxcbiAgICBcIlVcIjogWzIyLCBbNCwgMjEsIDQsIDYsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMiwgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNiwgMTgsIDIxXV0sXG4gICAgXCJWXCI6IFsxOCwgWzEsIDIxLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMF1dLFxuICAgIFwiV1wiOiBbMjQsIFsyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCAxNywgMCwgLTEsIC0xLCAyMiwgMjEsIDE3LCAwXV0sXG4gICAgXCJYXCI6IFsyMCwgWzMsIDIxLCAxNywgMCwgLTEsIC0xLCAxNywgMjEsIDMsIDBdXSxcbiAgICBcIllcIjogWzE4LCBbMSwgMjEsIDksIDExLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMTFdXSxcbiAgICBcIlpcIjogWzIwLCBbMTcsIDIxLCAzLCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjEsIC0xLCAtMSwgMywgMCwgMTcsIDBdXSxcbiAgICBcIltcIjogWzE0LCBbNCwgMjUsIDQsIC03LCAtMSwgLTEsIDUsIDI1LCA1LCAtNywgLTEsIC0xLCA0LCAyNSwgMTEsIDI1LCAtMSwgLTEsIDQsIC03LCAxMSwgLTddXSxcbiAgICBcIlxcXFxcIjogWzE0LCBbMCwgMjEsIDE0LCAtM11dLFxuICAgIFwiXVwiOiBbMTQsIFs5LCAyNSwgOSwgLTcsIC0xLCAtMSwgMTAsIDI1LCAxMCwgLTcsIC0xLCAtMSwgMywgMjUsIDEwLCAyNSwgLTEsIC0xLCAzLCAtNywgMTAsIC03XV0sXG4gICAgXCJeXCI6IFsxNiwgWzYsIDE1LCA4LCAxOCwgMTAsIDE1LCAtMSwgLTEsIDMsIDEyLCA4LCAxNywgMTMsIDEyLCAtMSwgLTEsIDgsIDE3LCA4LCAwXV0sXG4gICAgXCJfXCI6IFsxNiwgWzAsIC0yLCAxNiwgLTJdXSxcbiAgICBcImBcIjogWzEwLCBbNiwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE1LCA2LCAxNiwgNSwgMTddXSxcbiAgICBcImFcIjogWzE5LCBbMTUsIDE0LCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJiXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwiY1wiOiBbMTgsIFsxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJkXCI6IFsxOSwgWzE1LCAyMSwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZVwiOiBbMTgsIFszLCA4LCAxNSwgOCwgMTUsIDEwLCAxNCwgMTIsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJmXCI6IFsxMiwgWzEwLCAyMSwgOCwgMjEsIDYsIDIwLCA1LCAxNywgNSwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcImdcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTIsIDE0LCAtNSwgMTMsIC02LCAxMSwgLTcsIDgsIC03LCA2LCAtNiwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJoXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJpXCI6IFs4LCBbMywgMjEsIDQsIDIwLCA1LCAyMSwgNCwgMjIsIDMsIDIxLCAtMSwgLTEsIDQsIDE0LCA0LCAwXV0sXG4gICAgXCJqXCI6IFsxMCwgWzUsIDIxLCA2LCAyMCwgNywgMjEsIDYsIDIyLCA1LCAyMSwgLTEsIC0xLCA2LCAxNCwgNiwgLTMsIDUsIC02LCAzLCAtNywgMSwgLTddXSxcbiAgICBcImtcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTQsIDE0LCA0LCA0LCAtMSwgLTEsIDgsIDgsIDE1LCAwXV0sXG4gICAgXCJsXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIm1cIjogWzMwLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDAsIC0xLCAtMSwgMTUsIDEwLCAxOCwgMTMsIDIwLCAxNCwgMjMsIDE0LCAyNSwgMTMsIDI2LCAxMCwgMjYsIDBdXSxcbiAgICBcIm5cIjogWzE5LCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcIm9cIjogWzE5LCBbOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgMywgMTYsIDYsIDE2LCA4LCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNF1dLFxuICAgIFwicFwiOiBbMTksIFs0LCAxNCwgNCwgLTcsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJxXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC03LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcInJcIjogWzEzLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgOCwgNSwgMTEsIDcsIDEzLCA5LCAxNCwgMTIsIDE0XV0sXG4gICAgXCJzXCI6IFsxNywgWzE0LCAxMSwgMTMsIDEzLCAxMCwgMTQsIDcsIDE0LCA0LCAxMywgMywgMTEsIDQsIDksIDYsIDgsIDExLCA3LCAxMywgNiwgMTQsIDQsIDE0LCAzLCAxMywgMSwgMTAsIDAsIDcsIDAsIDQsIDEsIDMsIDNdXSxcbiAgICBcInRcIjogWzEyLCBbNSwgMjEsIDUsIDQsIDYsIDEsIDgsIDAsIDEwLCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwidVwiOiBbMTksIFs0LCAxNCwgNCwgNCwgNSwgMSwgNywgMCwgMTAsIDAsIDEyLCAxLCAxNSwgNCwgLTEsIC0xLCAxNSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ2XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMF1dLFxuICAgIFwid1wiOiBbMjIsIFszLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCAxNSwgMCwgLTEsIC0xLCAxOSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ4XCI6IFsxNywgWzMsIDE0LCAxNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDMsIDBdXSxcbiAgICBcInlcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwLCA2LCAtNCwgNCwgLTYsIDIsIC03LCAxLCAtN11dLFxuICAgIFwielwiOiBbMTcsIFsxNCwgMTQsIDMsIDAsIC0xLCAtMSwgMywgMTQsIDE0LCAxNCwgLTEsIC0xLCAzLCAwLCAxNCwgMF1dLFxuICAgIFwie1wiOiBbMTQsIFs5LCAyNSwgNywgMjQsIDYsIDIzLCA1LCAyMSwgNSwgMTksIDYsIDE3LCA3LCAxNiwgOCwgMTQsIDgsIDEyLCA2LCAxMCwgLTEsIC0xLCA3LCAyNCwgNiwgMjIsIDYsIDIwLCA3LCAxOCwgOCwgMTcsIDksIDE1LCA5LCAxMywgOCwgMTEsIDQsIDksIDgsIDcsIDksIDUsIDksIDMsIDgsIDEsIDcsIDAsIDYsIC0yLCA2LCAtNCwgNywgLTYsIC0xLCAtMSwgNiwgOCwgOCwgNiwgOCwgNCwgNywgMiwgNiwgMSwgNSwgLTEsIDUsIC0zLCA2LCAtNSwgNywgLTYsIDksIC03XV0sXG4gICAgXCJ8XCI6IFs4LCBbNCwgMjUsIDQsIC03XV0sXG4gICAgXCJ9XCI6IFsxNCwgWzUsIDI1LCA3LCAyNCwgOCwgMjMsIDksIDIxLCA5LCAxOSwgOCwgMTcsIDcsIDE2LCA2LCAxNCwgNiwgMTIsIDgsIDEwLCAtMSwgLTEsIDcsIDI0LCA4LCAyMiwgOCwgMjAsIDcsIDE4LCA2LCAxNywgNSwgMTUsIDUsIDEzLCA2LCAxMSwgMTAsIDksIDYsIDcsIDUsIDUsIDUsIDMsIDYsIDEsIDcsIDAsIDgsIC0yLCA4LCAtNCwgNywgLTYsIC0xLCAtMSwgOCwgOCwgNiwgNiwgNiwgNCwgNywgMiwgOCwgMSwgOSwgLTEsIDksIC0zLCA4LCAtNSwgNywgLTYsIDUsIC03XV0sXG4gICAgXCJ+XCI6IFsyNCwgWzMsIDYsIDMsIDgsIDQsIDExLCA2LCAxMiwgOCwgMTIsIDEwLCAxMSwgMTQsIDgsIDE2LCA3LCAxOCwgNywgMjAsIDgsIDIxLCAxMCwgLTEsIC0xLCAzLCA4LCA0LCAxMCwgNiwgMTEsIDgsIDExLCAxMCwgMTAsIDE0LCA3LCAxNiwgNiwgMTgsIDYsIDIwLCA3LCAyMSwgMTAsIDIxLCAxMl1dXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRleHRWZXJ0aWNlcyh0ZXh0LCBsZWZ0LCBiYXNlbGluZSwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDE7XG5cbiAgICB2YXIgc3Ryb2tlcyA9IFtdLFxuICAgICAgICBpLCBsZW4sIGosIGxlbjIsIGdseXBoLCB4LCB5LCBwcmV2O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBnbHlwaCA9IHNpbXBsZXhGb250W3RleHRbaV1dO1xuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMiA9IGdseXBoWzFdLmxlbmd0aDsgaiA8IGxlbjI7IGogKz0gMikge1xuICAgICAgICAgICAgaWYgKGdseXBoWzFdW2pdID09PSAtMSAmJiBnbHlwaFsxXVtqICsgMV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBnbHlwaFsxXVtqXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHkgPSBiYXNlbGluZSAtIGdseXBoWzFdW2ogKyAxXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZXMucHVzaChwcmV2LngsIHByZXYueSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSB7eDogeCwgeTogeX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGVmdCArPSBnbHlwaFswXSAqIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJva2VzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBtYXBib3hnbCBpcyBhIEEgV2ViR0wgSmF2YVNjcmlwdCBpbnRlcmFjdGl2ZSBtYXBzIGxpYnJhcnkgdGhhdCBjYW4gcmVuZGVyXG4gKiBbTWFwYm94IHZlY3RvciB0aWxlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL3ZlY3Rvci10aWxlcy8pLlxuICpcbiAqIEBtb2R1bGUgbWFwYm94Z2xcbiAqIEBzdW1tYXJ5IFdlYkdMIEphdmFTY3JpcHQgbWFwIGxpYnJhcnlcbiAqL1xuXG4vLyBqc2hpbnQgLVcwNzlcbnZhciBtYXBib3hnbCA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbm1hcGJveGdsLk1hcCA9IHJlcXVpcmUoJy4vdWkvbWFwJyk7XG5tYXBib3hnbC5OYXZpZ2F0aW9uID0gcmVxdWlyZSgnLi91aS9jb250cm9sL25hdmlnYXRpb24nKTtcbm1hcGJveGdsLkF0dHJpYnV0aW9uID0gcmVxdWlyZSgnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uJyk7XG5tYXBib3hnbC5Qb3B1cCA9IHJlcXVpcmUoJy4vdWkvcG9wdXAnKTtcblxubWFwYm94Z2wuR2VvSlNPTlNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlL2dlb2pzb25fc291cmNlJyk7XG5tYXBib3hnbC5WaWRlb1NvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlL3ZpZGVvX3NvdXJjZScpO1xuXG5tYXBib3hnbC5TdHlsZSA9IHJlcXVpcmUoJy4vc3R5bGUvc3R5bGUnKTtcblxubWFwYm94Z2wuTGF0TG5nID0gcmVxdWlyZSgnLi9nZW8vbGF0X2xuZycpO1xubWFwYm94Z2wuTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi9nZW8vbGF0X2xuZ19ib3VuZHMnKTtcbm1hcGJveGdsLlBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubWFwYm94Z2wuRXZlbnRlZCA9IHJlcXVpcmUoJy4vdXRpbC9ldmVudGVkJyk7XG5tYXBib3hnbC51dGlsID0gcmVxdWlyZSgnLi91dGlsL3V0aWwnKTtcblxubWFwYm94Z2wuc3VwcG9ydGVkID0gcmVxdWlyZSgnLi91dGlsL2Jyb3dzZXInKS5zdXBwb3J0ZWQ7XG5cbnZhciBhamF4ID0gcmVxdWlyZSgnLi91dGlsL2FqYXgnKTtcbm1hcGJveGdsLnV0aWwuZ2V0SlNPTiA9IGFqYXguZ2V0SlNPTjtcbm1hcGJveGdsLnV0aWwuZ2V0QXJyYXlCdWZmZXIgPSBhamF4LmdldEFycmF5QnVmZmVyO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi91dGlsL2NvbmZpZycpO1xubWFwYm94Z2wuY29uZmlnID0gY29uZmlnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobWFwYm94Z2wsICdhY2Nlc3NUb2tlbicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29uZmlnLkFDQ0VTU19UT0tFTjsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHRva2VuKSB7IGNvbmZpZy5BQ0NFU1NfVE9LRU4gPSB0b2tlbjsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtYXQzID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0MztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3QmFja2dyb3VuZDtcblxuZnVuY3Rpb24gZHJhd0JhY2tncm91bmQocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCkge1xuICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgdmFyIGNvbG9yID0gbGF5ZXIucGFpbnRbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICB2YXIgaW1hZ2UgPSBsYXllci5wYWludFsnYmFja2dyb3VuZC1pbWFnZSddO1xuICAgIHZhciBvcGFjaXR5ID0gbGF5ZXIucGFpbnRbJ2JhY2tncm91bmQtb3BhY2l0eSddO1xuICAgIHZhciBzaGFkZXI7XG5cbiAgICB2YXIgaW1hZ2VQb3NBID0gaW1hZ2UgPyBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpIDogbnVsbDtcbiAgICB2YXIgaW1hZ2VQb3NCID0gaW1hZ2UgPyBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLnRvLCB0cnVlKSA6IG51bGw7XG5cbiAgICBpZiAoaW1hZ2VQb3NBICYmIGltYWdlUG9zQikge1xuICAgICAgICAvLyBEcmF3IHRleHR1cmUgZmlsbFxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLnBhdHRlcm5TaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV9pbWFnZSwgMCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfb3BhY2l0eSwgb3BhY2l0eSk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICB2YXIgc2l6ZUEgPSBpbWFnZVBvc0Euc2l6ZTtcbiAgICAgICAgdmFyIHNpemVCID0gaW1hZ2VQb3NCLnNpemU7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKHRyYW5zZm9ybS5jZW50ZXIpO1xuICAgICAgICB2YXIgc2NhbGUgPSAxIC8gTWF0aC5wb3coMiwgdHJhbnNmb3JtLnpvb21GcmFjdGlvbik7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21peCwgaW1hZ2UudCk7XG5cbiAgICAgICAgdmFyIG1hdHJpeEEgPSBtYXQzLmNyZWF0ZSgpO1xuICAgICAgICBtYXQzLnNjYWxlKG1hdHJpeEEsIG1hdHJpeEEsIFtcbiAgICAgICAgICAgIDEgLyAoc2l6ZUFbMF0gKiBpbWFnZS5mcm9tU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChzaXplQVsxXSAqIGltYWdlLmZyb21TY2FsZSlcbiAgICAgICAgXSk7XG4gICAgICAgIG1hdDMudHJhbnNsYXRlKG1hdHJpeEEsIG1hdHJpeEEsIFtcbiAgICAgICAgICAgIChjZW50ZXIuY29sdW1uICogdHJhbnNmb3JtLnRpbGVTaXplKSAlIChzaXplQVswXSAqIGltYWdlLmZyb21TY2FsZSksXG4gICAgICAgICAgICAoY2VudGVyLnJvdyAgICAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUFbMV0gKiBpbWFnZS5mcm9tU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnJvdGF0ZShtYXRyaXhBLCBtYXRyaXhBLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgbWF0My5zY2FsZShtYXRyaXhBLCBtYXRyaXhBLCBbXG4gICAgICAgICAgICBzY2FsZSAqIHRyYW5zZm9ybS53aWR0aCAgLyAyLFxuICAgICAgICAgICAtc2NhbGUgKiB0cmFuc2Zvcm0uaGVpZ2h0IC8gMlxuICAgICAgICBdKTtcblxuICAgICAgICB2YXIgbWF0cml4QiA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgMSAvIChzaXplQlswXSAqIGltYWdlLnRvU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChzaXplQlsxXSAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnRyYW5zbGF0ZShtYXRyaXhCLCBtYXRyaXhCLCBbXG4gICAgICAgICAgICAoY2VudGVyLmNvbHVtbiAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUJbMF0gKiBpbWFnZS50b1NjYWxlKSxcbiAgICAgICAgICAgIChjZW50ZXIucm93ICAgICogdHJhbnNmb3JtLnRpbGVTaXplKSAlIChzaXplQlsxXSAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnJvdGF0ZShtYXRyaXhCLCBtYXRyaXhCLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgbWF0My5zY2FsZShtYXRyaXhCLCBtYXRyaXhCLCBbXG4gICAgICAgICAgICBzY2FsZSAqIHRyYW5zZm9ybS53aWR0aCAgLyAyLFxuICAgICAgICAgICAtc2NhbGUgKiB0cmFuc2Zvcm0uaGVpZ2h0IC8gMlxuICAgICAgICBdKTtcblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYSwgZmFsc2UsIG1hdHJpeEEpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYiwgZmFsc2UsIG1hdHJpeEIpO1xuXG4gICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgdHJ1ZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEcmF3IGZpbGxpbmcgcmVjdGFuZ2xlLlxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmZpbGxTaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9jb2xvcik7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgY29sb3IpO1xuICAgIH1cblxuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci5iYWNrZ3JvdW5kQnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgcGFpbnRlci5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHBhaW50ZXIuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQpO1xuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwMCk7XG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdQbGFjZW1lbnREZWJ1ZztcblxuZnVuY3Rpb24gZHJhd1BsYWNlbWVudERlYnVnKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcblxuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGlsZS5lbGVtZW50R3JvdXBzW2xheWVyLnJlZiB8fCBsYXllci5pZF0uY29sbGlzaW9uQm94O1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGdsID0gcGFpbnRlci5nbDtcbiAgICB2YXIgYnVmZmVyID0gdGlsZS5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICB2YXIgc2hhZGVyID0gcGFpbnRlci5jb2xsaXNpb25Cb3hTaGFkZXI7XG5cbiAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcblxuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgYnVmZmVyLmJpbmQoZ2wsIHNoYWRlcik7XG4gICAgZ2wubGluZVdpZHRoKDEpO1xuXG4gICAgdmFyIHN0cmlkZSA9IDEyO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9leHRydWRlLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgNCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhLCAyLCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCA4KTtcblxuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9zY2FsZSwgTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSAtIHRpbGUuY29vcmQueikpO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV96b29tLCBwYWludGVyLnRyYW5zZm9ybS56b29tICogMTApO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9tYXh6b29tLCAodGlsZS5jb29yZC56ICsgMSkgKiAxMCk7XG5cbiAgICB2YXIgYmVnaW4gPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1swXS52ZXJ0ZXhTdGFydEluZGV4O1xuICAgIHZhciBsZW4gPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1swXS52ZXJ0ZXhMZW5ndGg7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUywgYmVnaW4sIGxlbik7XG5cbiAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0ZXh0VmVydGljZXMgPSByZXF1aXJlKCcuLi9saWIvZGVidWd0ZXh0Jyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdEZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0RlYnVnKHBhaW50ZXIsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgLy8gQmxlbmQgdG8gdGhlIGZyb250LCBub3QgdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5kZWJ1Z1NoYWRlciwgdGlsZS5wb3NNYXRyaXgpO1xuXG4gICAgLy8gZHJhdyBib3VuZGluZyByZWN0YW5nbGVcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci5kZWJ1Z0J1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmRlYnVnU2hhZGVyLmFfcG9zLCBwYWludGVyLmRlYnVnQnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLnVuaWZvcm00ZihwYWludGVyLmRlYnVnU2hhZGVyLnVfY29sb3IsIDEsIDAsIDAsIDEpO1xuICAgIGdsLmxpbmVXaWR0aCg0KTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVfU1RSSVAsIDAsIHBhaW50ZXIuZGVidWdCdWZmZXIuaXRlbUNvdW50KTtcblxuICAgIHZhciB2ZXJ0aWNlcyA9IHRleHRWZXJ0aWNlcyh0aWxlLmNvb3JkLnRvU3RyaW5nKCksIDUwLCAyMDAsIDUpO1xuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHBhaW50ZXIuZGVidWdUZXh0QnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEludDE2QXJyYXkodmVydGljZXMpLCBnbC5TVFJFQU1fRFJBVyk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmRlYnVnU2hhZGVyLmFfcG9zLCBwYWludGVyLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSwgZ2wuU0hPUlQsIGZhbHNlLCAwLCAwKTtcbiAgICBnbC5saW5lV2lkdGgoOCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgZ2wudW5pZm9ybTRmKHBhaW50ZXIuZGVidWdTaGFkZXIudV9jb2xvciwgMSwgMSwgMSwgMSk7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUywgMCwgdmVydGljZXMubGVuZ3RoIC8gcGFpbnRlci5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUpO1xuICAgIGdsLmxpbmVXaWR0aCgyICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICBnbC51bmlmb3JtNGYocGFpbnRlci5kZWJ1Z1NoYWRlci51X2NvbG9yLCAwLCAwLCAwLCAxKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCAwLCB2ZXJ0aWNlcy5sZW5ndGggLyBwYWludGVyLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSk7XG5cbiAgICAvLyBSZXZlcnQgYmxlbmRpbmcgbW9kZSB0byBibGVuZCB0byB0aGUgYmFjay5cbiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgZ2wuT05FKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBtYXQzID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0MztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3RmlsbDtcblxuZnVuY3Rpb24gZHJhd0ZpbGwocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSkge1xuICAgIC8vIE5vIGRhdGFcbiAgICBpZiAoIXRpbGUuYnVmZmVycykgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGlsZS5lbGVtZW50R3JvdXBzW2xheWVyLnJlZiB8fCBsYXllci5pZF07XG4gICAgaWYgKCFlbGVtZW50R3JvdXBzKSByZXR1cm47XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuICAgIHZhciB0cmFuc2xhdGVkUG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVNYXRyaXgocG9zTWF0cml4LCB0aWxlLCBsYXllci5wYWludFsnZmlsbC10cmFuc2xhdGUnXSwgbGF5ZXIucGFpbnRbJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvciddKTtcblxuICAgIHZhciBjb2xvciA9IGxheWVyLnBhaW50WydmaWxsLWNvbG9yJ107XG5cbiAgICB2YXIgdmVydGV4LCBlbGVtZW50cywgZ3JvdXAsIGNvdW50O1xuXG4gICAgLy8gRHJhdyB0aGUgc3RlbmNpbCBtYXNrLlxuXG4gICAgLy8gV2UncmUgb25seSBkcmF3aW5nIHRvIHRoZSBmaXJzdCBzZXZlbiBiaXRzICg9PSBzdXBwb3J0IGEgbWF4aW11bSBvZlxuICAgIC8vIDEyNyBvdmVybGFwcGluZyBwb2x5Z29ucyBpbiBvbmUgcGxhY2UgYmVmb3JlIHdlIGdldCByZW5kZXJpbmcgZXJyb3JzKS5cbiAgICBnbC5zdGVuY2lsTWFzaygweDNGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuXG4gICAgLy8gRHJhdyBmcm9udCBmYWNpbmcgdHJpYW5nbGVzLiBXaGVyZXZlciB0aGUgMHg4MCBiaXQgaXMgMSwgd2UgYXJlXG4gICAgLy8gaW5jcmVhc2luZyB0aGUgbG93ZXIgNyBiaXRzIGJ5IG9uZSBpZiB0aGUgdHJpYW5nbGUgaXMgYSBmcm9udC1mYWNpbmdcbiAgICAvLyB0cmlhbmdsZS4gVGhpcyBtZWFucyB0aGF0IGFsbCB2aXNpYmxlIHBvbHlnb25zIHNob3VsZCBiZSBpbiBDQ1dcbiAgICAvLyBvcmllbnRhdGlvbiwgd2hpbGUgYWxsIGhvbGVzIChzZWUgYmVsb3cpIGFyZSBpbiBDVyBvcmllbnRhdGlvbi5cbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgMHg4MCwgMHg4MCk7XG5cbiAgICAvLyBXaGVuIHdlIGRvIGEgbm9uemVybyBmaWxsLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcGl4ZWwgaXNcbiAgICAvLyBjb3ZlcmVkIGJ5IGEgY291bnRlcmNsb2Nrd2lzZSBwb2x5Z29uLCBhbmQgc3VidHJhY3QgdGhlIG51bWJlciBvZlxuICAgIC8vIHRpbWVzIGl0IGlzIFwidW5jb3ZlcmVkXCIgYnkgYSBjbG9ja3dpc2UgcG9seWdvbi5cbiAgICBnbC5zdGVuY2lsT3BTZXBhcmF0ZShnbC5GUk9OVCwgZ2wuSU5DUl9XUkFQLCBnbC5LRUVQLCBnbC5LRUVQKTtcbiAgICBnbC5zdGVuY2lsT3BTZXBhcmF0ZShnbC5CQUNLLCBnbC5ERUNSX1dSQVAsIGdsLktFRVAsIGdsLktFRVApO1xuXG4gICAgLy8gV2hlbiBkcmF3aW5nIGEgc2hhcGUsIHdlIGZpcnN0IGRyYXcgYWxsIHNoYXBlcyB0byB0aGUgc3RlbmNpbCBidWZmZXJcbiAgICAvLyBhbmQgaW5jcmVtZW50aW5nIGFsbCBhcmVhcyB3aGVyZSBwb2x5Z29ucyBhcmVcbiAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgLy8gRHJhdyB0aGUgYWN0dWFsIHRyaWFuZ2xlIGZhbiBpbnRvIHRoZSBzdGVuY2lsIGJ1ZmZlci5cbiAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5maWxsU2hhZGVyLCB0cmFuc2xhdGVkUG9zTWF0cml4KTtcblxuICAgIC8vIERyYXcgYWxsIGJ1ZmZlcnNcbiAgICB2ZXJ0ZXggPSB0aWxlLmJ1ZmZlcnMuZmlsbFZlcnRleDtcbiAgICB2ZXJ0ZXguYmluZChnbCk7XG4gICAgZWxlbWVudHMgPSB0aWxlLmJ1ZmZlcnMuZmlsbEVsZW1lbnQ7XG4gICAgZWxlbWVudHMuYmluZChnbCk7XG5cbiAgICB2YXIgb2Zmc2V0LCBlbGVtZW50T2Zmc2V0O1xuXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHBhaW50ZXIuZmlsbFNoYWRlci5hX2NvbG9yKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudEdyb3Vwcy5ncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tpXTtcbiAgICAgICAgb2Zmc2V0ID0gZ3JvdXAudmVydGV4U3RhcnRJbmRleCAqIHZlcnRleC5pdGVtU2l6ZTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmZpbGxTaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgNCwgb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgZWxlbWVudE9mZnNldCA9IGdyb3VwLmVsZW1lbnRTdGFydEluZGV4ICogZWxlbWVudHMuaXRlbVNpemU7XG4gICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgc3RlbmNpbCBtYXNrIGluIHRoZSBzdGVuY2lsIGJ1ZmZlciwgd2UgY2FuIHN0YXJ0XG4gICAgLy8gd3JpdGluZyB0byB0aGUgY29sb3IgYnVmZmVyLlxuICAgIGdsLmNvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcblxuICAgIC8vIEZyb20gbm93IG9uLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSB0aGUgc3RlbmNpbCBidWZmZXIgYW55bW9yZS5cbiAgICBnbC5zdGVuY2lsT3AoZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwKTtcblxuICAgIHZhciBzdHJva2VDb2xvciA9IGxheWVyLnBhaW50WydmaWxsLW91dGxpbmUtY29sb3InXTtcblxuICAgIC8vIEJlY2F1c2Ugd2UncmUgZHJhd2luZyB0b3AtdG8tYm90dG9tLCBhbmQgd2UgdXBkYXRlIHRoZSBzdGVuY2lsIG1hc2tcbiAgICAvLyBiZWxvdywgd2UgaGF2ZSB0byBkcmF3IHRoZSBvdXRsaW5lIGZpcnN0ICghKVxuICAgIGlmIChsYXllci5wYWludFsnZmlsbC1hbnRpYWxpYXMnXSA9PT0gdHJ1ZSAmJiAhKGxheWVyLnBhaW50WydmaWxsLWltYWdlJ10gJiYgIXN0cm9rZUNvbG9yKSkge1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5vdXRsaW5lU2hhZGVyLCB0cmFuc2xhdGVkUG9zTWF0cml4KTtcbiAgICAgICAgZ2wubGluZVdpZHRoKDIgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgICAgIGlmIChzdHJva2VDb2xvcikge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGVmaW5lZCBhIGRpZmZlcmVudCBjb2xvciBmb3IgdGhlIGZpbGwgb3V0bGluZSwgd2UgYXJlXG4gICAgICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgzRiBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgICAgIC8vIGNsaXBwaW5nIG1hc2suXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHg4MCwgMHg4MCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIG9ubHkgd2FudCB0byBkcmF3IHRoZSBhbnRpYWxpYXNlZCBwYXJ0cyB0aGF0IGFyZVxuICAgICAgICAgICAgLy8gKm91dHNpZGUqIHRoZSBjdXJyZW50IHNoYXBlLiBUaGlzIGlzIGltcG9ydGFudCBpbiBjYXNlIHRoZSBmaWxsXG4gICAgICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2hhcGUsIHNvbWUgcGl4ZWxzIGZyb20gdGhlIG91dGxpbmUgc3Ryb2tlIG92ZXJsYXBwZWRcbiAgICAgICAgICAgIC8vIHRoZSAobm9uLWFudGlhbGlhc2VkKSBmaWxsLlxuICAgICAgICAgICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4QkYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmKHBhaW50ZXIub3V0bGluZVNoYWRlci51X3dvcmxkLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQpO1xuXG4gICAgICAgIC8vIERyYXcgYWxsIGJ1ZmZlcnNcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmZpbGxWZXJ0ZXg7XG4gICAgICAgIGVsZW1lbnRzID0gdGlsZS5idWZmZXJzLm91dGxpbmVFbGVtZW50O1xuICAgICAgICBlbGVtZW50cy5iaW5kKGdsKTtcblxuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocGFpbnRlci5vdXRsaW5lU2hhZGVyLmFfY29sb3IpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWI0ZnYocGFpbnRlci5vdXRsaW5lU2hhZGVyLmFfY29sb3IsIHN0cm9rZUNvbG9yID8gc3Ryb2tlQ29sb3IgOiBjb2xvcik7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1trXTtcbiAgICAgICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIub3V0bGluZVNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCA0LCBvZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgY291bnQgPSBncm91cC5zZWNvbmRFbGVtZW50TGVuZ3RoICogMjtcbiAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLkxJTkVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2ZpbGwtaW1hZ2UnXTtcbiAgICB2YXIgb3BhY2l0eSA9IGxheWVyLnBhaW50WydmaWxsLW9wYWNpdHknXSB8fCAxO1xuICAgIHZhciBzaGFkZXI7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgLy8gRHJhdyB0ZXh0dXJlIGZpbGxcbiAgICAgICAgdmFyIGltYWdlUG9zQSA9IHBhaW50ZXIuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaW1hZ2UuZnJvbSwgdHJ1ZSk7XG4gICAgICAgIHZhciBpbWFnZVBvc0IgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLnRvLCB0cnVlKTtcbiAgICAgICAgaWYgKCFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQikgcmV0dXJuO1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIucGF0dGVyblNoYWRlcjtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2EsIGltYWdlUG9zQS50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9hLCBpbWFnZVBvc0EuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fdGxfYiwgaW1hZ2VQb3NCLnRsKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX2JyX2IsIGltYWdlUG9zQi5icik7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5LCBvcGFjaXR5KTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21peCwgaW1hZ2UudCk7XG5cbiAgICAgICAgdmFyIGZhY3RvciA9ICh0aWxlLnRpbGVFeHRlbnQgLyB0aWxlLnRpbGVTaXplKSAvIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tIC0gdGlsZS5jb29yZC56KTtcblxuICAgICAgICB2YXIgbWF0cml4QSA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QSwgbWF0cml4QSwgW1xuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Euc2l6ZVswXSAqIGZhY3RvciAqIGltYWdlLmZyb21TY2FsZSksXG4gICAgICAgICAgICAxIC8gKGltYWdlUG9zQS5zaXplWzFdICogZmFjdG9yICogaW1hZ2UuZnJvbVNjYWxlKVxuICAgICAgICBdKTtcblxuICAgICAgICB2YXIgbWF0cml4QiA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Iuc2l6ZVswXSAqIGZhY3RvciAqIGltYWdlLnRvU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Iuc2l6ZVsxXSAqIGZhY3RvciAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoc2hhZGVyLnVfcGF0dGVybm1hdHJpeF9hLCBmYWxzZSwgbWF0cml4QSk7XG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoc2hhZGVyLnVfcGF0dGVybm1hdHJpeF9iLCBmYWxzZSwgbWF0cml4Qik7XG5cbiAgICAgICAgcGFpbnRlci5zcHJpdGVBdGxhcy5iaW5kKGdsLCB0cnVlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERyYXcgZmlsbGluZyByZWN0YW5nbGUuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIuZmlsbFNoYWRlcjtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX2NvbG9yKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliNGZ2KHNoYWRlci5hX2NvbG9yLCBjb2xvcik7XG4gICAgfVxuXG4gICAgLy8gT25seSBkcmF3IHJlZ2lvbnMgdGhhdCB3ZSBtYXJrZWRcbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgMHgwLCAweDNGKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHBhaW50ZXIudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwMCk7XG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIG1hdDIgPSByZXF1aXJlKCdnbC1tYXRyaXgnKS5tYXQyO1xuXG4vKipcbiAqIERyYXcgYSBsaW5lLiBVbmRlciB0aGUgaG9vZCB0aGlzIHdpbGwgcmVhZCBlbGVtZW50cyBmcm9tXG4gKiBhIHRpbGUsIGRhc2ggdGV4dHVyZXMgZnJvbSBhIGxpbmVBdGxhcywgYW5kIHN0eWxlIHByb3BlcnRpZXMgZnJvbSBhIGxheWVyLlxuICogQHBhcmFtIHtPYmplY3R9IHBhaW50ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllclxuICogQHBhcmFtIHtPYmplY3R9IHBvc01hdHJpeFxuICogQHBhcmFtIHtUaWxlfSB0aWxlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSBkcmF3cyB3aXRoIHRoZSBwYWludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICAvLyBObyBkYXRhXG4gICAgaWYgKCF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGdsID0gcGFpbnRlci5nbDtcblxuICAgIC8vIGRvbid0IGRyYXcgemVyby13aWR0aCBsaW5lc1xuICAgIGlmIChsYXllci5wYWludFsnbGluZS13aWR0aCddIDw9IDApIHJldHVybjtcblxuICAgIC8vIHRoZSBkaXN0YW5jZSBvdmVyIHdoaWNoIHRoZSBsaW5lIGVkZ2UgZmFkZXMgb3V0LlxuICAgIC8vIFJldGluYSBkZXZpY2VzIG5lZWQgYSBzbWFsbGVyIGRpc3RhbmNlIHRvIGF2b2lkIGFsaWFzaW5nLlxuICAgIHZhciBhbnRpYWxpYXNpbmcgPSAxIC8gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgdmFyIGJsdXIgPSBsYXllci5wYWludFsnbGluZS1ibHVyJ10gKyBhbnRpYWxpYXNpbmc7XG4gICAgdmFyIGVkZ2VXaWR0aCA9IGxheWVyLnBhaW50WydsaW5lLXdpZHRoJ10gLyAyO1xuICAgIHZhciBpbnNldCA9IC0xO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIHZhciBzaGlmdCA9IDA7XG5cbiAgICBpZiAobGF5ZXIucGFpbnRbJ2xpbmUtZ2FwLXdpZHRoJ10gPiAwKSB7XG4gICAgICAgIGluc2V0ID0gbGF5ZXIucGFpbnRbJ2xpbmUtZ2FwLXdpZHRoJ10gLyAyICsgYW50aWFsaWFzaW5nICogMC41O1xuICAgICAgICBlZGdlV2lkdGggPSBsYXllci5wYWludFsnbGluZS13aWR0aCddO1xuXG4gICAgICAgIC8vIHNoaWZ0IG91dGVyIGxpbmVzIGhhbGYgYSBwaXhlbCB0b3dhcmRzIHRoZSBtaWRkbGUgdG8gZWxpbWluYXRlIHRoZSBjcmFja1xuICAgICAgICBvZmZzZXQgPSBpbnNldCAtIGFudGlhbGlhc2luZyAvIDI7XG4gICAgfVxuXG4gICAgdmFyIG91dHNldCA9IG9mZnNldCArIGVkZ2VXaWR0aCArIGFudGlhbGlhc2luZyAvIDIgKyBzaGlmdDtcblxuICAgIHZhciBjb2xvciA9IGxheWVyLnBhaW50WydsaW5lLWNvbG9yJ107XG4gICAgdmFyIHJhdGlvID0gcGFpbnRlci50cmFuc2Zvcm0uc2NhbGUgLyAoMSA8PCB0aWxlLmNvb3JkLnopIC8gKHRpbGUudGlsZUV4dGVudCAvIHRpbGUudGlsZVNpemUpO1xuICAgIHZhciB2dHhNYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZU1hdHJpeChwb3NNYXRyaXgsIHRpbGUsIGxheWVyLnBhaW50WydsaW5lLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFsnbGluZS10cmFuc2xhdGUtYW5jaG9yJ10pO1xuXG4gICAgdmFyIHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG5cblxuICAgIHZhciBhbnRpYWxpYXNpbmdNYXRyaXggPSBtYXQyLmNyZWF0ZSgpO1xuICAgIG1hdDIuc2NhbGUoYW50aWFsaWFzaW5nTWF0cml4LCBhbnRpYWxpYXNpbmdNYXRyaXgsIFsxLCBNYXRoLmNvcyh0ci5fcGl0Y2gpXSk7XG4gICAgbWF0Mi5yb3RhdGUoYW50aWFsaWFzaW5nTWF0cml4LCBhbnRpYWxpYXNpbmdNYXRyaXgsIHBhaW50ZXIudHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBsb25nZXIgdGhlIHJlYWwgd29ybGQgZGlzdGFuY2UgaXMgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuXG4gICAgLy8gdGhhbiBhdCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uXG4gICAgdmFyIHRvcGVkZ2VsZW5ndGggPSBNYXRoLnNxcnQodHIuaGVpZ2h0ICogdHIuaGVpZ2h0IC8gNCAgKiAoMSArIHRyLmFsdGl0dWRlICogdHIuYWx0aXR1ZGUpKTtcbiAgICB2YXIgeCA9IHRyLmhlaWdodCAvIDIgKiBNYXRoLnRhbih0ci5fcGl0Y2gpO1xuICAgIHZhciBleHRyYSA9ICh0b3BlZGdlbGVuZ3RoICsgeCkgLyB0b3BlZGdlbGVuZ3RoIC0gMTtcblxuICAgIC8vIGhvdyBtdWNoIHRoZSB0aWxlIGlzIG92ZXJzY2FsZWQgYnlcbiAgICB2YXIgb3ZlcnNjYWxpbmcgPSB0aWxlLnRpbGVTaXplIC8gcGFpbnRlci50cmFuc2Zvcm0udGlsZVNpemU7XG5cbiAgICB2YXIgc2hhZGVyO1xuXG5cbiAgICB2YXIgZGFzaGFycmF5ID0gbGF5ZXIucGFpbnRbJ2xpbmUtZGFzaGFycmF5J107XG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2xpbmUtaW1hZ2UnXTtcblxuICAgIGlmIChkYXNoYXJyYXkpIHtcblxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmxpbmVzZGZwYXR0ZXJuU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuXG4gICAgICAgIHZhciBwb3NBID0gcGFpbnRlci5saW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkuZnJvbSwgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgdmFyIHBvc0IgPSBwYWludGVyLmxpbmVBdGxhcy5nZXREYXNoKGRhc2hhcnJheS50bywgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgcGFpbnRlci5saW5lQXRsYXMuYmluZChnbCk7XG5cbiAgICAgICAgdmFyIHBhdHRlcm5yYXRpbyA9IE1hdGgucG93KDIsIE1hdGguZmxvb3IoTWF0aC5sb2cocGFpbnRlci50cmFuc2Zvcm0uc2NhbGUpIC8gTWF0aC5MTjIpIC0gdGlsZS5jb29yZC56KSAvIDggKiBvdmVyc2NhbGluZztcbiAgICAgICAgdmFyIHNjYWxlQSA9IFtwYXR0ZXJucmF0aW8gLyBwb3NBLndpZHRoIC8gZGFzaGFycmF5LmZyb21TY2FsZSwgLXBvc0EuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUEgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkuZnJvbVNjYWxlICogcG9zQS53aWR0aCAqIDI1NiAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyO1xuICAgICAgICB2YXIgc2NhbGVCID0gW3BhdHRlcm5yYXRpbyAvIHBvc0Iud2lkdGggLyBkYXNoYXJyYXkudG9TY2FsZSwgLXBvc0IuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUIgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkudG9TY2FsZSAqIHBvc0Iud2lkdGggKiAyNTYgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pIC8gMjtcblxuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5zY2FsZV9hLCBzY2FsZUEpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfdGV4X3lfYSwgcG9zQS55KTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuc2NhbGVfYiwgc2NhbGVCKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3RleF95X2IsIHBvc0IueSk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NkZmdhbW1hLCBNYXRoLm1heChnYW1tYUEsIGdhbW1hQikpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfbWl4LCBkYXNoYXJyYXkudCk7XG5cbiAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgIHZhciBpbWFnZVBvc0EgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpO1xuICAgICAgICB2YXIgaW1hZ2VQb3NCID0gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSk7XG4gICAgICAgIGlmICghaW1hZ2VQb3NBIHx8ICFpbWFnZVBvc0IpIHJldHVybjtcbiAgICAgICAgdmFyIGZhY3RvciA9IHRpbGUudGlsZUV4dGVudCAvIHRpbGUudGlsZVNpemUgLyBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSAtIHRpbGUuY29vcmQueikgKiBvdmVyc2NhbGluZztcblxuICAgICAgICBwYWludGVyLnNwcml0ZUF0bGFzLmJpbmQoZ2wsIHRydWUpO1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIubGluZXBhdHRlcm5TaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHZ0eE1hdHJpeCwgdGlsZS5leE1hdHJpeCk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3JhdGlvLCByYXRpbyk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYSwgW2ltYWdlUG9zQS5zaXplWzBdICogZmFjdG9yICogaW1hZ2UuZnJvbVNjYWxlLCBpbWFnZVBvc0Iuc2l6ZVsxXSBdKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYiwgW2ltYWdlUG9zQi5zaXplWzBdICogZmFjdG9yICogaW1hZ2UudG9TY2FsZSwgaW1hZ2VQb3NCLnNpemVbMV0gXSk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZSwgaW1hZ2UudCk7XG5cbiAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX29wYWNpdHkpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWIxZihzaGFkZXIuYV9vcGFjaXR5LCBsYXllci5wYWludFsnbGluZS1vcGFjaXR5J10pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5saW5lU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZXh0cmEsIGV4dHJhKTtcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDJmdihzaGFkZXIudV9hbnRpYWxpYXNpbmdtYXRyaXgsIGZhbHNlLCBhbnRpYWxpYXNpbmdNYXRyaXgpO1xuICAgIH1cblxuICAgIC8vIGxpbmVwYXR0ZXJuIGRvZXMgbm90IGhhdmUgYSBjb2xvciBhdHRyaWJ1dGVcbiAgICBpZiAoc2hhZGVyLmFfY29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfY29sb3IpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWI0ZnYoc2hhZGVyLmFfY29sb3IsIGNvbG9yKTtcbiAgICB9XG5cbiAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfbGluZXdpZHRoKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWIyZihzaGFkZXIuYV9saW5ld2lkdGgsIG91dHNldCwgaW5zZXQpO1xuXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX2JsdXIpO1xuICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2JsdXIsIGJsdXIpO1xuXG4gICAgdmFyIHZlcnRleCA9IHRpbGUuYnVmZmVycy5saW5lVmVydGV4O1xuICAgIHZlcnRleC5iaW5kKGdsKTtcbiAgICB2YXIgZWxlbWVudCA9IHRpbGUuYnVmZmVycy5saW5lRWxlbWVudDtcbiAgICBlbGVtZW50LmJpbmQoZ2wpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tpXTtcbiAgICAgICAgdmFyIHZ0eE9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDgsIHZ0eE9mZnNldCArIDApO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGEsIDQsIGdsLkJZVEUsIGZhbHNlLCA4LCB2dHhPZmZzZXQgKyA0KTtcblxuICAgICAgICB2YXIgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgdmFyIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnQuaXRlbVNpemU7XG4gICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3UmFzdGVyO1xuXG5mdW5jdGlvbiBkcmF3UmFzdGVyKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgdmFyIHNoYWRlciA9IHBhaW50ZXIucmFzdGVyU2hhZGVyO1xuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG5cbiAgICAvLyBjb2xvciBwYXJhbWV0ZXJzXG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2JyaWdodG5lc3NfbG93LCBsYXllci5wYWludFsncmFzdGVyLWJyaWdodG5lc3MtbWluJ10pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9icmlnaHRuZXNzX2hpZ2gsIGxheWVyLnBhaW50WydyYXN0ZXItYnJpZ2h0bmVzcy1tYXgnXSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NhdHVyYXRpb25fZmFjdG9yLCBzYXR1cmF0aW9uRmFjdG9yKGxheWVyLnBhaW50WydyYXN0ZXItc2F0dXJhdGlvbiddKSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2NvbnRyYXN0X2ZhY3RvciwgY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnRbJ3Jhc3Rlci1jb250cmFzdCddKSk7XG4gICAgZ2wudW5pZm9ybTNmdihzaGFkZXIudV9zcGluX3dlaWdodHMsIHNwaW5XZWlnaHRzKGxheWVyLnBhaW50WydyYXN0ZXItaHVlLXJvdGF0ZSddKSk7XG5cbiAgICB2YXIgcGFyZW50VGlsZSA9IHRpbGUuc291cmNlICYmIHRpbGUuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQodGlsZS5jb29yZCwgMCwge30pLFxuICAgICAgICBvcGFjaXRpZXMgPSBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHBhaW50ZXIudHJhbnNmb3JtKTtcblxuICAgIHZhciBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG5cbiAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgcGFyZW50VGlsZS50ZXh0dXJlKTtcblxuICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS5jb29yZC56IC0gdGlsZS5jb29yZC56KTtcbiAgICAgICAgcGFyZW50VEwgPSBbdGlsZS5jb29yZC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUuY29vcmQueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcGFjaXRpZXNbMV0gPSAwO1xuICAgIH1cblxuICAgIC8vIGNyb3NzLWZhZGUgcGFyYW1ldGVyc1xuICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfdGxfcGFyZW50LCBwYXJlbnRUTCB8fCBbMCwgMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9zY2FsZV9wYXJlbnQsIHBhcmVudFNjYWxlQnkgfHwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2J1ZmZlcl9zY2FsZSwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X29wYWNpdHkwLCBvcGFjaXRpZXNbMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5MSwgb3BhY2l0aWVzWzFdKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UwLCAwKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UxLCAxKTtcblxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aWxlLmJvdW5kc0J1ZmZlciB8fCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIpO1xuXG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsICAgICAgICAgMiwgZ2wuU0hPUlQsIGZhbHNlLCA4LCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3RleHR1cmVfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDgsIDQpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xuXG4gICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIHNwaW5XZWlnaHRzKGFuZ2xlKSB7XG4gICAgYW5nbGUgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICB2YXIgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHRyYW5zZm9ybSkge1xuICAgIGlmICghdGlsZS5zb3VyY2UpIHJldHVybiBbMSwgMF07XG5cbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICB2YXIgZmFkZUR1cmF0aW9uID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJ107XG4gICAgdmFyIHNpbmNlVGlsZSA9IChub3cgLSB0aWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb247XG4gICAgdmFyIHNpbmNlUGFyZW50ID0gcGFyZW50VGlsZSA/IChub3cgLSBwYXJlbnRUaWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb24gOiAtMTtcblxuICAgIHZhciBpZGVhbFogPSB0aWxlLnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbCh0cmFuc2Zvcm0pO1xuICAgIHZhciBwYXJlbnRGdXJ0aGVyID0gcGFyZW50VGlsZSA/IE1hdGguYWJzKHBhcmVudFRpbGUuY29vcmQueiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLmNvb3JkLnogLSBpZGVhbFopIDogZmFsc2U7XG5cbiAgICB2YXIgb3BhY2l0eSA9IFtdO1xuICAgIGlmICghcGFyZW50VGlsZSB8fCBwYXJlbnRGdXJ0aGVyKSB7XG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXJcbiAgICAgICAgb3BhY2l0eVswXSA9IHV0aWwuY2xhbXAoc2luY2VUaWxlLCAwLCAxKTtcbiAgICAgICAgb3BhY2l0eVsxXSA9IDEgLSBvcGFjaXR5WzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyB5b3VuZ2VyLCB6b29taW5nIG91dFxuICAgICAgICBvcGFjaXR5WzBdID0gdXRpbC5jbGFtcCgxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuICAgICAgICBvcGFjaXR5WzFdID0gMSAtIG9wYWNpdHlbMF07XG4gICAgfVxuXG4gICAgdmFyIG9wID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1vcGFjaXR5J107XG4gICAgb3BhY2l0eVswXSAqPSBvcDtcbiAgICBvcGFjaXR5WzFdICo9IG9wO1xuXG4gICAgcmV0dXJuIG9wYWNpdHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG5cbnZhciBkcmF3Q29sbGlzaW9uRGVidWcgPSByZXF1aXJlKCcuL2RyYXdfY29sbGlzaW9uX2RlYnVnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd1N5bWJvbHM7XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2xzKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICAvLyBObyBkYXRhXG4gICAgaWYgKCF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGRyYXdBY3Jvc3NFZGdlcyA9ICEobGF5ZXIubGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXllci5sYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgIGxheWVyLmxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10gfHwgbGF5ZXIubGF5b3V0WydpY29uLWlnbm9yZS1wbGFjZW1lbnQnXSk7XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgaWYgKGRyYXdBY3Jvc3NFZGdlcykge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBMYXllcnMgd2l0aCBmZWF0dXJlcyB0aGF0IG1heSBiZSBkcmF3biBvdmVybGFwcGluZyBhcmVuJ3QgY2xpcHBlZC4gVGhlc2VcbiAgICAgICAgLy8gbGF5ZXJzIGFyZSBzb3J0ZWQgaW4gdGhlIHkgZGlyZWN0aW9uLCBhbmQgdG8gZHJhdyB0aGUgY29ycmVjdCBvcmRlcmluZyBuZWFyXG4gICAgICAgIC8vIHRpbGUgZWRnZXMgdGhlIGljb25zIGFyZSBpbmNsdWRlZCBpbiBib3RoIHRpbGVzIGFuZCBjbGlwcGVkIHdoZW4gZHJhd2luZy5cbiAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50R3JvdXBzLnRleHQuZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBkcmF3U3ltYm9sKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUsIGVsZW1lbnRHcm91cHMudGV4dCwgJ3RleHQnLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRHcm91cHMuaWNvbi5ncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3Vwcy5pY29uLCAnaWNvbicsIGVsZW1lbnRHcm91cHMuc2RmSWNvbnMpO1xuICAgIH1cblxuICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKTtcblxuICAgIGlmIChkcmF3QWNyb3NzRWRnZXMpIHtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFNpemVzID0ge1xuICAgIGljb246IDEsXG4gICAgdGV4dDogMjRcbn07XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3VwcywgcHJlZml4LCBzZGYpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgcG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVNYXRyaXgocG9zTWF0cml4LCB0aWxlLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZS1hbmNob3InXSk7XG5cbiAgICB2YXIgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICB2YXIgYWxpZ25lZFdpdGhNYXAgPSBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCc7XG4gICAgdmFyIHNrZXdlZCA9IGFsaWduZWRXaXRoTWFwO1xuICAgIHZhciBleE1hdHJpeCwgcywgZ2FtbWFTY2FsZTtcblxuICAgIGlmIChza2V3ZWQpIHtcbiAgICAgICAgZXhNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBzID0gdGlsZS50aWxlRXh0ZW50IC8gdGlsZS50aWxlU2l6ZSAvIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSB0aWxlLmNvb3JkLnopO1xuICAgICAgICBnYW1tYVNjYWxlID0gMSAvIE1hdGguY29zKHRyLl9waXRjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXhNYXRyaXggPSBtYXQ0LmNsb25lKHRpbGUuZXhNYXRyaXgpO1xuICAgICAgICBzID0gcGFpbnRlci50cmFuc2Zvcm0uYWx0aXR1ZGU7XG4gICAgICAgIGdhbW1hU2NhbGUgPSAxO1xuICAgIH1cbiAgICBtYXQ0LnNjYWxlKGV4TWF0cml4LCBleE1hdHJpeCwgW3MsIHMsIDFdKTtcblxuICAgIC8vIElmIGxheWVyLnBhaW50LnNpemUgPiBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1tYXgtc2l6ZSddIHRoZW4gbGFiZWxzIG1heSBjb2xsaWRlXG4gICAgdmFyIGZvbnRTaXplID0gbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1zaXplJ107XG4gICAgdmFyIGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gZGVmYXVsdFNpemVzW3ByZWZpeF07XG4gICAgbWF0NC5zY2FsZShleE1hdHJpeCwgZXhNYXRyaXgsIFsgZm9udFNjYWxlLCBmb250U2NhbGUsIDEgXSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggbG9uZ2VyIHRoZSByZWFsIHdvcmxkIGRpc3RhbmNlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlblxuICAgIC8vIHRoYW4gYXQgdGhlIG1pZGRsZSBvZiB0aGUgc2NyZWVuLlxuICAgIHZhciB0b3BlZGdlbGVuZ3RoID0gTWF0aC5zcXJ0KHRyLmhlaWdodCAqIHRyLmhlaWdodCAvIDQgICogKDEgKyB0ci5hbHRpdHVkZSAqIHRyLmFsdGl0dWRlKSk7XG4gICAgdmFyIHggPSB0ci5oZWlnaHQgLyAyICogTWF0aC50YW4odHIuX3BpdGNoKTtcbiAgICB2YXIgZXh0cmEgPSAodG9wZWRnZWxlbmd0aCArIHgpIC8gdG9wZWRnZWxlbmd0aCAtIDE7XG5cbiAgICB2YXIgdGV4dCA9IHByZWZpeCA9PT0gJ3RleHQnO1xuICAgIHZhciBzaGFkZXIsIHZlcnRleCwgZWxlbWVudHMsIHRleHNpemU7XG5cbiAgICBpZiAoIXRleHQgJiYgIXBhaW50ZXIuc3R5bGUuc3ByaXRlLmxvYWRlZCgpKVxuICAgICAgICByZXR1cm47XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcblxuICAgIGlmIChzZGYpIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5zZGZTaGFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5pY29uU2hhZGVyO1xuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHBhaW50ZXIuZ2x5cGhBdGxhcy51cGRhdGVUZXh0dXJlKGdsKTtcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmdseXBoVmVydGV4O1xuICAgICAgICBlbGVtZW50cyA9IHRpbGUuYnVmZmVycy5nbHlwaEVsZW1lbnQ7XG4gICAgICAgIHRleHNpemUgPSBbcGFpbnRlci5nbHlwaEF0bGFzLndpZHRoIC8gNCwgcGFpbnRlci5nbHlwaEF0bGFzLmhlaWdodCAvIDRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgYWxpZ25lZFdpdGhNYXAgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8XG4gICAgICAgICAgICBwYWludGVyLm9wdGlvbnMuem9vbWluZyB8fCBmb250U2NhbGUgIT09IDEgfHwgc2RmIHx8IHBhaW50ZXIudHJhbnNmb3JtLnBpdGNoKTtcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmljb25WZXJ0ZXg7XG4gICAgICAgIGVsZW1lbnRzID0gdGlsZS5idWZmZXJzLmljb25FbGVtZW50O1xuICAgICAgICB0ZXhzaXplID0gW3BhaW50ZXIuc3ByaXRlQXRsYXMud2lkdGggLyA0LCBwYWludGVyLnNwcml0ZUF0bGFzLmhlaWdodCAvIDRdO1xuICAgIH1cblxuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCwgZXhNYXRyaXgpO1xuICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV90ZXh0dXJlLCAwKTtcbiAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3RleHNpemUsIHRleHNpemUpO1xuICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV9za2V3ZWQsIHNrZXdlZCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2V4dHJhLCBleHRyYSk7XG5cbiAgICAvLyBhZGp1c3QgbWluL21heCB6b29tcyBmb3IgdmFyaWFibGUgZm9udCBzaWVzXG4gICAgdmFyIHpvb21BZGp1c3QgPSBNYXRoLmxvZyhmb250U2l6ZSAvIGxheWVyLmxheW91dFtwcmVmaXggKyAnLW1heC1zaXplJ10pIC8gTWF0aC5MTjIgfHwgMDtcblxuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV96b29tLCAocGFpbnRlci50cmFuc2Zvcm0uem9vbSAtIHpvb21BZGp1c3QpICogMTApOyAvLyBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgIHZhciBmID0gcGFpbnRlci5mcmFtZUhpc3RvcnkuZ2V0RmFkZVByb3BlcnRpZXMoMzAwKTtcbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZWRpc3QsIGYuZmFkZWRpc3QgKiAxMCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21pbmZhZGV6b29tLCBNYXRoLmZsb29yKGYubWluZmFkZXpvb20gKiAxMCkpO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9tYXhmYWRlem9vbSwgTWF0aC5mbG9vcihmLm1heGZhZGV6b29tICogMTApKTtcbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZXpvb20sIChwYWludGVyLnRyYW5zZm9ybS56b29tICsgZi5idW1wKSAqIDEwKTtcblxuICAgIHZhciBncm91cCwgb2Zmc2V0LCBjb3VudCwgZWxlbWVudE9mZnNldDtcblxuICAgIGVsZW1lbnRzLmJpbmQoZ2wpO1xuXG4gICAgaWYgKHNkZikge1xuICAgICAgICB2YXIgc2RmUHggPSA4O1xuICAgICAgICB2YXIgYmx1ck9mZnNldCA9IDEuMTk7XG4gICAgICAgIHZhciBoYWxvT2Zmc2V0ID0gNjtcbiAgICAgICAgdmFyIGdhbW1hID0gMC4xMDUgKiBkZWZhdWx0U2l6ZXNbcHJlZml4XSAvIGZvbnRTaXplIC8gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9nYW1tYSk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2dhbW1hLCBnYW1tYSAqIGdhbW1hU2NhbGUpO1xuXG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9jb2xvcik7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1jb2xvciddKTtcblxuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfYnVmZmVyKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliMWYoc2hhZGVyLmFfYnVmZmVyLCAoMjU2IC0gNjQpIC8gMjU2KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRHcm91cHMuZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBncm91cCA9IGVsZW1lbnRHcm91cHMuZ3JvdXBzW2ldO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZ3JvdXAudmVydGV4U3RhcnRJbmRleCAqIHZlcnRleC5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZlcnRleC5iaW5kKGdsLCBzaGFkZXIsIG9mZnNldCk7XG5cbiAgICAgICAgICAgIGNvdW50ID0gZ3JvdXAuZWxlbWVudExlbmd0aCAqIDM7XG4gICAgICAgICAgICBlbGVtZW50T2Zmc2V0ID0gZ3JvdXAuZWxlbWVudFN0YXJ0SW5kZXggKiBlbGVtZW50cy5pdGVtU2l6ZTtcbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWNvbG9yJ10pIHtcblxuICAgICAgICAgICAgLy8gdmVydGV4IGF0dHJpYiBhcnJheXMgZGlzYWJsZWQgYWJvdmVcbiAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWNvbG9yJ10pO1xuICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliMWYoc2hhZGVyLmFfYnVmZmVyLCAoaGFsb09mZnNldCAtIGxheWVyLnBhaW50W3ByZWZpeCArICctaGFsby13aWR0aCddIC8gZm9udFNjYWxlKSAvIHNkZlB4KTtcbiAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2dhbW1hLCAobGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWJsdXInXSAqIGJsdXJPZmZzZXQgLyBmb250U2NhbGUgLyBzZGZQeCArIGdhbW1hKSAqIGdhbW1hU2NhbGUpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZW1lbnRHcm91cHMuZ3JvdXBzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tqXTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4ICogdmVydGV4Lml0ZW1TaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleC5iaW5kKGdsLCBzaGFkZXIsIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICBjb3VudCA9IGdyb3VwLmVsZW1lbnRMZW5ndGggKiAzO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfb3BhY2l0eSk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX29wYWNpdHksIGxheWVyLnBhaW50WydpY29uLW9wYWNpdHknXSk7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1trXTtcbiAgICAgICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgICAgICB2ZXJ0ZXguYmluZChnbCwgc2hhZGVyLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICBjb3VudCA9IGdyb3VwLmVsZW1lbnRMZW5ndGggKiAzO1xuICAgICAgICAgICAgZWxlbWVudE9mZnNldCA9IGdyb3VwLmVsZW1lbnRTdGFydEluZGV4ICogZWxlbWVudHMuaXRlbVNpemU7XG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIG1hdDQgPSByZXF1aXJlKCdnbC1tYXRyaXgnKS5tYXQ0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdWZXJ0aWNlcztcblxuZnVuY3Rpb24gZHJhd1ZlcnRpY2VzKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgaWYgKCF0aWxlIHx8ICF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgLy8gQmxlbmQgdG8gdGhlIGZyb250LCBub3QgdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAvLyBEcmF3IGFsbCBidWZmZXJzXG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdmaWxsJykge1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5maWxsVmVydGV4LCBlbGVtZW50R3JvdXBzLmdyb3VwcywgcG9zTWF0cml4LCA0KTtcbiAgICB9IGVsc2UgaWYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGRyYXdQb2ludHModGlsZS5idWZmZXJzLmljb25WZXJ0ZXgsIGVsZW1lbnRHcm91cHMuaWNvbi5ncm91cHMsIHBvc01hdHJpeCwgMTYpO1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5nbHlwaFZlcnRleCwgZWxlbWVudEdyb3Vwcy50ZXh0Lmdyb3VwcywgcG9zTWF0cml4LCAxNik7XG4gICAgfSBlbHNlIGlmIChsYXllci50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgdmFyIG5ld1Bvc01hdHJpeCA9IG1hdDQuY2xvbmUocG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC5zY2FsZShuZXdQb3NNYXRyaXgsIG5ld1Bvc01hdHJpeCwgWzAuNSwgMC41LCAxXSk7XG4gICAgICAgIGRyYXdQb2ludHModGlsZS5idWZmZXJzLmxpbmVWZXJ0ZXgsIGVsZW1lbnRHcm91cHMuZ3JvdXBzLCBuZXdQb3NNYXRyaXgsIDgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRyYXdQb2ludHModmVydGV4LCBncm91cHMsIG1hdHJpeCwgc3RyaWRlKSB7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihwYWludGVyLmRvdFNoYWRlciwgbWF0cml4KTtcblxuICAgICAgICBnbC51bmlmb3JtMWYocGFpbnRlci5kb3RTaGFkZXIudV9zaXplLCA0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHBhaW50ZXIuZG90U2hhZGVyLnVfYmx1ciwgMC4yNSk7XG4gICAgICAgIGdsLnVuaWZvcm00ZnYocGFpbnRlci5kb3RTaGFkZXIudV9jb2xvciwgWzAuMSwgMCwgMCwgMC4xXSk7XG5cbiAgICAgICAgdmVydGV4LmJpbmQoZ2wsIHBhaW50ZXIuZG90U2hhZGVyLCAwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgICAgIHZhciBiZWdpbiA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBncm91cC52ZXJ0ZXhMZW5ndGg7XG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIuZG90U2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgMCk7XG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgYmVnaW4sIGNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldmVydCBibGVuZGluZyBtb2RlIHRvIGJsZW5kIHRvIHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLCBnbC5PTkUpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lSGlzdG9yeTtcblxuZnVuY3Rpb24gRnJhbWVIaXN0b3J5KCkge1xuICAgIHRoaXMuZnJhbWVIaXN0b3J5ID0gW107XG59XG5cbkZyYW1lSGlzdG9yeS5wcm90b3R5cGUuZ2V0RmFkZVByb3BlcnRpZXMgPSBmdW5jdGlvbihkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSBkdXJhdGlvbiA9IDMwMDtcbiAgICB2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuXG4gICAgLy8gUmVtb3ZlIGZyYW1lcyB1bnRpbCBvbmx5IG9uZSBpcyBvdXRzaWRlIHRoZSBkdXJhdGlvbiwgb3IgdW50aWwgdGhlcmUgYXJlIG9ubHkgdGhyZWVcbiAgICB3aGlsZSAodGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoID4gMyAmJiB0aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lICsgZHVyYXRpb24gPCBjdXJyZW50VGltZSkge1xuICAgICAgICB0aGlzLmZyYW1lSGlzdG9yeS5zaGlmdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lICsgZHVyYXRpb24gPCBjdXJyZW50VGltZSkge1xuICAgICAgICB0aGlzLmZyYW1lSGlzdG9yeVswXS56ID0gdGhpcy5mcmFtZUhpc3RvcnlbMV0uejtcbiAgICB9XG5cbiAgICB2YXIgZnJhbWVMZW4gPSB0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGg7XG4gICAgaWYgKGZyYW1lTGVuIDwgMykgY29uc29sZS53YXJuKCd0aGVyZSBzaG91bGQgbmV2ZXIgYmUgbGVzcyB0aGFuIHRocmVlIGZyYW1lcyBpbiB0aGUgaGlzdG9yeScpO1xuXG4gICAgLy8gRmluZCB0aGUgcmFuZ2Ugb2Ygem9vbSBsZXZlbHMgd2Ugd2FudCB0byBmYWRlIGJldHdlZW5cbiAgICB2YXIgc3RhcnRpbmdaID0gdGhpcy5mcmFtZUhpc3RvcnlbMF0ueixcbiAgICAgICAgbGFzdEZyYW1lID0gdGhpcy5mcmFtZUhpc3RvcnlbZnJhbWVMZW4gLSAxXSxcbiAgICAgICAgZW5kaW5nWiA9IGxhc3RGcmFtZS56LFxuICAgICAgICBsb3daID0gTWF0aC5taW4oc3RhcnRpbmdaLCBlbmRpbmdaKSxcbiAgICAgICAgaGlnaFogPSBNYXRoLm1heChzdGFydGluZ1osIGVuZGluZ1opO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBzcGVlZCBvZiB6b29taW5nLCBhbmQgaG93IGZhciBpdCB3b3VsZCB6b29tIGluIHRlcm1zIG9mIHpvb20gbGV2ZWxzIGluIG9uZSBkdXJhdGlvblxuICAgIHZhciB6b29tRGlmZiA9IGxhc3RGcmFtZS56IC0gdGhpcy5mcmFtZUhpc3RvcnlbMV0ueixcbiAgICAgICAgdGltZURpZmYgPSBsYXN0RnJhbWUudGltZSAtIHRoaXMuZnJhbWVIaXN0b3J5WzFdLnRpbWU7XG4gICAgdmFyIGZhZGVkaXN0ID0gem9vbURpZmYgLyAodGltZURpZmYgLyBkdXJhdGlvbik7XG5cbiAgICBpZiAoaXNOYU4oZmFkZWRpc3QpKSBjb25zb2xlLndhcm4oJ2ZhZGVkaXN0IHNob3VsZCBuZXZlciBiZSBOYU4nKTtcblxuICAgIC8vIEF0IGVuZCBvZiBhIHpvb20gd2hlbiB0aGUgem9vbSBzdG9wcyBjaGFuZ2luZyBjb250aW51ZSBwcmV0ZW5kaW5nIHRvIHpvb20gYXQgdGhhdCBzcGVlZFxuICAgIC8vIGJ1bXAgaXMgaG93IG11Y2ggZmFydGhlciBpdCB3b3VsZCBoYXZlIGJlZW4gaWYgaXQgaGFkIGNvbnRpbnVlZCB6b29taW5nIGF0IHRoZSBzYW1lIHJhdGVcbiAgICB2YXIgYnVtcCA9IChjdXJyZW50VGltZSAtIGxhc3RGcmFtZS50aW1lKSAvIGR1cmF0aW9uICogZmFkZWRpc3Q7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmYWRlZGlzdDogZmFkZWRpc3QsXG4gICAgICAgIG1pbmZhZGV6b29tOiBsb3daLFxuICAgICAgICBtYXhmYWRlem9vbTogaGlnaFosXG4gICAgICAgIGJ1bXA6IGJ1bXBcbiAgICB9O1xufTtcblxuLy8gUmVjb3JkIGZyYW1lIGhpc3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIGZhZGluZyBwYXJhbXNcbkZyYW1lSGlzdG9yeS5wcm90b3R5cGUucmVjb3JkID0gZnVuY3Rpb24oem9vbSkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cbiAgICAvLyBmaXJzdCBmcmFtZSBldmVyXG4gICAgaWYgKCF0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnkucHVzaCh7dGltZTogMCwgejogem9vbSB9LCB7dGltZTogMCwgejogem9vbSB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoID09PSAyIHx8IHRoaXMuZnJhbWVIaXN0b3J5W3RoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aCAtIDFdLnogIT09IHpvb20pIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnkucHVzaCh7XG4gICAgICAgICAgICB0aW1lOiBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIHo6IHpvb21cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNoYWRlcnMgPSByZXF1aXJlKCcuL3NoYWRlcnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIHZhciBvcmlnTGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGgsXG4gICAgICAgIGxpbmVXaWR0aFJhbmdlID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoY29udGV4dC5BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UpO1xuXG4gICAgY29udGV4dC5saW5lV2lkdGggPSBmdW5jdGlvbih3aWR0aCkge1xuICAgICAgICBvcmlnTGluZVdpZHRoLmNhbGwoY29udGV4dCwgdXRpbC5jbGFtcCh3aWR0aCwgbGluZVdpZHRoUmFuZ2VbMF0sIGxpbmVXaWR0aFJhbmdlWzFdKSk7XG4gICAgfTtcblxuICAgIGNvbnRleHQuZ2V0U2hhZGVyID0gZnVuY3Rpb24obmFtZSwgdHlwZSkge1xuICAgICAgICB2YXIga2luZCA9IHR5cGUgPT09IHRoaXMuRlJBR01FTlRfU0hBREVSID8gJ2ZyYWdtZW50JyA6ICd2ZXJ0ZXgnO1xuICAgICAgICBpZiAoIXNoYWRlcnNbbmFtZV0gfHwgIXNoYWRlcnNbbmFtZV1ba2luZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHNoYWRlciBcIiArIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNoYWRlciA9IHRoaXMuY3JlYXRlU2hhZGVyKHR5cGUpO1xuICAgICAgICB2YXIgc2hhZGVyU291cmNlID0gc2hhZGVyc1tuYW1lXVtraW5kXTtcblxuICAgICAgICBpZiAodHlwZW9mIG9yaWVudGF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gb25seSB1c2UgaGlnaHAgcHJlY2lzaW9uIG9uIG1vYmlsZSBicm93c2Vyc1xuICAgICAgICAgICAgc2hhZGVyU291cmNlID0gc2hhZGVyU291cmNlLnJlcGxhY2UoLyBoaWdocCAvZywgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhZGVyU291cmNlKHNoYWRlciwgc2hhZGVyU291cmNlKTtcbiAgICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gICAgICAgIGlmICghdGhpcy5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCB0aGlzLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hhZGVyO1xuICAgIH07XG5cbiAgICBjb250ZXh0LmluaXRpYWxpemVTaGFkZXIgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB1bmlmb3Jtcykge1xuICAgICAgICB2YXIgc2hhZGVyID0ge1xuICAgICAgICAgICAgcHJvZ3JhbTogdGhpcy5jcmVhdGVQcm9ncmFtKCksXG4gICAgICAgICAgICBmcmFnbWVudDogdGhpcy5nZXRTaGFkZXIobmFtZSwgdGhpcy5GUkFHTUVOVF9TSEFERVIpLFxuICAgICAgICAgICAgdmVydGV4OiB0aGlzLmdldFNoYWRlcihuYW1lLCB0aGlzLlZFUlRFWF9TSEFERVIpLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hdHRhY2hTaGFkZXIoc2hhZGVyLnByb2dyYW0sIHNoYWRlci52ZXJ0ZXgpO1xuICAgICAgICB0aGlzLmF0dGFjaFNoYWRlcihzaGFkZXIucHJvZ3JhbSwgc2hhZGVyLmZyYWdtZW50KTtcblxuICAgICAgICAvLyBEaXNhYmxpbmcgYXR0cmliIGxvY2F0aW9uIDAgY2F1c2VzIHdlaXJkIGJlaGF2aW91ci4gVG8gYXZvaWQgdGhlIHByb2JsZW0sIHdlIGFzc2lnblxuICAgICAgICAvLyAnYV9wb3MnIHRvIGF0dHJpYiBsb2NhdGlvbiAwIG1ha2luZyB0aGUgYXNzdW1wdGlvbnMgdGhhdFxuICAgICAgICAvL1xuICAgICAgICAvLyAgIC0gYGFfcG9zYCBpcyBuZXZlciBkaXNhYmxlZFxuICAgICAgICAvLyAgIC0gZXZlcnkgc2hhZGVyIGhhcyBhbiBgYV9wb3NgIGF0dHJpYnV0ZVxuICAgICAgICAvL1xuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYkdML1dlYkdMX2Jlc3RfcHJhY3RpY2VzXG4gICAgICAgIHRoaXMuYmluZEF0dHJpYkxvY2F0aW9uKHNoYWRlci5wcm9ncmFtLCAwLCAnYV9wb3MnKTtcblxuICAgICAgICB0aGlzLmxpbmtQcm9ncmFtKHNoYWRlci5wcm9ncmFtKTtcblxuICAgICAgICBpZiAoIXRoaXMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihzaGFkZXIucHJvZ3JhbSwgdGhpcy5MSU5LX1NUQVRVUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5nZXRQcm9ncmFtSW5mb0xvZyhzaGFkZXIucHJvZ3JhbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2hhZGVyW2F0dHJpYnV0ZXNbaV1dID0gdGhpcy5nZXRBdHRyaWJMb2NhdGlvbihzaGFkZXIucHJvZ3JhbSwgYXR0cmlidXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgc2hhZGVyLmF0dHJpYnV0ZXMucHVzaChzaGFkZXJbYXR0cmlidXRlc1tpXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB1bmlmb3Jtcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHNoYWRlclt1bmlmb3Jtc1trXV0gPSB0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihzaGFkZXIucHJvZ3JhbSwgdW5pZm9ybXNba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoYWRlcjtcbiAgICB9O1xuXG4gICAgLy8gU3dpdGNoZXMgdG8gYSBkaWZmZXJlbnQgc2hhZGVyIHByb2dyYW0uXG4gICAgY29udGV4dC5zd2l0Y2hTaGFkZXIgPSBmdW5jdGlvbihzaGFkZXIsIHBvc01hdHJpeCwgZXhNYXRyaXgpIHtcbiAgICAgICAgaWYgKCFwb3NNYXRyaXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJ3Bvc01hdHJpeCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2hhZGVyICE9PSBzaGFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXNlUHJvZ3JhbShzaGFkZXIucHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYWxsIGF0dHJpYnV0ZSBhcnJheXMgdXNlZCBieSB0aGUgcHJldmlvdXMgc2hhZGVyIGFuZCBlbmFibGUgYWxsIHRoZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIC8vIGFycmF5cyB1c2VkIGJ5IHRoZSBuZXh0IHNoYWRlci4gSWRlYWxseSB3ZSB3b3VsZCBkbyBhIGJldHRlciBqb2IgZGlmZmluZyB0aGVzZSB0b1xuICAgICAgICAgICAgLy8gbWluaW1pemUgb3BlcmF0aW9ucyAoYXMgd2UgZGlkIGluIHByZXZpb3VzbHkpIGJ1dCBpdCBpcyBoYXJkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGVcbiAgICAgICAgICAgIC8vIGluIHNwYWdoZXR0aSBzaGFkZXIgYm9pbGVycGxhdGUgY29kZSBhbmQgaGFyZCB0byBkZWJ1ZyB3aGVuIHRoaW5ncyBnbyB3cm9uZy5cbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuY3VycmVudFNoYWRlciA/IHRoaXMuY3VycmVudFNoYWRlci5hdHRyaWJ1dGVzIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZpb3VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocHJldmlvdXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5leHQgPSBzaGFkZXIuYXR0cmlidXRlcztcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobmV4dFtqXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNoYWRlciA9IHNoYWRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWF0cmljZXMgaWYgbmVjZXNzYXJ5LiBOb3RlOiBUaGlzIHJlbGllcyBvbiBvYmplY3QgaWRlbnRpdHkhXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgY2hhbmdpbmcgdGhlIG1hdHJpeCB2YWx1ZXMgd2l0aG91dCB0aGUgYWN0dWFsIG1hdHJpeCBvYmplY3RcbiAgICAgICAgLy8gd2lsbCBGQUlMIHRvIHVwZGF0ZSB0aGUgbWF0cml4IHByb3Blcmx5LlxuICAgICAgICBpZiAoc2hhZGVyLnBvc01hdHJpeCAhPT0gcG9zTWF0cml4KSB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoc2hhZGVyLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcbiAgICAgICAgICAgIHNoYWRlci5wb3NNYXRyaXggPSBwb3NNYXRyaXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4TWF0cml4ICYmIHNoYWRlci5leE1hdHJpeCAhPT0gZXhNYXRyaXggJiYgc2hhZGVyLnVfZXhtYXRyaXgpIHtcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybU1hdHJpeDRmdihzaGFkZXIudV9leG1hdHJpeCwgZmFsc2UsIGV4TWF0cml4KTtcbiAgICAgICAgICAgIHNoYWRlci5leE1hdHJpeCA9IGV4TWF0cml4O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnRleHQudmVydGV4QXR0cmliMmZ2ID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29udGV4dC52ZXJ0ZXhBdHRyaWIyZihhdHRyaWJ1dGUsIHZhbHVlc1swXSwgdmFsdWVzWzFdKTtcbiAgICB9O1xuXG4gICAgY29udGV4dC52ZXJ0ZXhBdHRyaWIzZnYgPSBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVlcykge1xuICAgICAgICBjb250ZXh0LnZlcnRleEF0dHJpYjNmKGF0dHJpYnV0ZSwgdmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7XG4gICAgfTtcblxuICAgIGNvbnRleHQudmVydGV4QXR0cmliNGZ2ID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29udGV4dC52ZXJ0ZXhBdHRyaWI0ZihhdHRyaWJ1dGUsIHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0sIHZhbHVlc1szXSk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb250ZXh0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQXRsYXM7XG5cbi8qKlxuICogTXVjaCBsaWtlIGEgR2x5cGhBdGxhcywgYSBMaW5lQXRsYXMgbGV0cyB1cyByZXVzZSByZW5kZXJlZCBkYXNoZWQgbGluZXNcbiAqIGJ5IHdyaXRpbmcgbWFueSBvZiB0aGVtIHRvIGEgdGV4dHVyZSBhbmQgdGhlbiBmZXRjaGluZyB0aGVpciBwb3NpdGlvbnNcbiAqIHVzaW5nIC5nZXREYXNoLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gTGluZUF0bGFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5uZXh0Um93ID0gMDtcblxuICAgIHRoaXMuYnl0ZXMgPSA0O1xuICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIHRoaXMuYnl0ZXMpO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSB7fTtcbn1cblxuTGluZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGUgPSBmdW5jdGlvbihzcHJpdGUpIHtcbiAgICB0aGlzLnNwcml0ZSA9IHNwcml0ZTtcbn07XG5cbi8qKlxuICogR2V0IG9yIGNyZWF0ZSBhIGRhc2ggbGluZSBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJvdW5kIHdoZXRoZXIgdG8gYWRkIGNpcmNsZSBjYXBzIGluIGJldHdlZW4gZGFzaCBzZWdtZW50c1xuICogQHJldHVybnMge09iamVjdH0gcG9zaXRpb24gb2YgZGFzaCB0ZXh0dXJlIGluIHsgeSwgaGVpZ2h0LCB3aWR0aCB9XG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQXRsYXMucHJvdG90eXBlLmdldERhc2ggPSBmdW5jdGlvbihkYXNoYXJyYXksIHJvdW5kKSB7XG4gICAgdmFyIGtleSA9IGRhc2hhcnJheS5qb2luKFwiLFwiKSArIHJvdW5kO1xuXG4gICAgaWYgKCF0aGlzLnBvc2l0aW9uc1trZXldKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25zW2tleV0gPSB0aGlzLmFkZERhc2goZGFzaGFycmF5LCByb3VuZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uc1trZXldO1xufTtcblxuTGluZUF0bGFzLnByb3RvdHlwZS5hZGREYXNoID0gZnVuY3Rpb24oZGFzaGFycmF5LCByb3VuZCkge1xuXG4gICAgdmFyIG4gPSByb3VuZCA/IDcgOiAwO1xuICAgIHZhciBoZWlnaHQgPSAyICogbiArIDE7XG4gICAgdmFyIG9mZnNldCA9IDEyODtcblxuICAgIGlmICh0aGlzLm5leHRSb3cgKyBoZWlnaHQgPiB0aGlzLmhlaWdodCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0xpbmVBdGxhcyBvdXQgb2Ygc3BhY2UnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGVuZ3RoICs9IGRhc2hhcnJheVtpXTtcbiAgICB9XG5cbiAgICB2YXIgc3RyZXRjaCA9IHRoaXMud2lkdGggLyBsZW5ndGg7XG4gICAgdmFyIGhhbGZXaWR0aCA9IHN0cmV0Y2ggLyAyO1xuXG4gICAgLy8gSWYgZGFzaGFycmF5IGhhcyBhbiBvZGQgbGVuZ3RoLCBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwYXJ0c1xuICAgIC8vIGFyZSBkYXNoZXMgYW5kIHNob3VsZCBiZSBqb2luZWQgc2VhbWxlc3NseS5cbiAgICB2YXIgb2RkTGVuZ3RoID0gZGFzaGFycmF5Lmxlbmd0aCAlIDIgPT09IDE7XG5cbiAgICBmb3IgKHZhciB5ID0gLW47IHkgPD0gbjsgeSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLm5leHRSb3cgKyBuICsgeTtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy53aWR0aCAqIHJvdztcblxuICAgICAgICB2YXIgbGVmdCA9IG9kZExlbmd0aCA/IC1kYXNoYXJyYXlbZGFzaGFycmF5Lmxlbmd0aCAtIDFdIDogMDtcbiAgICAgICAgdmFyIHJpZ2h0ID0gZGFzaGFycmF5WzBdO1xuICAgICAgICB2YXIgcGFydEluZGV4ID0gMTtcblxuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuXG4gICAgICAgICAgICB3aGlsZSAocmlnaHQgPCB4IC8gc3RyZXRjaCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICsgZGFzaGFycmF5W3BhcnRJbmRleF07XG5cbiAgICAgICAgICAgICAgICBpZiAob2RkTGVuZ3RoICYmIHBhcnRJbmRleCA9PT0gZGFzaGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgKz0gZGFzaGFycmF5WzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGlzdExlZnQgPSBNYXRoLmFicyh4IC0gbGVmdCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgdmFyIGRpc3RSaWdodCA9IE1hdGguYWJzKHggLSByaWdodCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgdmFyIGRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgIHZhciBpbnNpZGUgPSAocGFydEluZGV4ICUgMikgPT09IDE7XG4gICAgICAgICAgICB2YXIgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBjaXJjbGUgY2Fwc1xuICAgICAgICAgICAgICAgIHZhciBkaXN0TWlkZGxlID0gbiA/IHkgLyBuICogKGhhbGZXaWR0aCArIDEpIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0RWRnZSA9IGhhbGZXaWR0aCAtIE1hdGguYWJzKGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IE1hdGguc3FydChkaXN0ICogZGlzdCArIGRpc3RFZGdlICogZGlzdEVkZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gaGFsZldpZHRoIC0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0ICsgZGlzdE1pZGRsZSAqIGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSAoaW5zaWRlID8gMSA6IC0xKSAqIGRpc3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YVszICsgKGluZGV4ICsgeCkgKiA0XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwb3MgPSB7XG4gICAgICAgIHk6ICh0aGlzLm5leHRSb3cgKyBuICsgMC41KSAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICBoZWlnaHQ6IDIgKiBuIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBsZW5ndGhcbiAgICB9O1xuXG4gICAgdGhpcy5uZXh0Um93ICs9IGhlaWdodDtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgIHJldHVybiBwb3M7XG59O1xuXG5MaW5lQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCkge1xuICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuUkVQRUFUKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcblxuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkxpbmVBdGxhcy5wcm90b3R5cGUuZGVidWcgPSBmdW5jdGlvbigpIHtcblxuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICBjYW52YXMuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmYwJztcblxuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG4gICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuc2RmKSB7XG4gICAgICAgICAgICB2YXIgayA9IGkgKiA0O1xuICAgICAgICAgICAgZGF0YS5kYXRhW2tdID0gZGF0YS5kYXRhW2sgKyAxXSA9IGRhdGEuZGF0YVtrICsgMl0gPSAwO1xuICAgICAgICAgICAgZGF0YS5kYXRhW2sgKyAzXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuZGF0YVtpXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdHgucHV0SW1hZ2VEYXRhKGRhdGEsIDAsIDApO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdsdXRpbCA9IHJlcXVpcmUoJy4vZ2xfdXRpbCcpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBtYXQ0ID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0NDtcbnZhciBGcmFtZUhpc3RvcnkgPSByZXF1aXJlKCcuL2ZyYW1lX2hpc3RvcnknKTtcblxuLypcbiAqIEluaXRpYWxpemUgYSBuZXcgcGFpbnRlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtDYW52YXN9IGdsIGFuIGV4cGVyaW1lbnRhbC13ZWJnbCBkcmF3aW5nIGNvbnRleHRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQYWludGVyO1xuZnVuY3Rpb24gUGFpbnRlcihnbCwgdHJhbnNmb3JtKSB7XG4gICAgdGhpcy5nbCA9IGdsdXRpbC5leHRlbmQoZ2wpO1xuICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzID0ge307XG4gICAgdGhpcy5wcmVGYm9zID0ge307XG5cbiAgICB0aGlzLmZyYW1lSGlzdG9yeSA9IG5ldyBGcmFtZUhpc3RvcnkoKTtcblxuICAgIHRoaXMuc2V0dXAoKTtcbn1cblxuLypcbiAqIFVwZGF0ZSB0aGUgR0wgdmlld3BvcnQsIHByb2plY3Rpb24gbWF0cml4LCBhbmQgdHJhbnNmb3JtcyB0byBjb21wZW5zYXRlXG4gKiBmb3IgYSBuZXcgd2lkdGggYW5kIGhlaWdodCB2YWx1ZS5cbiAqL1xuUGFpbnRlci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG59O1xuXG5cblBhaW50ZXIucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgIGdsLnZlcmJvc2UgPSB0cnVlO1xuXG4gICAgLy8gV2UgYXJlIGJsZW5kaW5nIHRoZSBuZXcgcGl4ZWxzICpiZWhpbmQqIHRoZSBleGlzdGluZyBwaXhlbHMuIFRoYXQgd2F5IHdlIGNhblxuICAgIC8vIGRyYXcgZnJvbnQtdG8tYmFjayBhbmQgdXNlIHRoZW4gc3RlbmNpbCBidWZmZXIgdG8gY3VsbCBvcGFxdWUgcGl4ZWxzIGVhcmx5LlxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLk9ORSk7XG5cbiAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2hhZGVyc1xuICAgIHRoaXMuZGVidWdTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdkZWJ1ZycsXG4gICAgICAgIFsnYV9wb3MnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3BvaW50c2l6ZScsICd1X2NvbG9yJ10pO1xuXG4gICAgdGhpcy5nYXVzc2lhblNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2dhdXNzaWFuJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfaW1hZ2UnLCAndV9vZmZzZXQnXSk7XG5cbiAgICB0aGlzLnJhc3RlclNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ3Jhc3RlcicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV90ZXh0dXJlX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfYnJpZ2h0bmVzc19sb3cnLCAndV9icmlnaHRuZXNzX2hpZ2gnLCAndV9zYXR1cmF0aW9uX2ZhY3RvcicsICd1X3NwaW5fd2VpZ2h0cycsICd1X2NvbnRyYXN0X2ZhY3RvcicsICd1X29wYWNpdHkwJywgJ3Vfb3BhY2l0eTEnLCAndV9pbWFnZTAnLCAndV9pbWFnZTEnLCAndV90bF9wYXJlbnQnLCAndV9zY2FsZV9wYXJlbnQnLCAndV9idWZmZXJfc2NhbGUnXSk7XG5cbiAgICB0aGlzLmxpbmVTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdsaW5lJyxcbiAgICAgICAgWydhX3BvcycsICdhX2RhdGEnLCAnYV9jb2xvcicsICdhX2xpbmV3aWR0aCcsICdhX2JsdXInXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3JhdGlvJywgJ3VfZXh0cmEnLCAndV9hbnRpYWxpYXNpbmdtYXRyaXgnXSk7XG5cbiAgICB0aGlzLmxpbmVwYXR0ZXJuU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignbGluZXBhdHRlcm4nLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZGF0YScsICdhX2xpbmV3aWR0aCcsICdhX2JsdXInLCAnYV9vcGFjaXR5J10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9leG1hdHJpeCcsICd1X3JhdGlvJywgJ3VfcGF0dGVybl9zaXplX2EnLCAndV9wYXR0ZXJuX3NpemVfYicsICd1X3BhdHRlcm5fdGxfYScsICd1X3BhdHRlcm5fYnJfYScsICd1X3BhdHRlcm5fdGxfYicsICd1X3BhdHRlcm5fYnJfYicsICd1X2ZhZGUnXSk7XG5cbiAgICB0aGlzLmxpbmVzZGZwYXR0ZXJuU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignbGluZXNkZnBhdHRlcm4nLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZGF0YScsICdhX2NvbG9yJywgJ2FfbGluZXdpZHRoJywgJ2FfYmx1ciddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV9yYXRpbycsICd1X3BhdHRlcm5zY2FsZV9hJywgJ3VfdGV4X3lfYScsICd1X3BhdHRlcm5zY2FsZV9iJywgJ3VfdGV4X3lfYicsICd1X2ltYWdlJywgJ3Vfc2RmZ2FtbWEnLCAndV9taXgnXSk7XG5cbiAgICB0aGlzLmRvdFNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2RvdCcsXG4gICAgICAgIFsnYV9wb3MnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3NpemUnLCAndV9jb2xvcicsICd1X2JsdXInXSk7XG5cbiAgICB0aGlzLnNkZlNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ3NkZicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9vZmZzZXQnLCAnYV9kYXRhMScsICdhX2RhdGEyJywgJ2FfY29sb3InLCAnYV9idWZmZXInLCAnYV9nYW1tYSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV90ZXh0dXJlJywgJ3VfdGV4c2l6ZScsICd1X3pvb20nLCAndV9mYWRlZGlzdCcsICd1X21pbmZhZGV6b29tJywgJ3VfbWF4ZmFkZXpvb20nLCAndV9mYWRlem9vbScsICd1X3NrZXdlZCcsICd1X2V4dHJhJ10pO1xuXG4gICAgdGhpcy5pY29uU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignaWNvbicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9vZmZzZXQnLCAnYV9kYXRhMScsICdhX2RhdGEyJywgJ2Ffb3BhY2l0eSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV90ZXh0dXJlJywgJ3VfdGV4c2l6ZScsICd1X3pvb20nLCAndV9mYWRlZGlzdCcsICd1X21pbmZhZGV6b29tJywgJ3VfbWF4ZmFkZXpvb20nLCAndV9mYWRlem9vbScsICd1X3NrZXdlZCcsICd1X2V4dHJhJ10pO1xuXG4gICAgdGhpcy5vdXRsaW5lU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignb3V0bGluZScsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9jb2xvciddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3Vfd29ybGQnXVxuICAgICk7XG5cbiAgICB0aGlzLnBhdHRlcm5TaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdwYXR0ZXJuJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfcGF0dGVybl90bF9hJywgJ3VfcGF0dGVybl9icl9hJywgJ3VfcGF0dGVybl90bF9iJywgJ3VfcGF0dGVybl9icl9iJywgJ3VfbWl4JywgJ3VfcGF0dGVybm1hdHJpeF9hJywgJ3VfcGF0dGVybm1hdHJpeF9iJywgJ3Vfb3BhY2l0eScsICd1X2ltYWdlJ11cbiAgICApO1xuXG4gICAgdGhpcy5maWxsU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignZmlsbCcsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9jb2xvciddLFxuICAgICAgICBbJ3VfbWF0cml4J11cbiAgICApO1xuXG4gICAgdGhpcy5jb2xsaXNpb25Cb3hTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdjb2xsaXNpb25ib3gnLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZXh0cnVkZScsICdhX2RhdGEnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3NjYWxlJywgJ3Vfem9vbScsICd1X21heHpvb20nXVxuICAgICk7XG5cbiAgICB0aGlzLmlkZW50aXR5TWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcblxuICAgIC8vIFRoZSBiYWNrZ3JvdW5kQnVmZmVyIGlzIHVzZWQgd2hlbiBkcmF3aW5nIHRvIHRoZSBmdWxsICpjYW52YXMqXG4gICAgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1TaXplID0gMjtcbiAgICB0aGlzLmJhY2tncm91bmRCdWZmZXIuaXRlbUNvdW50ID0gNDtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEludDE2QXJyYXkoWy0xLCAtMSwgMSwgLTEsIC0xLCAxLCAxLCAxXSksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIHRoaXMuc2V0RXh0ZW50KDQwOTYpO1xuXG4gICAgLy8gVGhlIGRlYnVnVGV4dEJ1ZmZlciBpcyB1c2VkIHRvIGRyYXcgdGlsZSBJRHMgZm9yIGRlYnVnZ2luZ1xuICAgIHRoaXMuZGVidWdUZXh0QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUgPSAyO1xufTtcblxuLyoqXG4gKiBSZWJpbmQgdGhlIG5lY2Vzc2FyeSBidWZmZXJzIHRvIHJlbmRlciBhdCBhIGRpZmZlcmVudCBleHRlbnQgdGhhblxuICogdGhlIGN1cnJlbnQgb25lLiBOby1vcHMgaWYgdGhlIGV4dGVudCBpcyBub3QgY2hhbmdpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0V4dGVudFxuICogQGV4YW1wbGVcbiAqIHRoaXMuc2V0RXh0ZW50KDQwOTYpO1xuICogQHByaXZhdGVcbiAqL1xuUGFpbnRlci5wcm90b3R5cGUuc2V0RXh0ZW50ID0gZnVuY3Rpb24obmV3RXh0ZW50KSB7XG4gICAgaWYgKCFuZXdFeHRlbnQgfHwgbmV3RXh0ZW50ID09PSB0aGlzLnRpbGVFeHRlbnQpIHJldHVybjtcblxuICAgIHRoaXMudGlsZUV4dGVudCA9IG5ld0V4dGVudDtcblxuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAvLyBUaGUgdGlsZUV4dGVudEJ1ZmZlciBpcyB1c2VkIHdoZW4gZHJhd2luZyB0byBhIGZ1bGwgKnRpbGUqXG4gICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplID0gNDtcbiAgICB0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbUNvdW50ID0gNDtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKFxuICAgICAgICBnbC5BUlJBWV9CVUZGRVIsXG4gICAgICAgIG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgICAgIC8vIHRpbGUgY29vcmQgeCwgdGlsZSBjb29yZCB5LCB0ZXh0dXJlIGNvb3JkIHgsIHRleHR1cmUgY29vcmQgeVxuICAgICAgICAgICAgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgIHRoaXMudGlsZUV4dGVudCwgMCwgMzI3NjcsIDAsXG4gICAgICAgICAgICAwLCB0aGlzLnRpbGVFeHRlbnQsIDAsIDMyNzY3LFxuICAgICAgICAgICAgdGhpcy50aWxlRXh0ZW50LCB0aGlzLnRpbGVFeHRlbnQsICAzMjc2NywgMzI3NjdcbiAgICAgICAgXSksXG4gICAgICAgIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFRoZSBkZWJ1Z0J1ZmZlciBpcyB1c2VkIHRvIGRyYXcgdGlsZSBvdXRsaW5lcyBmb3IgZGVidWdnaW5nXG4gICAgdGhpcy5kZWJ1Z0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZGVidWdCdWZmZXIuaXRlbVNpemUgPSAyO1xuICAgIHRoaXMuZGVidWdCdWZmZXIuaXRlbUNvdW50ID0gNTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5kZWJ1Z0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShcbiAgICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgICBuZXcgSW50MTZBcnJheShbXG4gICAgICAgICAgICAwLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCAwXSksXG4gICAgICAgIGdsLlNUQVRJQ19EUkFXKTtcbn07XG5cbi8qXG4gKiBSZXNldCB0aGUgY29sb3IgYnVmZmVycyBvZiB0aGUgZHJhd2luZyBjYW52YXMuXG4gKi9cblBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG59O1xuXG4vKlxuICogUmVzZXQgdGhlIGRyYXdpbmcgY2FudmFzIGJ5IGNsZWFyaW5nIHRoZSBzdGVuY2lsIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBkcmF3XG4gKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAqL1xuUGFpbnRlci5wcm90b3R5cGUuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICBnbC5jbGVhclN0ZW5jaWwoMHgwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEZGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd0NsaXBwaW5nTWFzayA9IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsIHRpbGUucG9zTWF0cml4KTtcbiAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGVudGlyZSBzdGVuY2lsIGJ1ZmZlciwgZXhjZXB0IGZvciB0aGUgN3RoIGJpdCwgd2hpY2ggc3RvcmVzXG4gICAgLy8gdGhlIGdsb2JhbCBjbGlwcGluZyBtYXNrIHRoYXQgYWxsb3dzIHVzIHRvIGF2b2lkIGRyYXdpbmcgaW4gcmVnaW9ucyBvZlxuICAgIC8vIHRpbGVzIHdlJ3ZlIGFscmVhZHkgcGFpbnRlZCBpbi5cbiAgICBnbC5jbGVhclN0ZW5jaWwoMHgwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEJGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuXG4gICAgLy8gVGhlIHN0ZW5jaWwgdGVzdCB3aWxsIGZhaWwgYWx3YXlzLCBtZWFuaW5nIHdlIHNldCBhbGwgcGl4ZWxzIGNvdmVyZWRcbiAgICAvLyBieSB0aGlzIGdlb21ldHJ5IHRvIDB4ODAuIFdlIHVzZSB0aGUgaGlnaGVzdCBiaXQgMHg4MCB0byBtYXJrIHRoZSByZWdpb25zXG4gICAgLy8gd2Ugd2FudCB0byBkcmF3IGluLiBBbGwgcGl4ZWxzIHRoYXQgaGF2ZSB0aGlzIGJpdCAqbm90KiBzZXQgd2lsbCBuZXZlciBiZVxuICAgIC8vIGRyYXduIGluLlxuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCAweEMwLCAweDQwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEMwKTtcbiAgICBnbC5zdGVuY2lsT3AoZ2wuUkVQTEFDRSwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG5cbiAgICAvLyBEcmF3IHRoZSBjbGlwcGluZyBtYXNrXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuZmlsbFNoYWRlci5hX2NvbG9yKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3BvcywgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDgsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xuICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweDAwKTtcbiAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5maWxsU2hhZGVyLmFfY29sb3IpO1xufTtcblxuLy8gT3ZlcnJpZGRlbiBieSBoZWFkbGVzcyB0ZXN0cy5cblBhaW50ZXIucHJvdG90eXBlLnByZXBhcmVCdWZmZXJzID0gZnVuY3Rpb24oKSB7fTtcblBhaW50ZXIucHJvdG90eXBlLmJpbmREZWZhdWx0RnJhbWVidWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG59O1xuXG52YXIgZHJhdyA9IHtcbiAgICBzeW1ib2w6IHJlcXVpcmUoJy4vZHJhd19zeW1ib2wnKSxcbiAgICBsaW5lOiByZXF1aXJlKCcuL2RyYXdfbGluZScpLFxuICAgIGZpbGw6IHJlcXVpcmUoJy4vZHJhd19maWxsJyksXG4gICAgcmFzdGVyOiByZXF1aXJlKCcuL2RyYXdfcmFzdGVyJyksXG4gICAgYmFja2dyb3VuZDogcmVxdWlyZSgnLi9kcmF3X2JhY2tncm91bmQnKSxcbiAgICBkZWJ1ZzogcmVxdWlyZSgnLi9kcmF3X2RlYnVnJyksXG4gICAgdmVydGljZXM6IHJlcXVpcmUoJy4vZHJhd192ZXJ0aWNlcycpXG59O1xuXG5QYWludGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbihzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5saW5lQXRsYXMgPSBzdHlsZS5saW5lQXRsYXM7XG5cbiAgICB0aGlzLnNwcml0ZUF0bGFzID0gc3R5bGUuc3ByaXRlQXRsYXM7XG4gICAgdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUoc3R5bGUuc3ByaXRlKTtcblxuICAgIHRoaXMuZ2x5cGhBdGxhcyA9IHN0eWxlLmdseXBoQXRsYXM7XG4gICAgdGhpcy5nbHlwaEF0bGFzLmJpbmQodGhpcy5nbCk7XG5cbiAgICB0aGlzLmZyYW1lSGlzdG9yeS5yZWNvcmQodGhpcy50cmFuc2Zvcm0uem9vbSk7XG5cbiAgICB0aGlzLnByZXBhcmVCdWZmZXJzKCk7XG4gICAgdGhpcy5jbGVhckNvbG9yKCk7XG5cbiAgICBmb3IgKHZhciBpID0gc3R5bGUuX2dyb3Vwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgZ3JvdXAgPSBzdHlsZS5fZ3JvdXBzW2ldO1xuICAgICAgICB2YXIgc291cmNlID0gc3R5bGUuc291cmNlc1tncm91cC5zb3VyY2VdO1xuXG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgICAgICBzb3VyY2UucmVuZGVyKGdyb3VwLCB0aGlzKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGdyb3VwLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdMYXllcnMoZ3JvdXAsIHRoaXMuaWRlbnRpdHlNYXRyaXgpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGUgPSBmdW5jdGlvbih0aWxlLCBsYXllcnMpIHtcbiAgICB0aGlzLnNldEV4dGVudCh0aWxlLnRpbGVFeHRlbnQpO1xuICAgIHRoaXMuZHJhd0NsaXBwaW5nTWFzayh0aWxlKTtcbiAgICB0aGlzLmRyYXdMYXllcnMobGF5ZXJzLCB0aWxlLnBvc01hdHJpeCwgdGlsZSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIGRyYXcuZGVidWcodGhpcywgdGlsZSk7XG4gICAgfVxufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycyA9IGZ1bmN0aW9uKGxheWVycywgbWF0cml4LCB0aWxlKSB7XG4gICAgZm9yICh2YXIgaSA9IGxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgICAgaWYgKGxheWVyLmhpZGRlbilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0odGhpcywgbGF5ZXIsIG1hdHJpeCwgdGlsZSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJ0aWNlcykge1xuICAgICAgICAgICAgZHJhdy52ZXJ0aWNlcyh0aGlzLCBsYXllciwgbWF0cml4LCB0aWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vIERyYXdzIG5vbi1vcGFxdWUgYXJlYXMuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cblBhaW50ZXIucHJvdG90eXBlLmRyYXdTdGVuY2lsQnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICBnbC5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLCB0aGlzLmlkZW50aXR5TWF0cml4KTtcblxuICAgIC8vIEJsZW5kIHRvIHRoZSBmcm9udCwgbm90IHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIGdsLnN0ZW5jaWxNYXNrKDB4MDApO1xuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCAweDgwLCAweDgwKTtcblxuICAgIC8vIERydyB0aGUgZmlsbGluZyBxdWFkIHdoZXJlIHRoZSBzdGVuY2lsIGJ1ZmZlciBpc24ndCBzZXQuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuYmFja2dyb3VuZEJ1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLmZpbGxTaGFkZXIuYV9wb3MsIHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZSwgZ2wuU0hPUlQsIGZhbHNlLCAwLCAwKTtcbiAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5maWxsU2hhZGVyLmFfY29sb3IpO1xuICAgIGdsLnZlcnRleEF0dHJpYjRmdih0aGlzLmZpbGxTaGFkZXIuYV9jb2xvciwgWzAsIDAsIDAsIDAuNV0pO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgLy8gUmV2ZXJ0IGJsZW5kaW5nIG1vZGUgdG8gYmxlbmQgdG8gdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLk9ORSk7XG59O1xuXG5QYWludGVyLnByb3RvdHlwZS50cmFuc2xhdGVNYXRyaXggPSBmdW5jdGlvbihtYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgYW5jaG9yKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkgcmV0dXJuIG1hdHJpeDtcblxuICAgIGlmIChhbmNob3IgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgdmFyIHNpbkEgPSBNYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICB2YXIgY29zQSA9IE1hdGguY29zKC10aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIHRyYW5zbGF0ZSA9IFtcbiAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIGNvc0EgLSB0cmFuc2xhdGVbMV0gKiBzaW5BLFxuICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICB2YXIgdGlsZVBpeGVsUmF0aW8gPSB0aGlzLnRyYW5zZm9ybS5zY2FsZSAvICgxIDw8IHRpbGUuY29vcmQueikgLyAodGlsZS50aWxlRXh0ZW50IC8gdGlsZS50aWxlU2l6ZSk7XG4gICAgdmFyIHRyYW5zbGF0aW9uID0gW1xuICAgICAgICB0cmFuc2xhdGVbMF0gLyB0aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgdHJhbnNsYXRlWzFdIC8gdGlsZVBpeGVsUmF0aW8sXG4gICAgICAgIDBcbiAgICBdO1xuXG4gICAgdmFyIHRyYW5zbGF0ZWRNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZE1hdHJpeDtcbn07XG5cblBhaW50ZXIucHJvdG90eXBlLnNhdmVUZXh0dXJlID0gZnVuY3Rpb24odGV4dHVyZSkge1xuICAgIHZhciB0ZXh0dXJlcyA9IHRoaXMucmV1c2FibGVUZXh0dXJlc1t0ZXh0dXJlLnNpemVdO1xuICAgIGlmICghdGV4dHVyZXMpIHtcbiAgICAgICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzW3RleHR1cmUuc2l6ZV0gPSBbdGV4dHVyZV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcbiAgICB9XG59O1xuXG5cblBhaW50ZXIucHJvdG90eXBlLmdldFRleHR1cmUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdmFyIHRleHR1cmVzID0gdGhpcy5yZXVzYWJsZVRleHR1cmVzW3NpemVdO1xuICAgIHJldHVybiB0ZXh0dXJlcyAmJiB0ZXh0dXJlcy5sZW5ndGggPiAwID8gdGV4dHVyZXMucG9wKCkgOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdsaWZ5ID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBcImRlYnVnXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBmbG9hdCB1X3BvaW50c2l6ZTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcyxzdGVwKDMyNzY3LixhX3Bvcy54KSwxKTtnbF9Qb2ludFNpemU9dV9wb2ludHNpemU7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sXG4gICAgXCJkb3RcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NpemU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2dsX1BvaW50U2l6ZT11X3NpemU7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZvaWQgbWFpbigpe2Zsb2F0IGEsYjthPWxlbmd0aChnbF9Qb2ludENvb3JkLS41KTtiPXNtb290aHN0ZXAoLjUsLjUtdV9ibHVyLGEpO2dsX0ZyYWdDb2xvcj11X2NvbG9yKmI7fVwifSxcbiAgICBcImZpbGxcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9jb2xvcjt2YXJ5aW5nIHZlYzQgYTt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7Z2xfUG9pbnRTaXplPTIuO2E9YV9jb2xvcjt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dmFyeWluZyB2ZWM0IGE7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPWE7fVwifSxcbiAgICBcImdhdXNzaWFuXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X29mZnNldDt2YXJ5aW5nIHZlYzIgYVszXTt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7dmVjMiBiPWdsX1Bvc2l0aW9uLnh5LzIuKy41O2FbMF09YjthWzFdPWIrdV9vZmZzZXQqMS4xODI0MjU1MjM4MDYzNTYzO2FbMl09Yi11X29mZnNldCoxLjE4MjQyNTUyMzgwNjM1NjM7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGFbM107dm9pZCBtYWluKCl7dmVjNCBiPXZlYzQoMCk7Yis9dGV4dHVyZTJEKHVfaW1hZ2UsYVswXSkqLjQwMjYxOTk0Njg5NDI0NzQ2O2IrPXRleHR1cmUyRCh1X2ltYWdlLGFbMV0pKi4yOTg2OTAwMjY1NTI4NzYzO2IrPXRleHR1cmUyRCh1X2ltYWdlLGFbMl0pKi4yOTg2OTAwMjY1NTI4NzYzO2dsX0ZyYWdDb2xvcj1iO31cIn0sXG4gICAgXCJsaW5lXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9saW5ld2lkdGg7YXR0cmlidXRlIHZlYzQgYV9kYXRhLGFfY29sb3I7YXR0cmlidXRlIGZsb2F0IGFfYmx1cjt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvLHVfZXh0cmE7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhLGU7dmFyeWluZyBmbG9hdCBiLGQsZjt2YXJ5aW5nIHZlYzQgYzt2b2lkIG1haW4oKXt2ZWMyIGcsaDtnPWFfZGF0YS54eTtoPW1vZChhX3BvcywyLik7aC55PXNpZ24oaC55LS41KTthPWg7dmVjNCBpPXZlYzQoYV9saW5ld2lkdGgucypnKi4wMTU4NzMwMTYsMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStpLnh5L3VfcmF0aW8sMCwxKTtmbG9hdCBqLGssbDtqPWdsX1Bvc2l0aW9uLnkvZ2xfUG9zaXRpb24udztrPWxlbmd0aChnKS9sZW5ndGgodV9hbnRpYWxpYXNpbmdtYXRyaXgqZyk7bD0xLi8oMS4taip1X2V4dHJhKTtkPWwqaztjPWFfY29sb3I7ZT1hX2xpbmV3aWR0aDtmPWFfYmx1cjt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfZGFzaGFycmF5O3ZhcnlpbmcgdmVjNCBjO3ZhcnlpbmcgdmVjMiBhLGU7dmFyeWluZyBmbG9hdCBiLGQsZjt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaTtnPWxlbmd0aChhKSplLnM7aD1mKmQ7aT1jbGFtcChtaW4oZy0oZS50LWgpLGUucy1nKS9oLDAuLDEuKTtnbF9GcmFnQ29sb3I9YyppO31cIn0sXG4gICAgXCJsaW5lcGF0dGVyblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfbGluZXdpZHRoO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgZmxvYXQgYV9ibHVyLGFfb3BhY2l0eTt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvO3ZhcnlpbmcgdmVjMiBhLGM7dmFyeWluZyBmbG9hdCBiLGQsZTt2b2lkIG1haW4oKXt2ZWMyIGYsaCxpLGo7Zj1hX2RhdGEueHk7ZmxvYXQgZz1hX2RhdGEueioxMjguK2FfZGF0YS53O2g9bW9kKGFfcG9zLDIuKTtoLnk9c2lnbihoLnktLjUpO2E9aDtpPWYqLjAxNTg3MzAxNjtqPWFfbGluZXdpZHRoLnMqaTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStqLnh5L3VfcmF0aW8sMCwxKTtiPWc7Yz1hX2xpbmV3aWR0aDtkPWFfYmx1cjtlPWFfb3BhY2l0eTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X3BvaW50LHVfZmFkZTt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYzt2YXJ5aW5nIGZsb2F0IGIsZCxlO3ZvaWQgbWFpbigpe2Zsb2F0IGYsZyxoLGksaixrO2Y9bGVuZ3RoKGEpKmMucztnPWNsYW1wKG1pbihmLShjLnQtZCksYy5zLWYpL2QsMC4sMS4pO2g9bW9kKGIvdV9wYXR0ZXJuX3NpemVfYS54LDEuKTtpPW1vZChiL3VfcGF0dGVybl9zaXplX2IueCwxLik7aj0uNSthLnkqYy5zL3VfcGF0dGVybl9zaXplX2EueTtrPS41K2EueSpjLnMvdV9wYXR0ZXJuX3NpemVfYi55O3ZlYzIgbCxtO2w9bWl4KHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHZlYzIoaCxqKSk7bT1taXgodV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2IsdmVjMihpLGspKTt2ZWM0IG49bWl4KHRleHR1cmUyRCh1X2ltYWdlLGwpLHRleHR1cmUyRCh1X2ltYWdlLG0pLHVfZmFkZSk7Zyo9ZTtnbF9GcmFnQ29sb3I9bipnO31cIn0sXG4gICAgXCJsaW5lc2RmcGF0dGVyblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfbGluZXdpZHRoO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YSxhX2NvbG9yO2F0dHJpYnV0ZSBmbG9hdCBhX2JsdXI7dW5pZm9ybSBoaWdocCBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gbWF0NCB1X2V4bWF0cml4O3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5zY2FsZV9hLHVfcGF0dGVybnNjYWxlX2I7dmFyeWluZyB2ZWMyIGEsYixjLGU7dmFyeWluZyB2ZWM0IGQ7dmFyeWluZyBmbG9hdCBmO3ZvaWQgbWFpbigpe3ZlYzIgZyxpO2c9YV9kYXRhLnh5O2Zsb2F0IGg9YV9kYXRhLnoqMTI4LithX2RhdGEudztpPW1vZChhX3BvcywyLik7aS55PXNpZ24oaS55LS41KTthPWk7dmVjNCBqPXZlYzQoYV9saW5ld2lkdGgucypnKi4wMTU4NzMwMTYsMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStqLnh5L3VfcmF0aW8sMCwxKTtiPXZlYzIoaCp1X3BhdHRlcm5zY2FsZV9hLngsaS55KnVfcGF0dGVybnNjYWxlX2EueSt1X3RleF95X2EpO2M9dmVjMihoKnVfcGF0dGVybnNjYWxlX2IueCxpLnkqdV9wYXR0ZXJuc2NhbGVfYi55K3VfdGV4X3lfYik7ZD1hX2NvbG9yO2U9YV9saW5ld2lkdGg7Zj1hX2JsdXI7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dW5pZm9ybSBmbG9hdCB1X3NkZmdhbW1hLHVfbWl4O3ZhcnlpbmcgdmVjMiBhLGIsYyxlO3ZhcnlpbmcgdmVjNCBkO3ZhcnlpbmcgZmxvYXQgZjt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaSxqLGs7Zz1sZW5ndGgoYSkqZS5zO2g9Y2xhbXAobWluKGctKGUudC1mKSxlLnMtZykvZiwwLiwxLik7aT10ZXh0dXJlMkQodV9pbWFnZSxiKS5hO2o9dGV4dHVyZTJEKHVfaW1hZ2UsYykuYTtrPW1peChpLGosdV9taXgpO2gqPXNtb290aHN0ZXAoLjUtdV9zZGZnYW1tYSwuNSt1X3NkZmdhbW1hLGspO2dsX0ZyYWdDb2xvcj1kKmg7fVwifSxcbiAgICBcIm91dGxpbmVcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV93b3JsZDt2YXJ5aW5nIHZlYzQgYTt2YXJ5aW5nIHZlYzIgYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7Yj0oZ2xfUG9zaXRpb24ueHkvZ2xfUG9zaXRpb24udysxLikvMi4qdV93b3JsZDthPWFfY29sb3I7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3ZhcnlpbmcgdmVjNCBhO3ZhcnlpbmcgdmVjMiBiO3ZvaWQgbWFpbigpe2Zsb2F0IGMsZDtjPWxlbmd0aChiLWdsX0ZyYWdDb29yZC54eSk7ZD1zbW9vdGhzdGVwKDEuLDAuLGMpO2dsX0ZyYWdDb2xvcj1hKmQ7fVwifSxcbiAgICBcInBhdHRlcm5cIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQzIHVfcGF0dGVybm1hdHJpeF9hLHVfcGF0dGVybm1hdHJpeF9iO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KHVfcGF0dGVybm1hdHJpeF9hKnZlYzMoYV9wb3MsMSkpLnh5O2I9KHVfcGF0dGVybm1hdHJpeF9iKnZlYzMoYV9wb3MsMSkpLnh5O31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eSx1X21peDt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsdV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2I7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgYSxiO3ZvaWQgbWFpbigpe3ZlYzIgYyxkLGYsZztjPW1vZChhLDEuKTtkPW1peCh1X3BhdHRlcm5fdGxfYSx1X3BhdHRlcm5fYnJfYSxjKTt2ZWM0IGUsaDtlPXRleHR1cmUyRCh1X2ltYWdlLGQpO2Y9bW9kKGIsMS4pO2c9bWl4KHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iLGYpO2g9dGV4dHVyZTJEKHVfaW1hZ2UsZyk7Z2xfRnJhZ0NvbG9yPW1peChlLGgsdV9taXgpKnVfb3BhY2l0eTt9XCJ9LFxuICAgIFwicmFzdGVyXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3RsX3BhcmVudDt1bmlmb3JtIGZsb2F0IHVfc2NhbGVfcGFyZW50LHVfYnVmZmVyX3NjYWxlO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfdGV4dHVyZV9wb3M7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7YT0oYV90ZXh0dXJlX3Bvcy8zMjc2Ny4tLjUpL3VfYnVmZmVyX3NjYWxlKy41O2I9YSp1X3NjYWxlX3BhcmVudCt1X3RsX3BhcmVudDt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHkwLHVfb3BhY2l0eTEsdV9icmlnaHRuZXNzX2xvdyx1X2JyaWdodG5lc3NfaGlnaCx1X3NhdHVyYXRpb25fZmFjdG9yLHVfY29udHJhc3RfZmFjdG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2UwLHVfaW1hZ2UxO3ZhcnlpbmcgdmVjMiBhLGI7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpe3ZlYzQgYyxkLGU7Yz10ZXh0dXJlMkQodV9pbWFnZTAsYSk7ZD10ZXh0dXJlMkQodV9pbWFnZTEsYik7ZT1jKnVfb3BhY2l0eTArZCp1X29wYWNpdHkxO3ZlYzMgZixoLGk7Zj1lLnJnYjtmPXZlYzMoZG90KGYsdV9zcGluX3dlaWdodHMueHl6KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChmLHVfc3Bpbl93ZWlnaHRzLnl6eCkpO2Zsb2F0IGc9KGUucitlLmcrZS5iKS8zLjtmKz0oZy1mKSp1X3NhdHVyYXRpb25fZmFjdG9yO2Y9KGYtLjUpKnVfY29udHJhc3RfZmFjdG9yKy41O2g9dmVjMyh1X2JyaWdodG5lc3NfbG93KTtpPXZlYzModV9icmlnaHRuZXNzX2hpZ2gpO2dsX0ZyYWdDb2xvcj12ZWM0KG1peChoLGksZiksZS5hKTt9XCJ9LFxuICAgIFwiaWNvblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjthdHRyaWJ1dGUgZmxvYXQgYV9vcGFjaXR5O3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiO3ZvaWQgbWFpbigpe3ZlYzIgYyxlO2M9YV9kYXRhMS54eTtmbG9hdCBkLGYsZyxoLGksajtkPWFfZGF0YTFbMl07ZT1hX2RhdGEyLnN0O2Y9ZVswXTtnPWVbMV07aD0xMC47aT0yLi1zdGVwKGYsdV96b29tKS0oMS4tc3RlcChnLHVfem9vbSkpO2o9Y2xhbXAoKHVfZmFkZXpvb20tZCkvdV9mYWRlZGlzdCwwLiwxLik7aWYodV9mYWRlZGlzdD49MC4pYj1qO2Vsc2UgYj0xLi1qO2lmKHVfbWF4ZmFkZXpvb208ZCliPTAuO2lmKHVfbWluZmFkZXpvb20+PWQpYj0xLjtpKz1zdGVwKGIsMC4pO2lmKHVfc2tld2VkKXt2ZWM0IGs9dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3Mray54eSwwLDEpO2dsX1Bvc2l0aW9uLnorPWkqZ2xfUG9zaXRpb24udzt9ZWxzZXt2ZWM0IGs9dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LixpLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKStrO31hPWMvdV90ZXhzaXplO2IqPWFfb3BhY2l0eTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYjt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dGV4dHVyZTJEKHVfdGV4dHVyZSxhKSpiO31cIn0sXG4gICAgXCJzZGZcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX29mZnNldDthdHRyaWJ1dGUgdmVjNCBhX2RhdGExLGFfZGF0YTIsYV9jb2xvcjthdHRyaWJ1dGUgZmxvYXQgYV9idWZmZXIsYV9nYW1tYTt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X2V4dHJhO3VuaWZvcm0gYm9vbCB1X3NrZXdlZDt1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjLGUsZjt2YXJ5aW5nIHZlYzQgZDt2b2lkIG1haW4oKXt2ZWMyIGcsaTtnPWFfZGF0YTEueHk7ZmxvYXQgaCxqLGssbCxtLG4sbztoPWFfZGF0YTFbMl07aT1hX2RhdGEyLnN0O2o9aVswXTtrPWlbMV07bD0yLi1zdGVwKGosdV96b29tKS0oMS4tc3RlcChrLHVfem9vbSkpO209Y2xhbXAoKHVfZmFkZXpvb20taCkvdV9mYWRlZGlzdCwwLiwxLik7aWYodV9mYWRlZGlzdD49MC4pYj1tO2Vsc2UgYj0xLi1tO2lmKHVfbWF4ZmFkZXpvb208aCliPTAuO2lmKHVfbWluZmFkZXpvb20+PWgpYj0xLjtsKz1zdGVwKGIsMC4pO2lmKHVfc2tld2VkKXt2ZWM0IG49dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3Mrbi54eSwwLDEpO2dsX1Bvc2l0aW9uLnorPWwqZ2xfUG9zaXRpb24udzt9ZWxzZXt2ZWM0IG49dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LixsLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKStuO31uPWdsX1Bvc2l0aW9uLnkvZ2xfUG9zaXRpb24udztvPTEuLygxLi1uKnVfZXh0cmEpO2M9bzthPWcvdV90ZXhzaXplO2Q9YV9jb2xvcjtlPWFfYnVmZmVyO2Y9YV9nYW1tYTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjLGUsZjt2YXJ5aW5nIHZlYzQgZDt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaTtnPWYqYztoPXRleHR1cmUyRCh1X3RleHR1cmUsYSkuYTtpPXNtb290aHN0ZXAoZS1nLGUrZyxoKSpiO2dsX0ZyYWdDb2xvcj1kKmk7fVwifSxcbiAgICBcImNvbGxpc2lvbmJveFwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfZXh0cnVkZSxhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9zY2FsZTt2YXJ5aW5nIGZsb2F0IGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2FfZXh0cnVkZS91X3NjYWxlLDAsMSk7YT1hX2RhdGEueDtiPWFfZGF0YS55O31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X21heHpvb207dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7ZmxvYXQgYz0uNTtnbF9GcmFnQ29sb3I9dmVjNCgwLDEsMCwxKSpjO2lmKGI+dV96b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDEsMCwwLDEpKmM7aWYodV96b29tPj1hKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwwLDEpKmMqLjI1O2lmKGI+PXVfbWF4em9vbSlnbF9GcmFnQ29sb3I9dmVjNCgwLDAsMSwxKSpjKi4yO31cIn1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIFRpbGVQeXJhbWlkID0gcmVxdWlyZSgnLi90aWxlX3B5cmFtaWQnKTtcbnZhciBTb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xudmFyIHVybFJlc29sdmUgPSByZXF1aXJlKCdyZXNvbHZlLXVybCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlb0pTT05Tb3VyY2U7XG5cbi8qKlxuICogQ3JlYXRlIGEgR2VvSlNPTiBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICogQGNsYXNzIEdlb0pTT05Tb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gb3B0aW9ucy5kYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBVUkwgdG8gaXQuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiBjYXNlIG9mIGxhcmdlIEdlb0pTT04gZmlsZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4em9vbT0xNF0gTWF4aW11bSB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBhdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5idWZmZXJdIFRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50b2xlcmFuY2VdIFNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpLlxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuR2VvSlNPTlNvdXJjZSh7XG4gKiAgICBkYXRhOiB7XG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgLTc2LjUzMDYzMjk3MjcxNzI5LFxuICogICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICB9XVxuICogICAgfVxuICogfSk7XG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywgc291cmNlT2JqKTsgLy8gYWRkXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqL1xuZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB0aGlzLl9kYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkKSB0aGlzLm1heHpvb20gPSBvcHRpb25zLm1heHpvb207XG5cbiAgICB0aGlzLmdlb2pzb25WdE9wdGlvbnMgPSB7IG1heFpvb206IHRoaXMubWF4em9vbSB9O1xuICAgIGlmIChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLmdlb2pzb25WdE9wdGlvbnMuYnVmZmVyID0gb3B0aW9ucy5idWZmZXI7XG4gICAgaWYgKG9wdGlvbnMudG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHRoaXMuZ2VvanNvblZ0T3B0aW9ucy50b2xlcmFuY2UgPSBvcHRpb25zLnRvbGVyYW5jZTtcblxuICAgIHRoaXMuX3B5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoe1xuICAgICAgICB0aWxlU2l6ZTogNTEyLFxuICAgICAgICBtaW56b29tOiB0aGlzLm1pbnpvb20sXG4gICAgICAgIG1heHpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgY2FjaGVTaXplOiAyMCxcbiAgICAgICAgbG9hZDogdGhpcy5fbG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgYWJvcnQ6IHRoaXMuX2Fib3J0VGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICB1bmxvYWQ6IHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgYWRkOiB0aGlzLl9hZGRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgIHJlbW92ZTogdGhpcy5fcmVtb3ZlVGlsZS5iaW5kKHRoaXMpXG4gICAgfSk7XG59XG5cbkdlb0pTT05Tb3VyY2UucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIC8qKiBAbGVuZHMgR2VvSlNPTlNvdXJjZS5wcm90b3R5cGUgKi97XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAxNCxcbiAgICBfZGlydHk6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgc291cmNlIGdlb2pzb24gZGF0YSBhbmQgcmVyZW5kZXIgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IGRhdGEgQSBHZW9KU09OIGRhdGEgb2JqZWN0IG9yIFVSTCB0byBpdC4gVGhlIGxhdHRlciBpcyBwcmVmZXJhYmxlIGluIGNhc2Ugb2YgbGFyZ2UgR2VvSlNPTiBmaWxlcy5cbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHNldERhdGE6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMubWFwLnRyYW5zZm9ybSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgfSxcblxuICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9weXJhbWlkLnVwZGF0ZSh0aGlzLnVzZWQsIHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IFNvdXJjZS5fcmVuZGVyVGlsZXMsXG4gICAgZmVhdHVyZXNBdDogU291cmNlLl92ZWN0b3JGZWF0dXJlc0F0LFxuXG4gICAgX3VwZGF0ZURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRhdGEgPSB1cmxSZXNvbHZlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3BhcnNlIGdlb2pzb24nLCB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgdGlsZVNpemU6IDUxMixcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHRoaXMuZ2VvanNvblZ0T3B0aW9uc1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9weXJhbWlkLnJlbG9hZCgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBfbG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdmFyIG92ZXJzY2FsaW5nID0gdGlsZS5jb29yZC56ID4gdGhpcy5tYXh6b29tID8gTWF0aC5wb3coMiwgdGlsZS5jb29yZC56IC0gdGhpcy5tYXh6b29tKSA6IDE7XG4gICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICAgICAgY29vcmQ6IHRpbGUuY29vcmQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLmNvb3JkLnosXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICB0aWxlU2l6ZTogNTEyLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IG92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgYW5nbGU6IHRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxcbiAgICAgICAgICAgIHBpdGNoOiB0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsXG4gICAgICAgICAgICBjb2xsaXNpb25EZWJ1ZzogdGhpcy5tYXAuY29sbGlzaW9uRGVidWdcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2xvYWQgZ2VvanNvbiB0aWxlJywgcGFyYW1zLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcblxuICAgICAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9hYm9ydFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2FkZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmFkZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF9yZW1vdmVUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5yZW1vdmUnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfdW5sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlcik7XG4gICAgICAgIHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHModGlsZS51aWQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgncmVtb3ZlIHRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJ3ZlY3Rvci10aWxlJykuVmVjdG9yVGlsZUZlYXR1cmU7XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXI7XG5cbi8vIGNvbmZvcm0gdG8gdmVjdG9ydGlsZSBhcGlcbmZ1bmN0aW9uIEdlb0pTT05XcmFwcGVyKGZlYXR1cmVzKSB7XG4gICAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5HZW9KU09OV3JhcHBlci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuZmVhdHVyZXNbaV0pO1xufTtcblxuZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIoZmVhdHVyZSkge1xuICAgIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZTtcbiAgICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3M7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJpbmdzID0gdGhpcy5yYXdHZW9tZXRyeTtcbiAgICB0aGlzLmdlb21ldHJ5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByaW5nID0gcmluZ3NbaV0sXG4gICAgICAgICAgICBuZXdSaW5nID0gW107XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW9tZXRyeTtcbn07XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmdlb21ldHJ5KSB0aGlzLmxvYWRHZW9tZXRyeSgpO1xuXG4gICAgdmFyIHJpbmdzID0gdGhpcy5nZW9tZXRyeSxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGNvb3JkID0gcmluZ1tqXTtcblxuICAgICAgICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueCk7XG4gICAgICAgICAgICB4MiA9IE1hdGgubWF4KHgyLCBjb29yZC54KTtcbiAgICAgICAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvb3JkLnkpO1xuICAgICAgICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT04gPSBWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgU291cmNlID0gcmVxdWlyZSgnLi9zb3VyY2UnKTtcbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVRpbGVVUkw7XG5cbm1vZHVsZS5leHBvcnRzID0gUmFzdGVyVGlsZVNvdXJjZTtcblxuZnVuY3Rpb24gUmFzdGVyVGlsZVNvdXJjZShvcHRpb25zKSB7XG4gICAgdXRpbC5leHRlbmQodGhpcywgdXRpbC5waWNrKG9wdGlvbnMsIFsndXJsJywgJ3RpbGVTaXplJ10pKTtcblxuICAgIFNvdXJjZS5fbG9hZFRpbGVKU09OLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblJhc3RlclRpbGVTb3VyY2UucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIHtcbiAgICBtaW56b29tOiAwLFxuICAgIG1heHpvb206IDIyLFxuICAgIHJvdW5kWm9vbTogdHJ1ZSxcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtLCB0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuXG4gICAgcmVuZGVyOiBTb3VyY2UuX3JlbmRlclRpbGVzLFxuXG4gICAgX2xvYWRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIGFqYXguZ2V0SW1hZ2Uobm9ybWFsaXplVVJMKHRpbGUuY29vcmQudXJsKHRoaXMudGlsZXMpLCB0aGlzLnVybCksIGZ1bmN0aW9uKGVyciwgaW1nKSB7XG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLm1hcC5wYWludGVyLmdsO1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy5tYXAucGFpbnRlci5nZXRUZXh0dXJlKGltZy53aWR0aCk7XG4gICAgICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGlsZS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aWxlLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1nKTtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUuc2l6ZSA9IGltZy53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuXG4gICAgICAgICAgICB0aWxlLnRpbWVBZGRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgdGhpcy5tYXAuYW5pbWF0aW9uTG9vcC5zZXQodGhpcy5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pO1xuXG4gICAgICAgICAgICB0aWxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgICAgICB0aWxlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5sb2FkJywge3RpbGU6IHRpbGV9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgX2Fib3J0VGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfYWRkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUuYWRkJywge3RpbGU6IHRpbGV9KTtcbiAgICB9LFxuXG4gICAgX3JlbW92ZVRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLnJlbW92ZScsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF91bmxvYWRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHRoaXMubWFwLnBhaW50ZXIuc2F2ZVRleHR1cmUodGlsZS50ZXh0dXJlKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24ocG9pbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgW10pO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgVGlsZVB5cmFtaWQgPSByZXF1aXJlKCcuL3RpbGVfcHlyYW1pZCcpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xudmFyIG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplU291cmNlVVJMO1xuXG5leHBvcnRzLl9sb2FkVGlsZUpTT04gPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICB2YXIgbG9hZGVkID0gZnVuY3Rpb24oZXJyLCB0aWxlSlNPTikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayh0aWxlSlNPTixcbiAgICAgICAgICAgIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJ10pKTtcblxuICAgICAgICB0aGlzLl9weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKHtcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgY2FjaGVTaXplOiAyMCxcbiAgICAgICAgICAgIG1pbnpvb206IHRoaXMubWluem9vbSxcbiAgICAgICAgICAgIG1heHpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHJvdW5kWm9vbTogdGhpcy5yb3VuZFpvb20sXG4gICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCxcbiAgICAgICAgICAgIGxvYWQ6IHRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBhYm9ydDogdGhpcy5fYWJvcnRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB1bmxvYWQ6IHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFkZDogdGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLl9yZW1vdmVUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICByZWRvUGxhY2VtZW50OiB0aGlzLl9yZWRvVGlsZVBsYWNlbWVudCA/IHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50LmJpbmQodGhpcykgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgaW5kZXggaXMgZGVmaW5lZCwgZmV0Y2ggdGhlIGluZGV4IGpzb24sIHRoZW4gZXh0ZW5kIHRoZSBweXJhbWlkXG4gICAgICAgIGlmICh0aWxlSlNPTi5pbmRleCkge1xuICAgICAgICAgICAgYWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTCh0aWxlSlNPTi5pbmRleCksIGZ1bmN0aW9uIChlcnIsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXRpbC5leHRlbmQodGhpcy5fcHlyYW1pZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdsb2FkJyk7XG4gICAgICAgIH1cblxuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICBhamF4LmdldEpTT04obm9ybWFsaXplVVJMKG9wdGlvbnMudXJsKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBicm93c2VyLmZyYW1lKGxvYWRlZC5iaW5kKHRoaXMsIG51bGwsIG9wdGlvbnMpKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl9yZW5kZXJUaWxlcyA9IGZ1bmN0aW9uKGxheWVycywgcGFpbnRlcikge1xuICAgIGlmICghdGhpcy5fcHlyYW1pZClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGlkcyA9IHRoaXMuX3B5cmFtaWQucmVuZGVyZWRJRHMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pLFxuICAgICAgICAgICAgLy8gY29vcmQgaXMgZGlmZmVyZW50IHRoYW4gdGlsZS5jb29yZCBmb3Igd3JhcHBlZCB0aWxlcyBzaW5jZSB0aGUgYWN0dWFsXG4gICAgICAgICAgICAvLyB0aWxlIG9iamVjdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlIHZpc2libGUgY29waWVzIG9mIHRoYXQgdGlsZS5cbiAgICAgICAgICAgIGNvb3JkID0gVGlsZUNvb3JkLmZyb21JRChpZHNbaV0pLFxuICAgICAgICAgICAgeiA9IGNvb3JkLnosXG4gICAgICAgICAgICB4ID0gY29vcmQueCxcbiAgICAgICAgICAgIHkgPSBjb29yZC55LFxuICAgICAgICAgICAgdyA9IGNvb3JkLnc7XG5cbiAgICAgICAgLy8gaWYgeiA+IG1heHpvb20gdGhlbiB0aGUgdGlsZSBpcyBhY3R1YWxseSBhIG92ZXJzY2FsZWQgbWF4em9vbSB0aWxlLFxuICAgICAgICAvLyBzbyBjYWxjdWxhdGUgdGhlIG1hdHJpeCB0aGUgbWF4em9vbSB0aWxlIHdvdWxkIHVzZS5cbiAgICAgICAgeiA9IE1hdGgubWluKHosIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgeCArPSB3ICogKDEgPDwgeik7XG4gICAgICAgIHRpbGUuY2FsY3VsYXRlTWF0cmljZXMoeiwgeCwgeSwgcGFpbnRlci50cmFuc2Zvcm0sIHBhaW50ZXIpO1xuXG4gICAgICAgIHBhaW50ZXIuZHJhd1RpbGUodGlsZSwgbGF5ZXJzKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl92ZWN0b3JGZWF0dXJlc0F0ID0gZnVuY3Rpb24oY29vcmQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3B5cmFtaWQpXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBbXSk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fcHlyYW1pZC50aWxlQXQoY29vcmQpO1xuICAgIGlmICghcmVzdWx0KVxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pO1xuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3F1ZXJ5IGZlYXR1cmVzJywge1xuICAgICAgICB1aWQ6IHJlc3VsdC50aWxlLnVpZCxcbiAgICAgICAgeDogcmVzdWx0LngsXG4gICAgICAgIHk6IHJlc3VsdC55LFxuICAgICAgICBzY2FsZTogcmVzdWx0LnNjYWxlLFxuICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgfSwgY2FsbGJhY2ssIHJlc3VsdC50aWxlLndvcmtlcklEKTtcbn07XG5cbi8qXG4gKiBDcmVhdGUgYSB0aWxlZCBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIEVpdGhlciBgcmFzdGVyYCBvciBgdmVjdG9yYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnVybCBBIHRpbGUgc291cmNlIFVSTC4gVGhpcyBzaG91bGQgZWl0aGVyIGJlIGBtYXBib3g6Ly97bWFwaWR9YCBvciBhIGZ1bGwgYGh0dHBbc11gIHVybCB0aGF0IHBvaW50cyB0byBhIFRpbGVKU09OIGVuZHBvaW50LlxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy50aWxlcyBBbiBhcnJheSBvZiB0aWxlIHNvdXJjZXMuIElmIGB1cmxgIGlzIG5vdCBzcGVjaWZpZWQsIGB0aWxlc2AgY2FuIGJlIHVzZWQgaW5zdGVhZCB0byBzcGVjaWZ5IHRpbGUgc291cmNlcywgYXMgaW4gdGhlIFRpbGVKU09OIHNwZWMuIE90aGVyIFRpbGVKU09OIGtleXMgc3VjaCBhcyBgbWluem9vbWAgYW5kIGBtYXh6b29tYCBjYW4gYmUgc3BlY2lmaWVkIGluIGEgc291cmNlIG9iamVjdCBpZiBgdGlsZXNgIGlzIHVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5pZCBBbiBvcHRpb25hbCBgaWRgIHRvIGFzc2lnbiB0byB0aGUgc291cmNlXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGlsZVNpemU9NTEyXSBPcHRpb25hbCB0aWxlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCBhc3N1bWluZyB0aWxlcyBhcmUgc3F1YXJlKS4gVGhpcyBvcHRpb24gaXMgb25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBzb3VyY2VzXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5jYWNoZVNpemUgT3B0aW9uYWwgbWF4IG51bWJlciBvZiB0aWxlcyB0byBjYWNoZSBhdCBhbnkgZ2l2ZW4gdGltZVxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuU291cmNlLmNyZWF0ZSh7XG4gKiAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12NSdcbiAqIH0pO1xuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHNvdXJjZU9iaik7IC8vIGFkZFxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYXQgZmlsZSBzY29wZSBpbiBvcmRlciB0byBhdm9pZCBhIGNpcmN1bGFyIHJlcXVpcmUuXG4gICAgdmFyIHNvdXJjZXMgPSB7XG4gICAgICAgIHZlY3RvcjogcmVxdWlyZSgnLi92ZWN0b3JfdGlsZV9zb3VyY2UnKSxcbiAgICAgICAgcmFzdGVyOiByZXF1aXJlKCcuL3Jhc3Rlcl90aWxlX3NvdXJjZScpLFxuICAgICAgICBnZW9qc29uOiByZXF1aXJlKCcuL2dlb2pzb25fc291cmNlJyksXG4gICAgICAgIHZpZGVvOiByZXF1aXJlKCcuL3ZpZGVvX3NvdXJjZScpXG4gICAgfTtcblxuICAgIGZvciAodmFyIHR5cGUgaW4gc291cmNlcykge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2Ygc291cmNlc1t0eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgc291cmNlc1tzb3VyY2UudHlwZV0oc291cmNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnbG1hdHJpeCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpO1xudmFyIG1hdDIgPSBnbG1hdHJpeC5tYXQyO1xudmFyIG1hdDQgPSBnbG1hdHJpeC5tYXQ0O1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXJTZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGlsZTtcblxuLyoqXG4gKiBBIHRpbGUgb2JqZWN0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIENvb3JkaW5hdGUsIHdoaWNoIGRlZmluZXNcbiAqIGl0cyBwbGFjZSwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBJRCBhbmQgZGF0YSB0cmFja2luZyBmb3IgaXRzIGNvbnRlbnRcbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gVGlsZShjb29yZCwgc2l6ZSkge1xuICAgIHRoaXMuY29vcmQgPSBjb29yZDtcbiAgICB0aGlzLnVpZCA9IHV0aWwudW5pcXVlSWQoKTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudXNlcyA9IDA7XG4gICAgdGhpcy50aWxlU2l6ZSA9IHNpemU7XG59XG5cblRpbGUucHJvdG90eXBlID0ge1xuICAgIC8vIHRvZG8gdW5oYXJkY29kZVxuICAgIHRpbGVFeHRlbnQ6IDQwOTYsXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGludGVybmFsIHBvc01hdHJpeCB0aGF0IHRoaXMgdGlsZSB1c2VzIHRvIGRpc3BsYXlcbiAgICAgKiBpdHNlbGYgaW4gYSBtYXAsIGdpdmVuIGEgY29vcmRpbmF0ZSBhcyAoeiwgeCwgeSkgYW5kIGEgdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlTWF0cmljZXM6IGZ1bmN0aW9uKHosIHgsIHksIHRyYW5zZm9ybSkge1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbW9kZWwtdmlldyBtYXRyaXggdGhhdCBjb252ZXJ0cyBmcm9tIHRoZSB0aWxlIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIHRvIHNjcmVlbiBjb29yZGluYXRlcy5cbiAgICAgICAgdmFyIHRpbGVTY2FsZSA9IE1hdGgucG93KDIsIHopO1xuICAgICAgICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0ud29ybGRTaXplIC8gdGlsZVNjYWxlO1xuXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZVxuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG5cbiAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG1hdHJpeFxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsIHRoaXMucG9zTWF0cml4LCBbeCAqIHNjYWxlLCB5ICogc2NhbGUsIDBdKTtcblxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucG9zTWF0cml4LCB0aGlzLnBvc01hdHJpeCwgWyBzY2FsZSAvIHRoaXMudGlsZUV4dGVudCwgc2NhbGUgLyB0aGlzLnRpbGVFeHRlbnQsIDEgXSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5wb3NNYXRyaXgsIHRyYW5zZm9ybS5nZXRQcm9qTWF0cml4KCksIHRoaXMucG9zTWF0cml4KTtcblxuICAgICAgICAvLyBUaGUgZXh0cnVzaW9uIG1hdHJpeC5cbiAgICAgICAgdGhpcy5leE1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQub3J0aG8odGhpcy5leE1hdHJpeCwgMCwgdHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0LCAwLCAwLCAtMSk7XG4gICAgICAgIC8vbWF0NC5yb3RhdGVaKHRoaXMuZXhNYXRyaXgsIHRoaXMuZXhNYXRyaXgsIC10cmFuc2Zvcm0uYW5nbGUpO1xuXG4gICAgICAgIC8vIDJ4MiBtYXRyaXggZm9yIHJvdGF0aW5nIHBvaW50c1xuICAgICAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gbWF0Mi5jcmVhdGUoKTtcbiAgICAgICAgbWF0Mi5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NNYXRyaXgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGNvb3JkaW5hdGUgcG9zaXRpb24sIHpvb20gdGhhdCBjb29yZGluYXRlIHRvIG15IHpvb20gYW5kXG4gICAgICogc2NhbGUgYW5kIHJldHVybiBhIHBvc2l0aW9uIGluIHgsIHksIHNjYWxlXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb3NpdGlvbkF0OiBmdW5jdGlvbihjb29yZCwgc291cmNlTWF4Wm9vbSkge1xuICAgICAgICBjb29yZCA9IGNvb3JkLnpvb21UbyhNYXRoLm1pbih0aGlzLmNvb3JkLnosIHNvdXJjZU1heFpvb20pKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IChjb29yZC5jb2x1bW4gLSB0aGlzLmNvb3JkLngpICogNDA5NixcbiAgICAgICAgICAgIHk6IChjb29yZC5yb3cgLSB0aGlzLmNvb3JkLnkpICogNDA5NixcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLnNjYWxlXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZGF0YSBvYmplY3Qgd2l0aCBhICdidWZmZXJzJyBwcm9wZXJ0eSwgbG9hZCBpdCBpbnRvXG4gICAgICogdGhpcyB0aWxlJ3MgZWxlbWVudEdyb3VwcyBhbmQgYnVmZmVycyBwcm9wZXJ0aWVzIGFuZCBzZXQgbG9hZGVkXG4gICAgICogdG8gdHJ1ZS4gSWYgdGhlIGRhdGEgaXMgbnVsbCwgbGlrZSBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eVxuICAgICAqIEdlb0pTT04gdGlsZSwgbm8tb3AgYnV0IHN0aWxsIHNldCBsb2FkZWQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkVmVjdG9yRGF0YTogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZW1wdHkgR2VvSlNPTiB0aWxlXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoZGF0YS5idWZmZXJzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzID0gZGF0YS5lbGVtZW50R3JvdXBzO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnQgPSBkYXRhLmV4dGVudDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2l2ZW4gYSBkYXRhIG9iamVjdCBhbmQgYSBHTCBwYWludGVyLCBkZXN0cm95IGFuZCByZS1jcmVhdGVcbiAgICAgKiBhbGwgb2YgaXRzIGJ1ZmZlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFpbnRlclxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWxvYWRTeW1ib2xEYXRhOiBmdW5jdGlvbihkYXRhLCBwYWludGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIC8vIHRoZSB0aWxlIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoVmVydGV4LmRlc3Ryb3kocGFpbnRlci5nbCk7XG4gICAgICAgIHRoaXMuYnVmZmVycy5nbHlwaEVsZW1lbnQuZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25WZXJ0ZXguZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25FbGVtZW50LmRlc3Ryb3kocGFpbnRlci5nbCk7XG4gICAgICAgIHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXguZGVzdHJveShwYWludGVyLmdsKTtcblxuICAgICAgICB2YXIgYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoZGF0YS5idWZmZXJzKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoVmVydGV4ID0gYnVmZmVycy5nbHlwaFZlcnRleDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoRWxlbWVudCA9IGJ1ZmZlcnMuZ2x5cGhFbGVtZW50O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuaWNvblZlcnRleCA9IGJ1ZmZlcnMuaWNvblZlcnRleDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25FbGVtZW50ID0gYnVmZmVycy5pY29uRWxlbWVudDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCA9IGJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4O1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIGRhdGEuZWxlbWVudEdyb3Vwcykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzW2lkXSA9IGRhdGEuZWxlbWVudEdyb3Vwc1tpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIHRoYXQgdGhpcyB0aWxlIGRvZXNuJ3Qgb3duIGFueSBkYXRhIHdpdGhpbiBhIGdpdmVuXG4gICAgICogcGFpbnRlciwgc28gdGhhdCBpdCBkb2Vzbid0IGNvbnN1bWUgYW55IG1lbW9yeSBvciBtYWludGFpblxuICAgICAqIGFueSByZWZlcmVuY2VzIHRvIHRoZSBwYWludGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYWludGVyIGdsIHBhaW50ZXIgb2JqZWN0XG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVubG9hZFZlY3RvckRhdGE6IGZ1bmN0aW9uKHBhaW50ZXIpIHtcbiAgICAgICAgZm9yICh2YXIgYiBpbiB0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyc1tiXS5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IG51bGw7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUaWxlQ29vcmQ7XG5cbmZ1bmN0aW9uIFRpbGVDb29yZCh6LCB4LCB5LCB3KSB7XG4gICAgaWYgKHcgPT09IHVuZGVmaW5lZCkgdyA9IDA7XG4gICAgdGhpcy56ID0gejtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53ID0gdztcblxuICAgIC8vIGNhbGN1bGF0ZSBpZFxuICAgIHcgKj0gMjtcbiAgICBpZiAodyA8IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHZhciBkaW0gPSAxIDw8IHRoaXMuejtcbiAgICB0aGlzLmlkID0gKChkaW0gKiBkaW0gKiB3ICsgZGltICogdGhpcy55ICsgdGhpcy54KSAqIDMyKSArIHRoaXMuejtcbn1cblxuVGlsZUNvb3JkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnogKyBcIi9cIiArIHRoaXMueCArIFwiL1wiICsgdGhpcy55O1xufTtcblxuLy8gUGFyc2UgYSBwYWNrZWQgaW50ZWdlciBpZCBpbnRvIGEgVGlsZUNvb3JkIG9iamVjdFxuVGlsZUNvb3JkLmZyb21JRCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHogPSBpZCAlIDMyLCBkaW0gPSAxIDw8IHo7XG4gICAgdmFyIHh5ID0gKChpZCAtIHopIC8gMzIpO1xuICAgIHZhciB4ID0geHkgJSBkaW0sIHkgPSAoKHh5IC0geCkgLyBkaW0pICUgZGltO1xuICAgIHZhciB3ID0gTWF0aC5mbG9vcih4eSAvIChkaW0gKiBkaW0pKTtcbiAgICBpZiAodyAlIDIgIT09IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHcgLz0gMjtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh6LCB4LCB5LCB3KTtcbn07XG5cbi8vIGdpdmVuIGEgbGlzdCBvZiB1cmxzLCBjaG9vc2UgYSB1cmwgdGVtcGxhdGUgYW5kIHJldHVybiBhIHRpbGUgVVJMXG5UaWxlQ29vcmQucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uKHVybHMsIHNvdXJjZU1heFpvb20pIHtcbiAgICByZXR1cm4gdXJsc1sodGhpcy54ICsgdGhpcy55KSAlIHVybHMubGVuZ3RoXVxuICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAucmVwbGFjZSgne3p9JywgTWF0aC5taW4odGhpcy56LCBzb3VyY2VNYXhab29tIHx8IHRoaXMueikpXG4gICAgICAgIC5yZXBsYWNlKCd7eH0nLCB0aGlzLngpXG4gICAgICAgIC5yZXBsYWNlKCd7eX0nLCB0aGlzLnkpO1xufTtcblxuLy8gUmV0dXJuIHRoZSBjb29yZGluYXRlIG9mIHRoZSBwYXJlbnQgdGlsZVxuVGlsZUNvb3JkLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbihzb3VyY2VNYXhab29tKSB7XG4gICAgaWYgKHRoaXMueiA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyB0aGUgaWQgcmVwcmVzZW50cyBhbiBvdmVyc2NhbGVkIHRpbGUsIHJldHVybiB0aGUgc2FtZSBjb29yZGluYXRlcyB3aXRoIGEgbG93ZXIgelxuICAgIGlmICh0aGlzLnogPiBzb3VyY2VNYXhab29tKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIE1hdGguZmxvb3IodGhpcy54IC8gMiksIE1hdGguZmxvb3IodGhpcy55IC8gMiksIHRoaXMudyk7XG59O1xuXG5UaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosIHRoaXMueCwgdGhpcy55LCAwKTtcbn07XG5cbi8vIFJldHVybiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRpbGUncyBjaGlsZHJlblxuVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHNvdXJjZU1heFpvb20pIHtcblxuICAgIGlmICh0aGlzLnogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcbiAgICAgICAgcmV0dXJuIFtuZXcgVGlsZUNvb3JkKHRoaXMueiArIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpXTtcbiAgICB9XG5cbiAgICB2YXIgeiA9IHRoaXMueiArIDE7XG4gICAgdmFyIHggPSB0aGlzLnggKiAyO1xuICAgIHZhciB5ID0gdGhpcy55ICogMjtcbiAgICByZXR1cm4gW1xuICAgICAgICBuZXcgVGlsZUNvb3JkKHosIHgsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCwgeSArIDEsIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHkgKyAxLCB0aGlzLncpXG4gICAgXTtcbn07XG5cbi8vIFRha2VuIGZyb20gcG9seW1hcHMgc3JjL0xheWVyLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2ltcGxlZ2VvL3BvbHltYXBzL2Jsb2IvbWFzdGVyL3NyYy9MYXllci5qcyNMMzMzLUwzODNcblxuZnVuY3Rpb24gZWRnZShhLCBiKSB7XG4gICAgaWYgKGEucm93ID4gYi5yb3cpIHsgdmFyIHQgPSBhOyBhID0gYjsgYiA9IHQ7IH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MDogYS5jb2x1bW4sXG4gICAgICAgIHkwOiBhLnJvdyxcbiAgICAgICAgeDE6IGIuY29sdW1uLFxuICAgICAgICB5MTogYi5yb3csXG4gICAgICAgIGR4OiBiLmNvbHVtbiAtIGEuY29sdW1uLFxuICAgICAgICBkeTogYi5yb3cgLSBhLnJvd1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNjYW5TcGFucyhlMCwgZTEsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIHZhciB5MSA9IE1hdGgubWluKHltYXgsIE1hdGguY2VpbChlMS55MSkpO1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB4LWNvb3JkaW5hdGVcbiAgICBpZiAoKGUwLngwID09PSBlMS54MCAmJiBlMC55MCA9PT0gZTEueTApID9cbiAgICAgICAgICAgIChlMC54MCArIGUxLmR5IC8gZTAuZHkgKiBlMC5keCA8IGUxLngxKSA6XG4gICAgICAgICAgICAoZTAueDEgLSBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MCkpIHtcbiAgICAgICAgdmFyIHQgPSBlMDsgZTAgPSBlMTsgZTEgPSB0O1xuICAgIH1cblxuICAgIC8vIHNjYW4gbGluZXMhXG4gICAgdmFyIG0wID0gZTAuZHggLyBlMC5keTtcbiAgICB2YXIgbTEgPSBlMS5keCAvIGUxLmR5O1xuICAgIHZhciBkMCA9IGUwLmR4ID4gMDsgLy8gdXNlIHkgKyAxIHRvIGNvbXB1dGUgeDBcbiAgICB2YXIgZDEgPSBlMS5keCA8IDA7IC8vIHVzZSB5ICsgMSB0byBjb21wdXRlIHgxXG4gICAgZm9yICh2YXIgeSA9IHkwOyB5IDwgeTE7IHkrKykge1xuICAgICAgICB2YXIgeDAgPSBtMCAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUwLmR5LCB5ICsgZDAgLSBlMC55MCkpICsgZTAueDA7XG4gICAgICAgIHZhciB4MSA9IG0xICogTWF0aC5tYXgoMCwgTWF0aC5taW4oZTEuZHksIHkgKyBkMSAtIGUxLnkwKSkgKyBlMS54MDtcbiAgICAgICAgc2NhbkxpbmUoTWF0aC5mbG9vcih4MSksIE1hdGguY2VpbCh4MCksIHkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NhblRyaWFuZ2xlKGEsIGIsIGMsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIGFiID0gZWRnZShhLCBiKSxcbiAgICAgICAgYmMgPSBlZGdlKGIsIGMpLFxuICAgICAgICBjYSA9IGVkZ2UoYywgYSk7XG5cbiAgICB2YXIgdDtcblxuICAgIC8vIHNvcnQgZWRnZXMgYnkgeS1sZW5ndGhcbiAgICBpZiAoYWIuZHkgPiBiYy5keSkgeyB0ID0gYWI7IGFiID0gYmM7IGJjID0gdDsgfVxuICAgIGlmIChhYi5keSA+IGNhLmR5KSB7IHQgPSBhYjsgYWIgPSBjYTsgY2EgPSB0OyB9XG4gICAgaWYgKGJjLmR5ID4gY2EuZHkpIHsgdCA9IGJjOyBiYyA9IGNhOyBjYSA9IHQ7IH1cblxuICAgIC8vIHNjYW4gc3BhbiEgc2NhbiBzcGFuIVxuICAgIGlmIChhYi5keSkgc2NhblNwYW5zKGNhLCBhYiwgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xuICAgIGlmIChiYy5keSkgc2NhblNwYW5zKGNhLCBiYywgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xufVxuXG5UaWxlQ29vcmQuY292ZXIgPSBmdW5jdGlvbih6LCBib3VuZHMsIGFjdHVhbFopIHtcbiAgICB2YXIgdGlsZXMgPSAxIDw8IHo7XG4gICAgdmFyIHQgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHNjYW5MaW5lKHgwLCB4MSwgeSkge1xuICAgICAgICB2YXIgeCwgd3g7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgd3ggPSAoeCArIHRpbGVzKSAlIHRpbGVzO1xuICAgICAgICAgICAgICAgIHZhciBjb29yZCA9IG5ldyBUaWxlQ29vcmQoYWN0dWFsWiwgd3gsIHksIE1hdGguZmxvb3IoeCAvIHRpbGVzKSk7XG4gICAgICAgICAgICAgICAgdFtjb29yZC5pZF0gPSBjb29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpdmlkZSB0aGUgc2NyZWVuIHVwIGluIHR3byB0cmlhbmdsZXMgYW5kIHNjYW4gZWFjaCBvZiB0aGVtOlxuICAgIC8vICstLS0vXG4gICAgLy8gfCAvIHxcbiAgICAvLyAvLS0tK1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMF0sIGJvdW5kc1sxXSwgYm91bmRzWzJdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMl0sIGJvdW5kc1szXSwgYm91bmRzWzBdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBDYWNoZSA9IHJlcXVpcmUoJy4uL3V0aWwvbXJ1X2NhY2hlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVQeXJhbWlkO1xuXG4vKipcbiAqIEEgdGlsZSBweXJhbWlkIGlzIGEgc3BlY2lhbGl6ZWQgY2FjaGUgYW5kIGRhdGFzdHJ1Y3R1cmVcbiAqIHRoYXQgY29udGFpbnMgdGlsZXMuIEl0J3MgdXNlZCBieSBzb3VyY2VzIHRvIG1hbmFnZSB0aGVpclxuICogZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1pbnpvb21cbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIFRpbGVQeXJhbWlkKG9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbGVTaXplID0gb3B0aW9ucy50aWxlU2l6ZTtcbiAgICB0aGlzLm1pbnpvb20gPSBvcHRpb25zLm1pbnpvb207XG4gICAgdGhpcy5tYXh6b29tID0gb3B0aW9ucy5tYXh6b29tO1xuICAgIHRoaXMucm91bmRab29tID0gb3B0aW9ucy5yb3VuZFpvb207XG4gICAgdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCA9IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQ7XG4gICAgLy8gZXNyaS9jaGVsbVxuICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXG4gICAgdGhpcy5fbG9hZCA9IG9wdGlvbnMubG9hZDtcbiAgICB0aGlzLl9hYm9ydCA9IG9wdGlvbnMuYWJvcnQ7XG4gICAgdGhpcy5fdW5sb2FkID0gb3B0aW9ucy51bmxvYWQ7XG4gICAgdGhpcy5fYWRkID0gb3B0aW9ucy5hZGQ7XG4gICAgdGhpcy5fcmVtb3ZlID0gb3B0aW9ucy5yZW1vdmU7XG4gICAgdGhpcy5fcmVkb1BsYWNlbWVudCA9IG9wdGlvbnMucmVkb1BsYWNlbWVudDtcblxuICAgIHRoaXMuX3RpbGVzID0ge307XG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgQ2FjaGUob3B0aW9ucy5jYWNoZVNpemUsIGZ1bmN0aW9uKHRpbGUpIHsgcmV0dXJuIHRoaXMuX3VubG9hZCh0aWxlKTsgfS5iaW5kKHRoaXMpKTtcbn1cblxuVGlsZVB5cmFtaWQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENvbmZpcm0gdGhhdCBldmVyeSB0cmFja2VkIHRpbGUgaXMgbG9hZGVkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIGFsbCB0aWxlcyBhcmUgbG9hZGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl90aWxlc1t0XS5sb2FkZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIHRpbGUgaWRzIG9yZGVyZWQgd2l0aCB6LW9yZGVyLCBhbmQgY2FzdCB0byBudW1iZXJzXG4gICAgICogQHJldHVybnMge0FycmF5PG51bWJlcj59IGlkc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb3JkZXJlZElEczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl90aWxlcylcbiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIChiICUgMzIpIC0gKGEgJSAzMik7IH0pXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGlkKSB7IHJldHVybiAraWQ7IH0pO1xuICAgIH0sXG5cbiAgICByZW5kZXJlZElEczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyZWRJRHMoKS5maWx0ZXIoZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF0ubG9hZGVkICYmICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkKHRoaXMuX3RpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IGlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCB0aWxlIGlkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0VGlsZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSB6b29tIGxldmVsIGFkanVzdGVkIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBtYXAgYW5kIHNvdXJjZSB0aWxlc2l6ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICogQHJldHVybnMge251bWJlcn0gem9vbSBsZXZlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0Wm9vbTogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0uem9vbSArIE1hdGgubG9nKHRyYW5zZm9ybS50aWxlU2l6ZSAvIHRoaXMudGlsZVNpemUpIC8gTWF0aC5MTjI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHpvb20gbGV2ZWwgdGhhdCB3aWxsIGNvdmVyIGFsbCB0aWxlcyBpbiBhIGdpdmVuIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB6b29tIGxldmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1pvb21MZXZlbDogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikodGhpcy5nZXRab29tKHRyYW5zZm9ybSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHRyYW5zZm9ybSwgcmV0dXJuIGFsbCBjb29yZGluYXRlcyB0aGF0IGNvdWxkIGNvdmVyIHRoYXRcbiAgICAgKiB0cmFuc2Zvcm0gZm9yIGEgY292ZXJpbmcgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICogQHJldHVybnMge0FycmF5PFRpbGU+fSB0aWxlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlczogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciB6ID0gdGhpcy5jb3ZlcmluZ1pvb21MZXZlbCh0cmFuc2Zvcm0pO1xuICAgICAgICB2YXIgYWN0dWFsWiA9IHo7XG5cbiAgICAgICAgaWYgKHogPCB0aGlzLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHogPiB0aGlzLm1heHpvb20pIHogPSB0aGlzLm1heHpvb207XG5cbiAgICAgICAgdmFyIHRyID0gdHJhbnNmb3JtLFxuICAgICAgICAgICAgdGlsZUNlbnRlciA9IHRyLmxvY2F0aW9uQ29vcmRpbmF0ZSh0ci5jZW50ZXIpLl96b29tVG8oeiksXG4gICAgICAgICAgICBjZW50ZXJQb2ludCA9IG5ldyBQb2ludCh0aWxlQ2VudGVyLmNvbHVtbiAtIDAuNSwgdGlsZUNlbnRlci5yb3cgLSAwLjUpO1xuXG4gICAgICAgIHJldHVybiBUaWxlQ29vcmQuY292ZXIoeiwgW1xuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCAwKSkuX3pvb21Ubyh6KSxcbiAgICAgICAgICAgIHRyLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodHIud2lkdGgsIDApKS5fem9vbVRvKHopLFxuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0ci53aWR0aCwgdHIuaGVpZ2h0KSkuX3pvb21Ubyh6KSxcbiAgICAgICAgICAgIHRyLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgdHIuaGVpZ2h0KSkuX3pvb21Ubyh6KVxuICAgICAgICBdLCB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID8gYWN0dWFsWiA6IHopLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGNlbnRlclBvaW50LmRpc3QoYSkgLSBjZW50ZXJQb2ludC5kaXN0KGIpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmluZCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWF4Q292ZXJpbmdab29tKSB0aGF0IGFyZSBhbHJlYWR5IGxvYWRlZDtcbiAgICAgKiBhZGRzIGZvdW5kIHRpbGVzIHRvIHJldGFpbiBvYmplY3Q7IHJldHVybnMgdHJ1ZSBpZiBjaGlsZHJlbiBjb21wbGV0ZWx5IGNvdmVyIHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heENvdmVyaW5nWm9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV0YWluXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbmRMb2FkZWRDaGlsZHJlbjogZnVuY3Rpb24oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIHZhciBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHZhciB6ID0gY29vcmQuejtcbiAgICAgICAgdmFyIGNvb3JkcyA9IGNvb3JkLmNoaWxkcmVuKHRoaXMubWF4em9vbSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaWQgPSBjb29yZHNbaV0uaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaWRdICYmIHRoaXMuX3RpbGVzW2lkXS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoeiA8IG1heENvdmVyaW5nWm9vbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBHbyBmdXJ0aGVyIGRvd24gdGhlIGhpZXJhcmNoeSB0byBmaW5kIG1vcmUgdW5sb2FkZWQgY2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZExvYWRlZENoaWxkcmVuKGNvb3Jkc1tpXSwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGxldGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBsb2FkZWQgcGFyZW50IG9mIHRoZSBnaXZlbiB0aWxlICh1cCB0byBtaW5Db3ZlcmluZ1pvb20pO1xuICAgICAqIGFkZHMgdGhlIGZvdW5kIHRpbGUgdG8gcmV0YWluIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgdGlsZSBpZiBmb3VuZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5Db3ZlcmluZ1pvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldGFpblxuICAgICAqIEByZXR1cm5zIHtUaWxlfSB0aWxlIG9iamVjdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmluZExvYWRlZFBhcmVudDogZnVuY3Rpb24oY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIGZvciAodmFyIHogPSBjb29yZC56IC0gMTsgeiA+PSBtaW5Db3ZlcmluZ1pvb207IHotLSkge1xuICAgICAgICAgICAgY29vcmQgPSBjb29yZC5wYXJlbnQodGhpcy5tYXh6b29tKTtcbiAgICAgICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbY29vcmQuaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRpbGVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IGFuZCBhZGRzIG5ldyB0aWxlcyB0aGF0XG4gICAgICogYXJlIGluc2lkZSB0aGUgdmlld3BvcnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKHVzZWQsIHRyYW5zZm9ybSwgZmFkZUR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgY29vcmQ7XG4gICAgICAgIHZhciB0aWxlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgb3Zlcnpvb21pbmcvdW5kZXJ6b29taW5nIGFtb3VudHMuXG4gICAgICAgIHZhciB6b29tID0gKHRoaXMucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKHRoaXMuZ2V0Wm9vbSh0cmFuc2Zvcm0pKTtcbiAgICAgICAgdmFyIG1pbkNvdmVyaW5nWm9vbSA9IHV0aWwuY2xhbXAoem9vbSAtIDEwLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG4gICAgICAgIHZhciBtYXhDb3ZlcmluZ1pvb20gPSB1dGlsLmNsYW1wKHpvb20gKyAxLCAgdGhpcy5taW56b29tLCB0aGlzLm1heHpvb20pO1xuXG4gICAgICAgIC8vIFJldGFpbiBpcyBhIGxpc3Qgb2YgdGlsZXMgdGhhdCB3ZSBzaG91bGRuJ3QgZGVsZXRlLCBldmVuIGlmIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyB0aGUgbW9zdCBpZGVhbCB0aWxlIGZvciB0aGUgY3VycmVudCB2aWV3cG9ydC4gVGhpcyBtYXkgaW5jbHVkZSB0aWxlcyBsaWtlXG4gICAgICAgIC8vIHBhcmVudCBvciBjaGlsZCB0aWxlcyB0aGF0IGFyZSAqYWxyZWFkeSogbG9hZGVkLlxuICAgICAgICB2YXIgcmV0YWluID0ge307XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICAvLyBDb3ZlcmVkIGlzIGEgbGlzdCBvZiByZXRhaW5lZCB0aWxlcyB3aG8ncyBhcmVhcyBhcmUgZnVsbCBjb3ZlcmVkIGJ5IG90aGVyLFxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG5cbiAgICAgICAgdmFyIHJlcXVpcmVkID0gdXNlZCA/IHRoaXMuY292ZXJpbmdUaWxlcyh0cmFuc2Zvcm0pIDogW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29vcmQgPSByZXF1aXJlZFtpXTtcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLmFkZFRpbGUoY29vcmQpO1xuXG4gICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBUaGUgdGlsZSB3ZSByZXF1aXJlIGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAgICAgICAgLy8gUmV0YWluIGNoaWxkIG9yIHBhcmVudCB0aWxlcyB0aGF0IGNvdmVyIHRoZSBzYW1lIGFyZWEuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmluZExvYWRlZENoaWxkcmVuKGNvb3JkLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHJldGFpbikge1xuICAgICAgICAgICAgY29vcmQgPSBUaWxlQ29vcmQuZnJvbUlEKGlkKTtcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLnRpbWVBZGRlZCA+IG5vdyAtIChmYWRlRHVyYXRpb24gfHwgMCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRpbGUgaXMgc3RpbGwgZmFkaW5nIGluLiBGaW5kIHRpbGVzIHRvIGNyb3NzLWZhZGUgd2l0aCBpdC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2lkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCBtaW5Db3ZlcmluZ1pvb20sIHJldGFpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0aWxlcyB3ZSBkb24ndCBuZWVkIGFueW1vcmUuXG4gICAgICAgIHZhciByZW1vdmUgPSB1dGlsLmtleXNEaWZmZXJlbmNlKHRoaXMuX3RpbGVzLCByZXRhaW4pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoK3JlbW92ZVtpXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZSwgZ2l2ZW4gaXRzIGNvb3JkaW5hdGUsIHRvIHRoZSBweXJhbWlkLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX0gdGhlIGNvb3JkaW5hdGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRUaWxlOiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3RpbGVzW2Nvb3JkLmlkXTtcbiAgICAgICAgaWYgKHRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcblxuICAgICAgICB2YXIgd3JhcHBlZCA9IGNvb3JkLndyYXBwZWQoKTtcbiAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3dyYXBwZWQuaWRdO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgdGlsZSA9IHRoaXMuX2NhY2hlLmdldCh3cmFwcGVkLmlkKTtcbiAgICAgICAgICAgIGlmICh0aWxlICYmIHRoaXMuX3JlZG9QbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWRvUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICB2YXIgem9vbSA9IGNvb3JkLno7XG4gICAgICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB6b29tID4gdGhpcy5tYXh6b29tID8gTWF0aC5wb3coMiwgem9vbSAtIHRoaXMubWF4em9vbSkgOiAxO1xuICAgICAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHdyYXBwZWQsIHRoaXMudGlsZVNpemUgKiBvdmVyc2NhbGluZyk7XG4gICAgICAgICAgICAvLyBlc3JpL2NoZWxtXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICB0aWxlLnBhcmVudElkID0gdGhpcy5pbmRleFNlYXJjaChjb29yZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2FkKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGlsZS51c2VzKys7XG4gICAgICAgIHRoaXMuX3RpbGVzW2Nvb3JkLmlkXSA9IHRpbGU7XG4gICAgICAgIHRoaXMuX2FkZCh0aWxlLCBjb29yZCk7XG5cbiAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRpbGUsIGdpdmVuIGl0cyBpZCwgZnJvbSB0aGUgcHlyYW1pZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgdGlsZSBpZFxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9IG5vdGhpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbW92ZVRpbGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGlsZS51c2VzLS07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIHRoaXMuX3JlbW92ZSh0aWxlKTtcblxuICAgICAgICBpZiAodGlsZS51c2VzID4gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmFkZCh0aWxlLmNvb3JkLndyYXBwZWQoKS5pZCwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhclRpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fdGlsZXMpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoaWQpO1xuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiBjb29yZGluYXRlLCBzZWFyY2ggdGhyb3VnaCBvdXIgY3VycmVudCB0aWxlcyBhbmQgYXR0ZW1wdFxuICAgICAqIHRvIGZpbmQgYSB0aWxlIGF0IHRoYXQgcG9pbnRcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGlsZUF0OiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgaWRzID0gdGhpcy5vcmRlcmVkSURzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3RpbGVzW2lkc1tpXV07XG4gICAgICAgICAgICB2YXIgcG9zID0gdGlsZS5wb3NpdGlvbkF0KGNvb3JkLCB0aGlzLm1heHpvb20pO1xuICAgICAgICAgICAgaWYgKHBvcyAmJiBwb3MueCA+PSAwICYmIHBvcy54IDwgNDA5NiAmJiBwb3MueSA+PSAwICYmIHBvcy55IDwgNDA5Nikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBjbGljayBpcyB3aXRoaW4gdGhlIHZpZXdwb3J0LiBUaGVyZSBpcyBvbmx5IGV2ZXIgb25lIHRpbGUgaW5cbiAgICAgICAgICAgICAgICAvLyBhIGxheWVyIHRoYXQgaGFzIHRoaXMgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZTogdGlsZSxcbiAgICAgICAgICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICAgICAgICAgIHk6IHBvcy55LFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogcG9zLnNjYWxlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiB0aWxlIGlkIGZpbmQgaXRzIHBhcmVudCB0aWxlIGZyb20gdGhlIGluZGV4XG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCB0aWxlIGlkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW5kZXhTZWFyY2g6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgdGlsZSA9IFRpbGVDb29yZC5mcm9tSUQoaWQpO1xuXG4gICAgICAgIHZhciBpZHMgPSBbXTtcblxuICAgICAgICB2YXIgcGFyZW50VGlsZSA9IHRpbGU7XG4gICAgICAgIHdoaWxlIChpZCAhPT0gMCkge1xuICAgICAgICAgIHBhcmVudFRpbGUgPSBwYXJlbnRUaWxlLnBhcmVudChpZCk7XG4gICAgICAgICAgaWQgPSBwYXJlbnRUaWxlLmlkO1xuICAgICAgICAgIGlkcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgY3Vyc29ySWQgPSBpZHMucG9wKCksXG4gICAgICAgICAgICBpbmRleDtcblxuICAgICAgICB3aGlsZSAoaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWQgPSBpZHMucG9wKCk7XG4gICAgICAgICAgICBpbmRleCA9IHRpbGUuY2hpbGRyZW4oY3Vyc29ySWQpLmluZGV4T2YoaWQpO1xuICAgICAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgICBpZiAoY3Vyc29yW2luZGV4XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlkID0gY3Vyc29ySWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yW2luZGV4XSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnNvcklkID0gaWQ7XG4gICAgICAgICAgICAgICAgY3Vyc29yID0gY3Vyc29yW2luZGV4XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRpbGVDb29yZC5mcm9tSUQoaWQpLmlkO1xuXG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBTb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVTb3VyY2U7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVTb3VyY2Uob3B0aW9ucykge1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICd0aWxlU2l6ZSddKSk7XG5cbiAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcbiAgICB9XG5cbiAgICBTb3VyY2UuX2xvYWRUaWxlSlNPTi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5WZWN0b3JUaWxlU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAyMixcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0cnVlLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fcHlyYW1pZCkge1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWRvUGxhY2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9weXJhbWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWRzID0gdGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pO1xuICAgICAgICAgICAgdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBTb3VyY2UuX3JlbmRlclRpbGVzLFxuICAgIGZlYXR1cmVzQXQ6IFNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxcblxuICAgIF9sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB0aWxlLmNvb3JkLnogPiB0aGlzLm1heHpvb20gPyBNYXRoLnBvdygyLCB0aWxlLmNvb3JkLnogLSB0aGlzLm1heHpvb20pIDogMTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHVybDogdGlsZS5jb29yZC51cmwodGhpcy50aWxlcywgdGhpcy5tYXh6b29tKSxcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBjb29yZDogdGlsZS5jb29yZCxcbiAgICAgICAgICAgIHpvb206IHRpbGUuY29vcmQueixcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkRlYnVnOiB0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHJlcXVlc3QgdGhlIHRpbGUgcGFyZW50SUQgaWYgaXQgZXhpc3RzXG4gICAgICAgIGlmICh0aWxlLnBhcmVudElkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhUaWxlQ29vcmQuZnJvbUlEKHRpbGUucGFyZW50SUQpKVxuICAgICAgICAgICAgcGFyYW1zLnVybCA9IFRpbGVDb29yZC5mcm9tSUQodGlsZS5wYXJlbnRJRCkudXJsKHRoaXMudGlsZXMsIHRoaXMubWF4em9vbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGlsZS53b3JrZXJJRCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbG9hZCB0aWxlJywgcGFyYW1zLCB0aGlzLl90aWxlTG9hZGVkLmJpbmQodGhpcywgdGlsZSksIHRpbGUud29ya2VySUQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkIHRpbGUnLCBwYXJhbXMsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3RpbGVMb2FkZWQ6IGZ1bmN0aW9uKHRpbGUsIGVyciwgZGF0YSkge1xuICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEpO1xuXG4gICAgICAgIGlmICh0aWxlLnJlZG9XaGVuRG9uZSkge1xuICAgICAgICAgICAgdGlsZS5yZWRvV2hlbkRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfYWJvcnRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdhYm9ydCB0aWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgbnVsbCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9hZGRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5hZGQnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUucmVtb3ZlJywge3RpbGU6IHRpbGV9KTtcbiAgICB9LFxuXG4gICAgX3VubG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpO1xuICAgICAgICB0aGlzLmdseXBoQXRsYXMucmVtb3ZlR2x5cGhzKHRpbGUudWlkKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZSB0aWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgbnVsbCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9yZWRvVGlsZVBsYWNlbWVudDogZnVuY3Rpb24odGlsZSkge1xuXG4gICAgICAgIGlmICghdGlsZS5sb2FkZWQgfHwgdGlsZS5yZWRvaW5nUGxhY2VtZW50KSB7XG4gICAgICAgICAgICB0aWxlLnJlZG9XaGVuRG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLnJlZG9pbmdQbGFjZW1lbnQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZWRvIHBsYWNlbWVudCcsIHtcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkRlYnVnOiB0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z1xuICAgICAgICB9LCBkb25lLmJpbmQodGhpcyksIHRpbGUud29ya2VySUQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoXywgZGF0YSkge1xuICAgICAgICAgICAgdGlsZS5yZWxvYWRTeW1ib2xEYXRhKGRhdGEsIHRoaXMubWFwLnBhaW50ZXIpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuXG4gICAgICAgICAgICB0aWxlLnJlZG9pbmdQbGFjZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnJlZG9XaGVuRG9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICAgICAgICAgIHRpbGUucmVkb1doZW5Eb25lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWRlb1NvdXJjZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBWaWRlbyBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICogQGNsYXNzIFZpZGVvU291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gb3B0aW9ucy51cmwgQSBzdHJpbmcgb3IgYXJyYXkgb2YgVVJMKHMpIHRvIHZpZGVvIGZpbGVzXG4gKiBAcGFyYW0ge0FycmF5fSBvcHRpb25zLmNvb3JkaW5hdGVzIGxhdCxsbmcgY29vcmRpbmF0ZXMgaW4gb3JkZXIgY2xvY2t3aXNlIHN0YXJ0aW5nIGF0IHRoZSB0b3AgbGVmdDogdGwsIHRyLCBiciwgYmxcbiAqIEBleGFtcGxlXG4gKiB2YXIgc291cmNlT2JqID0gbmV3IG1hcGJveGdsLlZpZGVvU291cmNlKHtcbiAqICAgIHVybDogW1xuICogICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL3ZpZGVvcy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS92aWRlb3MvYmFsdGltb3JlLXNtb2tlLndlYm0nXG4gKiAgICBdLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbMzkuMTg1Nzk5MDcyMjk3NDgsIC03Ni41NDMzNTczNzIyODM5NF0sXG4gKiAgICAgICAgWzM5LjE4MzgzNjQ4NDc1ODcsIC03Ni41MjgwMzY1OTQzOTA4N10sXG4gKiAgICAgICAgWzM5LjE3NjgzMzkyNTA3NjA2LCAtNzYuNTI5NTM4NjMxNDM5Ml0sXG4gKiAgICAgICAgWzM5LjE3ODc2MzQ0MTA2NjQyLCAtNzYuNTQ1MjAyNzMyMDg2MThdXG4gKiAgICBdXG4gKiB9KTtcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCBzb3VyY2VPYmopOyAvLyBhZGRcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5mdW5jdGlvbiBWaWRlb1NvdXJjZShvcHRpb25zKSB7XG4gICAgdGhpcy5jb29yZGluYXRlcyA9IG9wdGlvbnMuY29vcmRpbmF0ZXM7XG5cbiAgICBhamF4LmdldFZpZGVvKG9wdGlvbnMudXJsLCBmdW5jdGlvbihlcnIsIHZpZGVvKSB7XG4gICAgICAgIC8vIEBUT0RPIGhhbmRsZSBlcnJvcnMgdmlhIGV2ZW50LlxuICAgICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgICAgICB0aGlzLnZpZGVvLmxvb3AgPSB0cnVlO1xuXG4gICAgICAgIHZhciBsb29wSUQ7XG5cbiAgICAgICAgLy8gc3RhcnQgcmVwYWludGluZyB3aGVuIHZpZGVvIHN0YXJ0cyBwbGF5aW5nXG4gICAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbG9vcElEID0gdGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5zZXQoSW5maW5pdHkpO1xuICAgICAgICAgICAgdGhpcy5tYXAuX3JlcmVuZGVyKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gc3RvcCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RvcHNcbiAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5jYW5jZWwobG9vcElEKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRpbGUoKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpO1xufVxuXG5WaWRlb1NvdXJjZS5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoRXZlbnRlZCwgLyoqIEBsZW5kcyBWaWRlb1NvdXJjZS5wcm90b3R5cGUgKi97XG4gICAgcm91bmRab29tOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBIVE1MIHZpZGVvIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFZpZGVvOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGlsZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBDYWxjdWxhdGUgd2hpY2ggbWVyY2F0b3IgdGlsZSBpcyBzdWl0YWJsZSBmb3IgcmVuZGVyaW5nIHRoZSB2aWRlbyBpblxuICAgICAgICAgKiBhbmQgY3JlYXRlIGEgYnVmZmVyIHdpdGggdGhlIGNvcm5lciBjb29yZGluYXRlcy4gVGhlc2UgY29vcmRpbmF0ZXNcbiAgICAgICAgICogbWF5IGJlIG91dHNpZGUgdGhlIHRpbGUsIGJlY2F1c2UgcmFzdGVyIHRpbGVzIGFyZW4ndCBjbGlwcGVkIHdoZW4gcmVuZGVyaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwO1xuICAgICAgICB2YXIgY29vcmRzID0gdGhpcy5jb29yZGluYXRlcy5tYXAoZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgICAgICB2YXIgbG9jID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgICAgIHJldHVybiBtYXAudHJhbnNmb3JtLmxvY2F0aW9uQ29vcmRpbmF0ZShsb2MpLnpvb21UbygwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIHZhciBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHggPSBtYXhYIC0gbWluWDtcbiAgICAgICAgdmFyIGR5ID0gbWF4WSAtIG1pblk7XG4gICAgICAgIHZhciBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICAgICAgdmFyIGNlbnRlciA9IG5ldyBDb29yZGluYXRlKChtaW5YICsgbWF4WCkgLyAyLCAobWluWSArIG1heFkpIC8gMiwgMClcbiAgICAgICAgICAgIC56b29tVG8oTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuXG4gICAgICAgIHZhciB0aWxlRXh0ZW50ID0gNDA5NjtcbiAgICAgICAgdmFyIHRpbGVDb29yZHMgPSBjb29yZHMubWFwKGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgICAgICB2YXIgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8oY2VudGVyLnpvb20pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh6b29tZWRDb29yZC5jb2x1bW4gLSBjZW50ZXIuY29sdW1uKSAqIHRpbGVFeHRlbnQpLFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpvb21lZENvb3JkLnJvdyAtIGNlbnRlci5yb3cpICogdGlsZUV4dGVudCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZ2wgPSBtYXAucGFpbnRlci5nbDtcbiAgICAgICAgdmFyIG1heEludDE2ID0gMzI3Njc7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgICAgIHRpbGVDb29yZHNbMF0ueCwgdGlsZUNvb3Jkc1swXS55LCAwLCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1sxXS54LCB0aWxlQ29vcmRzWzFdLnksIG1heEludDE2LCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1szXS54LCB0aWxlQ29vcmRzWzNdLnksIDAsIG1heEludDE2LFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1syXS54LCB0aWxlQ29vcmRzWzJdLnksIG1heEludDE2LCBtYXhJbnQxNlxuICAgICAgICBdKTtcblxuICAgICAgICB0aGlzLnRpbGUgPSBuZXcgVGlsZSgpO1xuICAgICAgICB0aGlzLnRpbGUuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8gJiYgdGhpcy52aWRlby5yZWFkeVN0YXRlID49IDI7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuXG4gICAgcmVsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxheWVycywgcGFpbnRlcikge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy52aWRlby5yZWFkeVN0YXRlIDwgMikgcmV0dXJuOyAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGN1cnJlbnQgcG9zaXRpb25cblxuICAgICAgICB2YXIgYyA9IHRoaXMuY2VudGVyO1xuICAgICAgICB0aGlzLnRpbGUuY2FsY3VsYXRlTWF0cmljZXMoYy56b29tLCBjLmNvbHVtbiwgYy5yb3csIHRoaXMubWFwLnRyYW5zZm9ybSwgcGFpbnRlcik7XG5cbiAgICAgICAgdmFyIGdsID0gcGFpbnRlci5nbDtcbiAgICAgICAgaWYgKCF0aGlzLnRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy52aWRlbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMudmlkZW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFpbnRlci5kcmF3TGF5ZXJzKGxheWVycywgdGhpcy50aWxlLnBvc01hdHJpeCwgdGhpcy50aWxlKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24ocG9pbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFjdG9yID0gcmVxdWlyZSgnLi4vdXRpbC9hY3RvcicpO1xudmFyIFdvcmtlclRpbGUgPSByZXF1aXJlKCcuL3dvcmtlcl90aWxlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciB2dCA9IHJlcXVpcmUoJ3ZlY3Rvci10aWxlJyk7XG52YXIgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcblxudmFyIGdlb2pzb252dCA9IHJlcXVpcmUoJ2dlb2pzb24tdnQnKTtcbnZhciBHZW9KU09OV3JhcHBlciA9IHJlcXVpcmUoJy4vZ2VvanNvbl93cmFwcGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc2VsZikge1xuICAgIHJldHVybiBuZXcgV29ya2VyKHNlbGYpO1xufTtcblxuZnVuY3Rpb24gV29ya2VyKHNlbGYpIHtcbiAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG4gICAgdGhpcy5sb2FkaW5nID0ge307XG5cbiAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgdGhpcy5nZW9KU09OSW5kZXhlcyA9IHt9O1xufVxuXG51dGlsLmV4dGVuZChXb3JrZXIucHJvdG90eXBlLCB7XG4gICAgJ3NldCBsYXllcnMnOiBmdW5jdGlvbihsYXllcnMpIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBsYXllcnM7XG4gICAgfSxcblxuICAgICdsb2FkIHRpbGUnOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJhbXMuc291cmNlLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAoIXRoaXMubG9hZGluZ1tzb3VyY2VdKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nW3NvdXJjZV0gPSB7fTtcblxuXG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXSA9IG5ldyBXb3JrZXJUaWxlKHBhcmFtcyk7XG5cbiAgICAgICAgdGlsZS54aHIgPSBhamF4LmdldEFycmF5QnVmZmVyKHBhcmFtcy51cmwsIGRvbmUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdbc291cmNlXVt1aWRdO1xuXG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgdGlsZS5kYXRhID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKG5ldyBVaW50OEFycmF5KGRhdGEpKSk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmlkICE9PSBwYXJhbXMucGFyZW50SWQgJiYgdGlsZS5kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIHZhciB0aWxlUG9zID0gdGlsZS5jb29yZC5mcm9tSUQocGFyYW1zLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UG9zID0gdGlsZS5jb29yZC5mcm9tSUQocGFyYW1zLnBhcmVudElkKTtcbiAgICAgICAgICAgICAgICB2YXIgZHogPSB0aWxlUG9zLnogLSBwYXJlbnRQb3MuejtcbiAgICAgICAgICAgICAgICB2YXIgeFBvcyA9IHRpbGVQb3MueCAmICgoMSA8PCBkeikgLSAxKTtcbiAgICAgICAgICAgICAgICB2YXIgeVBvcyA9IHRpbGVQb3MueSAmICgoMSA8PCBkeikgLSAxKTtcbiAgICAgICAgICAgICAgICB0aWxlLnBhcnNlKHRpbGUuZGF0YSwgdGhpcy5sYXllcnMsIHRoaXMuYWN0b3IsIGNhbGxiYWNrLCBkeiwgeFBvcywgeVBvcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aWxlLnBhcnNlKHRpbGUuZGF0YSwgdGhpcy5sYXllcnMsIHRoaXMuYWN0b3IsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXSA9IHRoaXMubG9hZGVkW3NvdXJjZV0gfHwge307XG4gICAgICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdW3VpZF0gPSB0aWxlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZWxvYWQgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGxvYWRlZCA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHRpbGUgPSBsb2FkZWRbdWlkXTtcbiAgICAgICAgICAgIHRpbGUucGFyc2UodGlsZS5kYXRhLCB0aGlzLmxheWVycywgdGhpcy5hY3RvciwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdhYm9ydCB0aWxlJzogZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdKSB7XG4gICAgICAgICAgICBsb2FkaW5nW3VpZF0ueGhyLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZW1vdmUgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ3JlZG8gcGxhY2VtZW50JzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxvYWRlZFt1aWRdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRpbGUucmVkb1BsYWNlbWVudChwYXJhbXMuYW5nbGUsIHBhcmFtcy5waXRjaCwgcGFyYW1zLmNvbGxpc2lvbkRlYnVnKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQucmVzdWx0LCByZXN1bHQudHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nICYmIGxvYWRpbmdbdWlkXSkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFuZ2xlID0gcGFyYW1zLmFuZ2xlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdwYXJzZSBnZW9qc29uJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaW5kZXhEYXRhID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHRoaXMuZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV0gPSBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAvLyBUT0RPIGFjY2VwdCBwYXJhbXMudXJsIGZvciB1cmxzIGluc3RlYWRcblxuICAgICAgICAvLyBOb3QsIGJlY2F1c2Ugb2Ygc2FtZSBvcmlnaW4gaXNzdWVzLCB1cmxzIG11c3QgZWl0aGVyIGluY2x1ZGUgYW5cbiAgICAgICAgLy8gZXhwbGljaXQgb3JpZ2luIG9yIGFic29sdXRlIHBhdGguXG4gICAgICAgIC8vIGllOiAvZm9vL2Jhci5qc29uIG9yIGh0dHA6Ly9leGFtcGxlLmNvbS9iYXIuanNvblxuICAgICAgICAvLyBidXQgbm90IC4uL2Zvby9iYXIuanNvblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYWpheC5nZXRKU09OKHBhcmFtcy5kYXRhLCBpbmRleERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5kZXhEYXRhKG51bGwsIHBhcmFtcy5kYXRhKTtcbiAgICB9LFxuXG4gICAgJ2xvYWQgZ2VvanNvbiB0aWxlJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc291cmNlID0gcGFyYW1zLnNvdXJjZSxcbiAgICAgICAgICAgIGNvb3JkID0gcGFyYW1zLmNvb3JkO1xuXG4gICAgICAgIC8vIGNvbnNvbGUudGltZSgndGlsZSAnICsgY29vcmQueiArICcgJyArIGNvb3JkLnggKyAnICcgKyBjb29yZC55KTtcblxuICAgICAgICB2YXIgZ2VvSlNPTlRpbGUgPSB0aGlzLmdlb0pTT05JbmRleGVzW3NvdXJjZV0uZ2V0VGlsZShjb29yZC56LCBjb29yZC54LCBjb29yZC55KTtcblxuICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3RpbGUgJyArIGNvb3JkLnogKyAnICcgKyBjb29yZC54ICsgJyAnICsgY29vcmQueSk7XG5cbiAgICAgICAgLy8gaWYgKCFnZW9KU09OVGlsZSkgY29uc29sZS5sb2coJ25vdCBmb3VuZCcsIHRoaXMuZ2VvSlNPTkluZGV4ZXNbc291cmNlXSwgY29vcmQpO1xuXG4gICAgICAgIGlmICghZ2VvSlNPTlRpbGUpIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgLy8gbm90aGluZyBpbiB0aGUgZ2l2ZW4gdGlsZVxuXG4gICAgICAgIHZhciB0aWxlID0gbmV3IFdvcmtlclRpbGUocGFyYW1zKTtcbiAgICAgICAgdGlsZS5wYXJzZShuZXcgR2VvSlNPTldyYXBwZXIoZ2VvSlNPTlRpbGUuZmVhdHVyZXMpLCB0aGlzLmxheWVycywgdGhpcy5hY3RvciwgY2FsbGJhY2spO1xuXG4gICAgICAgIHRoaXMubG9hZGVkW3NvdXJjZV0gPSB0aGlzLmxvYWRlZFtzb3VyY2VdIHx8IHt9O1xuICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdW3BhcmFtcy51aWRdID0gdGlsZTtcbiAgICB9LFxuXG4gICAgJ3F1ZXJ5IGZlYXR1cmVzJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdICYmIHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdW3BhcmFtcy51aWRdO1xuICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgdGlsZS5mZWF0dXJlVHJlZS5xdWVyeShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRmVhdHVyZVRyZWUgPSByZXF1aXJlKCcuLi9kYXRhL2ZlYXR1cmVfdHJlZScpO1xudmFyIENvbGxpc2lvblRpbGUgPSByZXF1aXJlKCcuLi9zeW1ib2wvY29sbGlzaW9uX3RpbGUnKTtcbnZhciBCdWZmZXJTZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0Jyk7XG52YXIgY3JlYXRlQnVja2V0ID0gcmVxdWlyZSgnLi4vZGF0YS9jcmVhdGVfYnVja2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV29ya2VyVGlsZTtcblxuZnVuY3Rpb24gV29ya2VyVGlsZShwYXJhbXMpIHtcbiAgICB0aGlzLmNvb3JkID0gcGFyYW1zLmNvb3JkO1xuICAgIHRoaXMudWlkID0gcGFyYW1zLnVpZDtcbiAgICB0aGlzLnpvb20gPSBwYXJhbXMuem9vbTtcbiAgICB0aGlzLm1heFpvb20gPSBwYXJhbXMubWF4Wm9vbTtcbiAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xuICAgIHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgICB0aGlzLm92ZXJzY2FsaW5nID0gcGFyYW1zLm92ZXJzY2FsaW5nO1xuICAgIHRoaXMuYW5nbGUgPSBwYXJhbXMuYW5nbGU7XG4gICAgdGhpcy5waXRjaCA9IHBhcmFtcy5waXRjaDtcbiAgICB0aGlzLmNvbGxpc2lvbkRlYnVnID0gcGFyYW1zLmNvbGxpc2lvbkRlYnVnO1xuXG4gICAgdGhpcy5zdGFja3MgPSB7fTtcbn1cblxuV29ya2VyVGlsZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihkYXRhLCBsYXllcnMsIGFjdG9yLCBjYWxsYmFjaywgZHosIHhQb3MsIHlQb3MpIHtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuXG4gICAgdGhpcy5mZWF0dXJlVHJlZSA9IG5ldyBGZWF0dXJlVHJlZSh0aGlzLmNvb3JkLCB0aGlzLm92ZXJzY2FsaW5nKTtcblxuICAgIHZhciBpLCBrLFxuICAgICAgICB0aWxlID0gdGhpcyxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGJ1Y2tldCxcbiAgICAgICAgYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoKSxcbiAgICAgICAgY29sbGlzaW9uVGlsZSA9IG5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsIHRoaXMucGl0Y2gpLFxuICAgICAgICBidWNrZXRzID0ge30sXG4gICAgICAgIGJ1Y2tldHNJbk9yZGVyID0gdGhpcy5idWNrZXRzSW5PcmRlciA9IFtdLFxuICAgICAgICBidWNrZXRzQnlTb3VyY2VMYXllciA9IHt9O1xuXG4gICAgLy8gTWFwIG5vbi1yZWYgbGF5ZXJzIHRvIGJ1Y2tldHMuXG4gICAgZm9yIChpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllciA9IGxheWVyc1tpXTtcblxuICAgICAgICBpZiAobGF5ZXIuc291cmNlICE9PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChsYXllci5yZWYpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgbWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIGlmIChtaW56b29tICYmIHRoaXMuem9vbSA8IG1pbnpvb20gJiYgbWluem9vbSA8IHRoaXMubWF4Wm9vbSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIHZhciBtYXh6b29tID0gbGF5ZXIubWF4em9vbTtcbiAgICAgICAgaWYgKG1heHpvb20gJiYgdGhpcy56b29tID49IG1heHpvb20pXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgdmlzaWJpbGl0eSA9IGxheWVyLmxheW91dC52aXNpYmlsaXR5O1xuICAgICAgICBpZiAodmlzaWJpbGl0eSA9PT0gJ25vbmUnKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgYnVja2V0ID0gY3JlYXRlQnVja2V0KGxheWVyLCBidWZmZXJzLCB0aGlzLnpvb20sIHRoaXMub3ZlcnNjYWxpbmcsIHRoaXMuY29sbGlzaW9uRGVidWcpO1xuICAgICAgICBidWNrZXQubGF5ZXJzID0gW2xheWVyLmlkXTtcblxuICAgICAgICBidWNrZXRzW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIGJ1Y2tldHNJbk9yZGVyLnB1c2goYnVja2V0KTtcblxuICAgICAgICBpZiAoZGF0YS5sYXllcnMpIHtcbiAgICAgICAgICAgIC8vIHZlY3RvcnRpbGVcbiAgICAgICAgICAgIHZhciBzb3VyY2VMYXllciA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIGlmICghYnVja2V0c0J5U291cmNlTGF5ZXJbc291cmNlTGF5ZXJdKVxuICAgICAgICAgICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyW3NvdXJjZUxheWVyXSA9IHt9O1xuICAgICAgICAgICAgYnVja2V0c0J5U291cmNlTGF5ZXJbc291cmNlTGF5ZXJdW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBnZW9qc29uIHRpbGVcbiAgICAgICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmRleCByZWYgbGF5ZXJzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAhPT0gdGhpcy5zb3VyY2UpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBpZiAoIWxheWVyLnJlZilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXIucmVmXTtcbiAgICAgICAgaWYgKCFidWNrZXQpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBidWNrZXQubGF5ZXJzLnB1c2gobGF5ZXIuaWQpO1xuICAgIH1cblxuICAgIHZhciBleHRlbnQgPSA0MDk2O1xuXG4gICAgLy8gcmVhZCBlYWNoIGxheWVyLCBhbmQgc29ydCBpdHMgZmVhdHVyZXMgaW50byBidWNrZXRzXG4gICAgaWYgKGRhdGEubGF5ZXJzKSB7XG4gICAgICAgIC8vIHZlY3RvcnRpbGVcbiAgICAgICAgZm9yIChrIGluIGJ1Y2tldHNCeVNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICBsYXllciA9IGRhdGEubGF5ZXJzW2tdO1xuICAgICAgICAgICAgaWYgKCFsYXllcikgY29udGludWU7XG4gICAgICAgICAgICBpZiAobGF5ZXIuZXh0ZW50KSBleHRlbnQgPSBsYXllci5leHRlbnQ7XG4gICAgICAgICAgICBzb3J0TGF5ZXJJbnRvQnVja2V0cyhsYXllciwgYnVja2V0c0J5U291cmNlTGF5ZXJba10sIGR6LCB4UG9zLCB5UG9zKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdlb2pzb25cbiAgICAgICAgc29ydExheWVySW50b0J1Y2tldHMoZGF0YSwgYnVja2V0c0J5U291cmNlTGF5ZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNvcnRMYXllckludG9CdWNrZXRzKGxheWVyLCBidWNrZXRzLCBkeiwgeFBvcywgeVBvcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSk7XG4gICAgICAgICAgICAgLy9NT0JcbiAgICAgICAgICAgIGZlYXR1cmUuZHogPSBkejtcbiAgICAgICAgICAgIGZlYXR1cmUueFBvcyA9IHhQb3M7XG4gICAgICAgICAgICBmZWF0dXJlLnlQb3MgPSB5UG9zO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYnVja2V0cykge1xuICAgICAgICAgICAgICAgIHZhciBidWNrZXQgPSBidWNrZXRzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5maWx0ZXIoZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LmZlYXR1cmVzLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZQbGFjZW1lbnRCdWNrZXQ7XG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Y2tldHNJbk9yZGVyLmxlbmd0aDtcblxuICAgIC8qXG4gICAgICogIFRoZSBhc3luYyBwYXJzaW5nIGhlcmUgaXMgYSBiaXQgdHJpY2t5LlxuICAgICAqICBTb21lIGJ1Y2tldHMgZGVwZW5kIG9uIHJlc291cmNlcyB0aGF0IG1heSBuZWVkIHRvIGJlIGxvYWRlZCBhc3luYyAoZ2x5cGhzKS5cbiAgICAgKiAgU29tZSBidWNrZXRzIG5lZWQgdG8gYmUgcGFyc2VkIGluIG9yZGVyICh0byBnZXQgY29sbGlzaW9uIHByaW9yaXRpZXMgcmlnaHQpLlxuICAgICAqXG4gICAgICogIERlcGVuZGVuY2llcyBjYWxscyBhcmUgaW5pdGlhdGVkIGZpcnN0IHRvIGdldCB0aG9zZSByb2xsaW5nLlxuICAgICAqICBCdWNrZXRzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXIsIGFyZW4ndCB0byBzYXZlIHRpbWUuXG4gICAgICovXG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0c0luT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnVja2V0ID0gYnVja2V0c0luT3JkZXJbaV07XG5cbiAgICAgICAgLy8gTGluayBidWNrZXRzIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXJcbiAgICAgICAgaWYgKGJ1Y2tldC5uZWVkc1BsYWNlbWVudCkge1xuICAgICAgICAgICAgaWYgKHByZXZQbGFjZW1lbnRCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICBwcmV2UGxhY2VtZW50QnVja2V0Lm5leHQgPSBidWNrZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1Y2tldC5wcmV2aW91c1BsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2UGxhY2VtZW50QnVja2V0ID0gYnVja2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1Y2tldC5nZXREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5nZXREZXBlbmRlbmNpZXModGhpcywgYWN0b3IsIGRlcGVuZGVuY2llc0RvbmUoYnVja2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbW1lZGlhdGVseSBwYXJzZSBidWNrZXRzIHdoZXJlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyIGFuZCBubyBkZXBlbmRlbmNpZXNcbiAgICAgICAgaWYgKCFidWNrZXQubmVlZHNQbGFjZW1lbnQgJiYgIWJ1Y2tldC5nZXREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHBhcnNlQnVja2V0KHRpbGUsIGJ1Y2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXBlbmRlbmNpZXNEb25lKGJ1Y2tldCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBidWNrZXQuZGVwZW5kZW5jaWVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcnNlQnVja2V0KHRpbGUsIGJ1Y2tldCwgZXJyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUJ1Y2tldCh0aWxlLCBidWNrZXQsIHNraXApIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5nZXREZXBlbmRlbmNpZXMgJiYgIWJ1Y2tldC5kZXBlbmRlbmNpZXNMb2FkZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGJ1Y2tldC5uZWVkc1BsYWNlbWVudCAmJiAhYnVja2V0LnByZXZpb3VzUGxhY2VkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFza2lwKSB7XG4gICAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuZmVhdHVyZXMubGVuZ3RoKSBidWNrZXQuYWRkRmVhdHVyZXMoY29sbGlzaW9uVGlsZSk7XG4gICAgICAgICAgICB2YXIgdGltZSA9IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgICAgICBpZiAoYnVja2V0LmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBidWNrZXQuZmVhdHVyZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZmVhdHVyZVRyZWUuaW5zZXJ0KGZlYXR1cmUuYmJveCgpLCBidWNrZXQubGF5ZXJzLCBmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5idWNrZXRTdGF0cyA9IHNlbGYuYnVja2V0U3RhdHMgfHwge190b3RhbDogMH07XG4gICAgICAgICAgICAgICAgc2VsZi5idWNrZXRTdGF0cy5fdG90YWwgKz0gdGltZTtcbiAgICAgICAgICAgICAgICBzZWxmLmJ1Y2tldFN0YXRzW2J1Y2tldC5pZF0gPSAoc2VsZi5idWNrZXRTdGF0c1tidWNrZXQuaWRdIHx8IDApICsgdGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmICghcmVtYWluaW5nKSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnkgcGFyc2luZyB0aGUgbmV4dCBidWNrZXQsIGlmIGl0IGlzIHJlYWR5XG4gICAgICAgIGlmIChidWNrZXQubmV4dCkge1xuICAgICAgICAgICAgYnVja2V0Lm5leHQucHJldmlvdXNQbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgcGFyc2VCdWNrZXQodGlsZSwgYnVja2V0Lm5leHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcblxuICAgICAgICB0aWxlLnN0YXR1cyA9ICdkb25lJztcblxuICAgICAgICBpZiAodGlsZS5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGlsZS5yZWRvUGxhY2VtZW50KHRpbGUuYW5nbGUsIHRpbGUucGl0Y2gpLnJlc3VsdDtcbiAgICAgICAgICAgIGJ1ZmZlcnMuZ2x5cGhWZXJ0ZXggPSByZXN1bHQuYnVmZmVycy5nbHlwaFZlcnRleDtcbiAgICAgICAgICAgIGJ1ZmZlcnMuaWNvblZlcnRleCA9IHJlc3VsdC5idWZmZXJzLmljb25WZXJ0ZXg7XG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCA9IHJlc3VsdC5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cmFuc2ZlcmFibGVzID0gW10sXG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzID0ge307XG5cbiAgICAgICAgZm9yIChrIGluIGJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChidWZmZXJzW2tdLmFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoayBpbiBidWNrZXRzKSB7XG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzW2tdID0gYnVja2V0c1trXS5lbGVtZW50R3JvdXBzO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwczogZWxlbWVudEdyb3VwcyxcbiAgICAgICAgICAgIGJ1ZmZlcnM6IGJ1ZmZlcnMsXG4gICAgICAgICAgICBleHRlbnQ6IGV4dGVudFxuICAgICAgICB9LCB0cmFuc2ZlcmFibGVzKTtcbiAgICB9XG59O1xuXG5Xb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50ID0gZnVuY3Rpb24oYW5nbGUsIHBpdGNoLCBjb2xsaXNpb25EZWJ1Zykge1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgICAgdGhpcy5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcnMgPSBuZXcgQnVmZmVyU2V0KCk7XG4gICAgdmFyIHRyYW5zZmVyYWJsZXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHt9O1xuICAgIHZhciBjb2xsaXNpb25UaWxlID0gbmV3IENvbGxpc2lvblRpbGUoYW5nbGUsIHBpdGNoKTtcblxuICAgIHZhciBidWNrZXRzSW5PcmRlciA9IHRoaXMuYnVja2V0c0luT3JkZXI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXRzSW5PcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnVja2V0ID0gYnVja2V0c0luT3JkZXJbaV07XG5cbiAgICAgICAgaWYgKGJ1Y2tldC50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgYnVja2V0LnBsYWNlRmVhdHVyZXMoY29sbGlzaW9uVGlsZSwgYnVmZmVycywgY29sbGlzaW9uRGVidWcpO1xuICAgICAgICAgICAgZWxlbWVudEdyb3Vwc1tidWNrZXQuaWRdID0gYnVja2V0LmVsZW1lbnRHcm91cHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrIGluIGJ1ZmZlcnMpIHtcbiAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGJ1ZmZlcnNba10uYXJyYXkpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwczogZWxlbWVudEdyb3VwcyxcbiAgICAgICAgICAgIGJ1ZmZlcnM6IGJ1ZmZlcnNcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJhYmxlczogdHJhbnNmZXJhYmxlc1xuICAgIH07XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gQW5pbWF0aW9uTG9vcDtcblxuZnVuY3Rpb24gQW5pbWF0aW9uTG9vcCgpIHtcbiAgICB0aGlzLm4gPSAwO1xuICAgIHRoaXMudGltZXMgPSBbXTtcbn1cblxuLy8gQXJlIGFsbCBhbmltYXRpb25zIGRvbmU/XG5BbmltYXRpb25Mb29wLnByb3RvdHlwZS5zdG9wcGVkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50aW1lcyA9IHRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQudGltZSA+PSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiAhdGhpcy50aW1lcy5sZW5ndGg7XG59O1xuXG4vLyBBZGQgYSBuZXcgYW5pbWF0aW9uIHRoYXQgd2lsbCBydW4gdCBtaWxsaXNlY29uZHNcbi8vIFJldHVybnMgYW4gaWQgdGhhdCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgaXQgbGF5ZXJcbkFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRpbWVzLnB1c2goeyBpZDogdGhpcy5uLCB0aW1lOiB0ICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9KTtcbiAgICByZXR1cm4gdGhpcy5uKys7XG59O1xuXG4vLyBDYW5jZWwgYW4gYW5pbWF0aW9uXG5BbmltYXRpb25Mb29wLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbihuKSB7XG4gICAgdGhpcy50aW1lcyA9IHRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQgIT09IG47XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VTcHJpdGU7XG5cbmZ1bmN0aW9uIEltYWdlU3ByaXRlKGJhc2UpIHtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMucmV0aW5hID0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMTtcblxuICAgIGJhc2UgPSB0aGlzLmJhc2UgKyAodGhpcy5yZXRpbmEgPyAnQDJ4JyA6ICcnKTtcblxuICAgIGFqYXguZ2V0SlNPTihiYXNlICsgJy5qc29uJywgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaW1nKSB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgYWpheC5nZXRJbWFnZShiYXNlICsgJy5wbmcnLCBmdW5jdGlvbihlcnIsIGltZykge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZW11bHRpcGx5IHRoZSBzcHJpdGVcbiAgICAgICAgdmFyIGRhdGEgPSBpbWcuZ2V0RGF0YSgpO1xuICAgICAgICB2YXIgbmV3ZGF0YSA9IGltZy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIHZhciBhbHBoYSA9IGRhdGFbaSArIDNdIC8gMjU1O1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMF0gPSBkYXRhW2kgKyAwXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMV0gPSBkYXRhW2kgKyAxXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMl0gPSBkYXRhW2kgKyAyXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgM10gPSBkYXRhW2kgKyAzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1nID0gaW1nO1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICB9LmJpbmQodGhpcykpO1xufVxuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50ZWQpO1xuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZTtcbn07XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5kYXRhICYmIHRoaXMuaW1nKTtcbn07XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbigvKmdsKi8pIHtcbiAgICBpZiAoYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMSAhPT0gdGhpcy5yZXRpbmEpIHtcbiAgICAgICAgdmFyIG5ld1Nwcml0ZSA9IG5ldyBJbWFnZVNwcml0ZSh0aGlzLmJhc2UpO1xuICAgICAgICBuZXdTcHJpdGUub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3U3ByaXRlLmltZztcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld1Nwcml0ZS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5yZXRpbmEgPSBuZXdTcHJpdGUucmV0aW5hO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIFNwcml0ZVBvc2l0aW9uKCkge31cblNwcml0ZVBvc2l0aW9uLnByb3RvdHlwZSA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCwgcGl4ZWxSYXRpbzogMSwgc2RmOiBmYWxzZSB9O1xuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUuZ2V0U3ByaXRlUG9zaXRpb24gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZCgpKSByZXR1cm4gbmV3IFNwcml0ZVBvc2l0aW9uKCk7XG5cbiAgICB2YXIgcG9zID0gdGhpcy5kYXRhICYmIHRoaXMuZGF0YVtuYW1lXTtcbiAgICBpZiAocG9zICYmIHRoaXMuaW1nKSByZXR1cm4gcG9zO1xuXG4gICAgcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbigpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vcmVmZXJlbmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge307XG5cbnJlZmVyZW5jZS5sYXlvdXQuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICB2YXIgUHJvcGVydGllcyA9IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXNbcF0gPSBwcm9wc1twXTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHJlZmVyZW5jZVtjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIHByb3AgaW4gcHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydGllc1twcm9wXS5kZWZhdWx0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBQcm9wZXJ0aWVzLnByb3RvdHlwZVtwcm9wXSA9IHByb3BlcnRpZXNbcHJvcF0uZGVmYXVsdDtcbiAgICB9XG4gICAgbW9kdWxlLmV4cG9ydHNbY2xhc3NOYW1lLnJlcGxhY2UoJ2xheW91dF8nLCAnJyldID0gUHJvcGVydGllcztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi9yZWZlcmVuY2UnKTtcbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5yZWZlcmVuY2UucGFpbnQuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICB2YXIgQ2FsY3VsYXRlZCA9IGZ1bmN0aW9uKCkge307XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHJlZmVyZW5jZVtjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIHAgaW4gcHJvcGVydGllcykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbcF0sXG4gICAgICAgICAgICB2YWx1ZSA9IHByb3AuZGVmYXVsdDtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdjb2xvcicpIHZhbHVlID0gcGFyc2VDU1NDb2xvcih2YWx1ZSk7XG5cbiAgICAgICAgQ2FsY3VsYXRlZC5wcm90b3R5cGVbcF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBDYWxjdWxhdGVkLnByb3RvdHlwZS5oaWRkZW4gPSBmYWxzZTtcbiAgICBtb2R1bGUuZXhwb3J0c1tjbGFzc05hbWUucmVwbGFjZSgncGFpbnRfJywgJycpXSA9IENhbGN1bGF0ZWQ7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIHN0eWxlQmF0Y2ggPSByZXF1aXJlKCcuL3N0eWxlX2JhdGNoJyk7XG52YXIgU3R5bGVMYXllciA9IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXInKTtcbnZhciBJbWFnZVNwcml0ZSA9IHJlcXVpcmUoJy4vaW1hZ2Vfc3ByaXRlJyk7XG52YXIgR2x5cGhTb3VyY2UgPSByZXF1aXJlKCcuLi9zeW1ib2wvZ2x5cGhfc291cmNlJyk7XG52YXIgR2x5cGhBdGxhcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nbHlwaF9hdGxhcycpO1xudmFyIFNwcml0ZUF0bGFzID0gcmVxdWlyZSgnLi4vc3ltYm9sL3Nwcml0ZV9hdGxhcycpO1xudmFyIExpbmVBdGxhcyA9IHJlcXVpcmUoJy4uL3JlbmRlci9saW5lX2F0bGFzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVN0eWxlVVJMO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaXNwYXRjaGVyJyk7XG52YXIgQW5pbWF0aW9uTG9vcCA9IHJlcXVpcmUoJy4vYW5pbWF0aW9uX2xvb3AnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZTtcblxuZnVuY3Rpb24gU3R5bGUoc3R5bGVzaGVldCwgYW5pbWF0aW9uTG9vcCkge1xuICAgIHRoaXMuYW5pbWF0aW9uTG9vcCA9IGFuaW1hdGlvbkxvb3AgfHwgbmV3IEFuaW1hdGlvbkxvb3AoKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihNYXRoLm1heChicm93c2VyLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAxLCAxKSwgdGhpcyk7XG4gICAgdGhpcy5nbHlwaEF0bGFzID0gbmV3IEdseXBoQXRsYXMoMTAyNCwgMTAyNCk7XG4gICAgdGhpcy5zcHJpdGVBdGxhcyA9IG5ldyBTcHJpdGVBdGxhcyg1MTIsIDUxMik7XG4gICAgdGhpcy5zcHJpdGVBdGxhcy5yZXNpemUoYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB0aGlzLmxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCA1MTIpO1xuXG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgdGhpcy5fb3JkZXIgID0gW107XG4gICAgdGhpcy5fZ3JvdXBzID0gW107XG4gICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICB0aGlzLnpvb21IaXN0b3J5ID0ge307XG5cbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX2ZvcndhcmRTb3VyY2VFdmVudCcsXG4gICAgICAgICdfZm9yd2FyZFRpbGVFdmVudCcsXG4gICAgICAgICdfcmVkb1BsYWNlbWVudCdcbiAgICBdLCB0aGlzKTtcblxuICAgIHZhciBsb2FkZWQgPSBmdW5jdGlvbihlcnIsIHN0eWxlc2hlZXQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsaWQgPSB2YWxpZGF0ZShzdHlsZXNoZWV0KTtcbiAgICAgICAgaWYgKHZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFsaWQuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7XG5cbiAgICAgICAgdmFyIHNvdXJjZXMgPSBzdHlsZXNoZWV0LnNvdXJjZXM7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBzb3VyY2VzW2lkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVzaGVldC5zcHJpdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlID0gbmV3IEltYWdlU3ByaXRlKHN0eWxlc2hlZXQuc3ByaXRlKTtcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlLm9uKCdsb2FkJywgdGhpcy5maXJlLmJpbmQodGhpcywgJ2NoYW5nZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2x5cGhTb3VyY2UgPSBuZXcgR2x5cGhTb3VyY2Uoc3R5bGVzaGVldC5nbHlwaHMsIHRoaXMuZ2x5cGhBdGxhcyk7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoKTtcbiAgICAgICAgdGhpcy5maXJlKCdsb2FkJyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHlsZXNoZWV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBhamF4LmdldEpTT04obm9ybWFsaXplVVJMKHN0eWxlc2hlZXQpLCBsb2FkZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJyb3dzZXIuZnJhbWUobG9hZGVkLmJpbmQodGhpcywgbnVsbCwgc3R5bGVzaGVldCkpO1xuICAgIH1cbn1cblxuU3R5bGUucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIHtcbiAgICBfbG9hZGVkOiBmYWxzZSxcblxuICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcylcbiAgICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VzW2lkXS5sb2FkZWQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc3ByaXRlICYmICF0aGlzLnNwcml0ZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX3Jlc29sdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaWQsIGxheWVyO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9vcmRlciAgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3R5bGVzaGVldC5sYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxheWVyID0gbmV3IFN0eWxlTGF5ZXIodGhpcy5zdHlsZXNoZWV0LmxheWVyc1tpXSwgdGhpcy5zdHlsZXNoZWV0LmNvbnN0YW50cyB8fCB7fSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLl9vcmRlci5wdXNoKGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgbGF5b3V0IHByb3BlcnRpZXMuXG4gICAgICAgIGZvciAoaWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnJlc29sdmVMYXlvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgcmVmZXJlbmNlIGFuZCBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAgICBmb3IgKGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnJlc29sdmVQYWludCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ3JvdXBMYXllcnMoKTtcbiAgICAgICAgdGhpcy5fYnJvYWRjYXN0TGF5ZXJzKCk7XG4gICAgfSxcblxuICAgIF9ncm91cExheWVyczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBncm91cDtcblxuICAgICAgICB0aGlzLl9ncm91cHMgPSBbXTtcblxuICAgICAgICAvLyBTcGxpdCBpbnRvIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSB0b3AtbGV2ZWwgbGF5ZXJzIHdpdGggdGhlIHNhbWUgc291cmNlLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbdGhpcy5fb3JkZXJbaV1dO1xuXG4gICAgICAgICAgICBpZiAoIWdyb3VwIHx8IGxheWVyLnNvdXJjZSAhPT0gZ3JvdXAuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBbXTtcbiAgICAgICAgICAgICAgICBncm91cC5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBncm91cC5wdXNoKGxheWVyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfYnJvYWRjYXN0TGF5ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIG9yZGVyZWQucHVzaCh0aGlzLl9sYXllcnNbaWRdLmpzb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXQgbGF5ZXJzJywgb3JkZXJlZCk7XG4gICAgfSxcblxuICAgIF9jYXNjYWRlOiBmdW5jdGlvbihjbGFzc2VzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSByZXR1cm47XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbjogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5jYXNjYWRlKGNsYXNzZXMsIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24gfHwge30sXG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJyk7XG4gICAgfSxcblxuICAgIF9yZWNhbGN1bGF0ZTogZnVuY3Rpb24oeikge1xuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNbaWRdLnVzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVab29tSGlzdG9yeSh6KTtcblxuICAgICAgICB0aGlzLnJhc3RlckZhZGVEdXJhdGlvbiA9IDMwMDtcbiAgICAgICAgZm9yIChpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG5cbiAgICAgICAgICAgIGlmIChsYXllci5yZWNhbGN1bGF0ZSh6LCB0aGlzLnpvb21IaXN0b3J5KSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuc291cmNlXS51c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXhab29tVHJhbnNpdGlvbkR1cmF0aW9uID0gMzAwO1xuICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLnopICE9PSBNYXRoLmZsb29yKHopKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KG1heFpvb21UcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56ID0gejtcbiAgICAgICAgdGhpcy5maXJlKCd6b29tJyk7XG4gICAgfSxcblxuICAgIF91cGRhdGVab29tSGlzdG9yeTogZnVuY3Rpb24oeikge1xuXG4gICAgICAgIHZhciB6aCA9IHRoaXMuem9vbUhpc3Rvcnk7XG5cbiAgICAgICAgaWYgKHpoLmxhc3RJbnRlZ2VyWm9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB0aW1lXG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb20gPSBNYXRoLmZsb29yKHopO1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tVGltZSA9IDA7XG4gICAgICAgICAgICB6aC5sYXN0Wm9vbSA9IHo7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGFuIGludGVnZXIgem9vbSBsZXZlbCBhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWVcbiAgICAgICAgLy8gYW5kIGlmIHllcywgcmVjb3JkIGl0IHdpdGggdGhlIHRpbWUuIFVzZWQgZm9yIHRyYW5zaXRpb25pbmcgcGF0dGVybnMuXG4gICAgICAgIGlmIChNYXRoLmZsb29yKHpoLmxhc3Rab29tKSA8IE1hdGguZmxvb3IoeikpIHtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbSA9IE1hdGguZmxvb3Ioeik7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb21UaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB9IGVsc2UgaWYgKE1hdGguZmxvb3IoemgubGFzdFpvb20pID4gTWF0aC5mbG9vcih6KSkge1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tID0gTWF0aC5mbG9vcih6ICsgMSk7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb21UaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHpoLmxhc3Rab29tID0gejtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgbXVsdGlwbGUgc3R5bGUgbXV0YXRpb25zIGluIGEgYmF0Y2hcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3b3JrIEZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgdGhlIFN0eWxlQmF0Y2ggaW50ZXJmYWNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBiYXRjaDogZnVuY3Rpb24od29yaykge1xuICAgICAgICBzdHlsZUJhdGNoKHRoaXMsIHdvcmspO1xuICAgIH0sXG5cbiAgICBhZGRTb3VyY2U6IGZ1bmN0aW9uKGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5iYXRjaChmdW5jdGlvbihiYXRjaCkge1xuICAgICAgICAgICAgYmF0Y2guYWRkU291cmNlKGlkLCBzb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc291cmNlIGZyb20gdGhpcyBzdHlsZXNoZWV0LCBnaXZlbiBpdHMgaWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge1N0eWxlfSB0aGlzIHN0eWxlXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIHNvdXJjZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc291cmNlIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBzb3VyY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFNvdXJjZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc1tpZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U3R5bGVMYXllcnxPYmplY3R9IGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBiZWZvcmUgIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKiBAZmlyZXMgbGF5ZXIuYWRkXG4gICAgICogQHJldHVybnMge1N0eWxlfSBgdGhpc2BcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFkZExheWVyOiBmdW5jdGlvbihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLmFkZExheWVyKGxheWVyLCBiZWZvcmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgbGF5ZXIgZnJvbSB0aGlzIHN0eWxlc2hlZXQsIGdpdmVuIGl0cyBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtTdHlsZX0gdGhpcyBzdHlsZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBsYXllciBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheWVyIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBsYXllclxuICAgICAqIEByZXR1cm5zIHtMYXllcn0gbGF5ZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgYSBsYXllciBoYXMgYSBgcmVmYCBwcm9wZXJ0eSB0aGF0IG1ha2VzIGl0IGRlcml2ZSBzb21lIHZhbHVlc1xuICAgICAqIGZyb20gYW5vdGhlciBsYXllciwgcmV0dXJuIHRoYXQgcmVmZXJlbnQgbGF5ZXIuIE90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIHRoZSBsYXllciBpdHNlbGYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIHRoZSBsYXllcidzIGlkXG4gICAgICogQHJldHVybnMge0xheWVyfSB0aGUgcmVmZXJlbnQgbGF5ZXIgb3IgdGhlIGxheWVyIGl0c2VsZlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0UmVmZXJlbnRMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5nZXRMYXllcihpZCk7XG4gICAgICAgIGlmIChsYXllci5yZWYpIHtcbiAgICAgICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllci5yZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICB9LFxuXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbihsYXllciwgZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnNldEZpbHRlcihsYXllciwgZmlsdGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHNldExheWVyWm9vbVJhbmdlOiBmdW5jdGlvbihsYXllcklkLCBtaW56b29tLCBtYXh6b29tKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnNldExheWVyWm9vbVJhbmdlKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5ZXIncyBmaWx0ZXIgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHJldHVybnMgeyp9IHRoZSBsYXllcidzIGZpbHRlciwgaWYgYW55XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlZmVyZW50TGF5ZXIobGF5ZXIpLmZpbHRlcjtcbiAgICB9LFxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5zZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGxheWVyKS5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKTtcbiAgICB9LFxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIHZhbHVlLCBrbGFzcykge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5zZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIGtsYXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExheWVyKGxheWVyKS5nZXRQYWludFByb3BlcnR5KG5hbWUsIGtsYXNzKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24oY29vcmQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZlYXR1cmVzID0gW107XG4gICAgICAgIHZhciBlcnJvciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5sYXllcikge1xuICAgICAgICAgICAgcGFyYW1zLmxheWVyID0geyBpZDogcGFyYW1zLmxheWVyIH07XG4gICAgICAgIH1cblxuICAgICAgICB1dGlsLmFzeW5jRWFjaChPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLCBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgc291cmNlLmZlYXR1cmVzQXQoY29vcmQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSBmZWF0dXJlcyA9IGZlYXR1cmVzLmNvbmNhdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tmZWF0dXJlLmxheWVyXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5sYXllciA9IHRoaXMuX2xheWVyc1tmZWF0dXJlLmxheWVyXS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSkpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgIH0sXG5cbiAgICBfcmVsb2FkU291cmNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLnNvdXJjZXNbaWRdLnJlbG9hZCgpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlU291cmNlczogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2lkXS51cGRhdGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcmVkb1BsYWNlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tpZF0ucmVkb1BsYWNlbWVudCkgdGhpcy5zb3VyY2VzW2lkXS5yZWRvUGxhY2VtZW50KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTb3VyY2VFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3NvdXJjZS4nICsgZS50eXBlLCB1dGlsLmV4dGVuZCh7c291cmNlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRUaWxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3NvdXJjZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIC8vIENhbGxiYWNrcyBmcm9tIHdlYiB3b3JrZXJzXG5cbiAgICAnZ2V0IHNwcml0ZSBqc29uJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3ByaXRlID0gdGhpcy5zcHJpdGU7XG4gICAgICAgIGlmIChzcHJpdGUubG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgc3ByaXRlOiBzcHJpdGUuZGF0YSwgcmV0aW5hOiBzcHJpdGUucmV0aW5hIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ByaXRlLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgeyBzcHJpdGU6IHNwcml0ZS5kYXRhLCByZXRpbmE6IHNwcml0ZS5yZXRpbmEgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnZ2V0IGljb25zJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3ByaXRlID0gdGhpcy5zcHJpdGU7XG4gICAgICAgIHZhciBzcHJpdGVBdGxhcyA9IHRoaXMuc3ByaXRlQXRsYXM7XG4gICAgICAgIGlmIChzcHJpdGUubG9hZGVkKCkpIHtcbiAgICAgICAgICAgIHNwcml0ZUF0bGFzLnNldFNwcml0ZShzcHJpdGUpO1xuICAgICAgICAgICAgc3ByaXRlQXRsYXMuYWRkSWNvbnMocGFyYW1zLmljb25zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcHJpdGUub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzcHJpdGVBdGxhcy5zZXRTcHJpdGUoc3ByaXRlKTtcbiAgICAgICAgICAgICAgICBzcHJpdGVBdGxhcy5hZGRJY29ucyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdnZXQgZ2x5cGhzJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdseXBoU291cmNlLmdldFNpbXBsZUdseXBocyhwYXJhbXMuZm9udHN0YWNrLCBwYXJhbXMuY29kZXBvaW50cywgcGFyYW1zLnVpZCwgY2FsbGJhY2spO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU291cmNlID0gcmVxdWlyZSgnLi4vc291cmNlL3NvdXJjZScpO1xudmFyIFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuL3N0eWxlX2xheWVyJyk7XG5cbmZ1bmN0aW9uIHN0eWxlQmF0Y2goc3R5bGUsIHdvcmspIHtcbiAgICBpZiAoIXN0eWxlLl9sb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgdmFyIGJhdGNoID0gT2JqZWN0LmNyZWF0ZShzdHlsZUJhdGNoLnByb3RvdHlwZSk7XG5cbiAgICBiYXRjaC5fc3R5bGUgPSBzdHlsZTtcbiAgICBiYXRjaC5fZ3JvdXBMYXllcnMgPSBmYWxzZTtcbiAgICBiYXRjaC5fYnJvYWRjYXN0TGF5ZXJzID0gZmFsc2U7XG4gICAgYmF0Y2guX3JlbG9hZFNvdXJjZXMgPSB7fTtcbiAgICBiYXRjaC5fZXZlbnRzID0gW107XG4gICAgYmF0Y2guX2NoYW5nZSA9IGZhbHNlO1xuXG4gICAgd29yayhiYXRjaCk7XG5cbiAgICBpZiAoYmF0Y2guX2dyb3VwTGF5ZXJzKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5fZ3JvdXBMYXllcnMoKTtcbiAgICB9XG5cbiAgICBpZiAoYmF0Y2guX2Jyb2FkY2FzdExheWVycykge1xuICAgICAgICBiYXRjaC5fc3R5bGUuX2Jyb2FkY2FzdExheWVycygpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGJhdGNoLl9yZWxvYWRTb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZUlkKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5fcmVsb2FkU291cmNlKHNvdXJjZUlkKTtcbiAgICB9KTtcblxuICAgIGJhdGNoLl9ldmVudHMuZm9yRWFjaChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5maXJlLmFwcGx5KGJhdGNoLl9zdHlsZSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICBpZiAoYmF0Y2guX2NoYW5nZSkge1xuICAgICAgICBiYXRjaC5fc3R5bGUuZmlyZSgnY2hhbmdlJyk7XG4gICAgfVxufVxuXG5zdHlsZUJhdGNoLnByb3RvdHlwZSA9IHtcblxuICAgIGFkZExheWVyOiBmdW5jdGlvbihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5fbGF5ZXJzW2xheWVyLmlkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYSBsYXllciB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShsYXllciBpbnN0YW5jZW9mIFN0eWxlTGF5ZXIpKSB7XG4gICAgICAgICAgICBsYXllciA9IG5ldyBTdHlsZUxheWVyKGxheWVyLCB0aGlzLl9zdHlsZS5zdHlsZXNoZWV0LmNvbnN0YW50cyB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3R5bGUuX2xheWVyc1tsYXllci5pZF0gPSBsYXllcjtcbiAgICAgICAgdGhpcy5fc3R5bGUuX29yZGVyLnNwbGljZShiZWZvcmUgPyB0aGlzLl9zdHlsZS5fb3JkZXIuaW5kZXhPZihiZWZvcmUpIDogSW5maW5pdHksIDAsIGxheWVyLmlkKTtcbiAgICAgICAgbGF5ZXIucmVzb2x2ZUxheW91dCgpO1xuICAgICAgICBsYXllci5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX3N0eWxlLl9sYXllcnMpO1xuICAgICAgICBsYXllci5yZXNvbHZlUGFpbnQoKTtcblxuICAgICAgICB0aGlzLl9ncm91cExheWVycyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXZlbnRzLnB1c2goWydsYXllci5hZGQnLCB7bGF5ZXI6IGxheWVyfV0pO1xuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fc3R5bGUuX2xheWVyc1tpZF07XG4gICAgICAgIGlmIChsYXllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGxheWVyIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fc3R5bGUuX2xheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlLl9sYXllcnNbaV0ucmVmID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXIoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0eWxlLl9sYXllcnNbaWRdO1xuICAgICAgICB0aGlzLl9zdHlsZS5fb3JkZXIuc3BsaWNlKHRoaXMuX3N0eWxlLl9vcmRlci5pbmRleE9mKGlkKSwgMSk7XG5cbiAgICAgICAgdGhpcy5fZ3JvdXBMYXllcnMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9icm9hZGNhc3RMYXllcnMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9ldmVudHMucHVzaChbJ2xheWVyLnJlbW92ZScsIHtsYXllcjogbGF5ZXJ9XSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHNldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdGhpcy5fc3R5bGUuZ2V0TGF5ZXIobGF5ZXIpLnNldFBhaW50UHJvcGVydHkobmFtZSwgdmFsdWUsIGtsYXNzKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBsYXllciA9IHRoaXMuX3N0eWxlLmdldFJlZmVyZW50TGF5ZXIobGF5ZXIpO1xuICAgICAgICBsYXllci5zZXRMYXlvdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fYnJvYWRjYXN0TGF5ZXJzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlc1tsYXllci5zb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBzZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyLCBmaWx0ZXIpIHtcbiAgICAgICAgbGF5ZXIgPSB0aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGxheWVyKTtcbiAgICAgICAgbGF5ZXIuZmlsdGVyID0gZmlsdGVyO1xuXG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2U6IGZ1bmN0aW9uKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fc3R5bGUuZ2V0UmVmZXJlbnRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKG1pbnpvb20gIT0gbnVsbCkge1xuICAgICAgICAgIGxheWVyLm1pbnpvb20gPSBtaW56b29tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXh6b29tICE9IG51bGwpIHtcbiAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgYWRkU291cmNlOiBmdW5jdGlvbihpZCwgc291cmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3R5bGUuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlLnNvdXJjZXNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBTb3VyY2UuY3JlYXRlKHNvdXJjZSk7XG4gICAgICAgIHRoaXMuX3N0eWxlLnNvdXJjZXNbaWRdID0gc291cmNlO1xuICAgICAgICBzb3VyY2UuaWQgPSBpZDtcbiAgICAgICAgc291cmNlLnN0eWxlID0gdGhpcy5fc3R5bGU7XG4gICAgICAgIHNvdXJjZS5kaXNwYXRjaGVyID0gdGhpcy5fc3R5bGUuZGlzcGF0Y2hlcjtcbiAgICAgICAgc291cmNlLmdseXBoQXRsYXMgPSB0aGlzLl9zdHlsZS5nbHlwaEF0bGFzO1xuICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIC5vbignbG9hZCcsIHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbignY2hhbmdlJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5hZGQnLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5sb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub24oJ3RpbGUuZXJyb3InLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5yZW1vdmUnLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRzLnB1c2goWydzb3VyY2UuYWRkJywge3NvdXJjZTogc291cmNlfV0pO1xuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZW1vdmVTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5zb3VyY2VzW2lkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fc3R5bGUuc291cmNlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdHlsZS5zb3VyY2VzW2lkXTtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAub2ZmKCdsb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vZmYoJ2Vycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vZmYoJ2NoYW5nZScsIHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmFkZCcsIHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9mZigndGlsZS5sb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmVycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLnJlbW92ZScsIHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KTtcblxuICAgICAgICB0aGlzLl9ldmVudHMucHVzaChbJ3NvdXJjZS5yZW1vdmUnLCB7c291cmNlOiBzb3VyY2V9XSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZUJhdGNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSwgY29uc3RhbnRzKSB7XG4gICAgZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZVswXSA9PT0gJ0AnID8gY29uc3RhbnRzW3ZhbHVlXSA6IHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgdmFsdWUgPSByZXNvbHZlKHZhbHVlKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbaV0gaW4gY29uc3RhbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbaV0gPSByZXNvbHZlKHZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdG9wcykge1xuICAgICAgICB2YWx1ZSA9IHV0aWwuZXh0ZW5kKHt9LCB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLnN0b3BzID0gdmFsdWUuc3RvcHMuc2xpY2UoKTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWUuc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdG9wc1tpXVsxXSBpbiBjb25zdGFudHMpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zdG9wc1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3RvcHNbaV1bMF0sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUuc3RvcHNbaV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydHMucmVzb2x2ZUFsbCA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBjb25zdGFudHMpIHtcbiAgICBpZiAoIWNvbnN0YW50cylcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IGV4cG9ydHMucmVzb2x2ZShwcm9wZXJ0aWVzW2tleV0sIGNvbnN0YW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xudmFyIG1hcGJveEdMRnVuY3Rpb24gPSByZXF1aXJlKCdtYXBib3gtZ2wtZnVuY3Rpb24nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVEZWNsYXJhdGlvbjtcblxuZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvbihyZWZlcmVuY2UsIHZhbHVlKSB7XG4gICAgdGhpcy50eXBlID0gcmVmZXJlbmNlLnR5cGU7XG4gICAgdGhpcy50cmFuc2l0aW9uYWJsZSA9IHJlZmVyZW5jZS50cmFuc2l0aW9uO1xuXG4gICAgLy8gaW1tdXRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiB1c2VkIGZvciBjb21wYXJpc29uXG4gICAgdGhpcy5qc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbG9yJykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5zdG9wcykge1xuICAgICAgICB0aGlzLnZhbHVlID0gcHJlcGFyZUNvbG9yRnVuY3Rpb24odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBwYXJzZUNvbG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocmVmZXJlbmNlLmZ1bmN0aW9uID09PSAnaW50ZXJwb2xhdGVkJykge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZSA9IG1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHRoaXMudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlID0gbWFwYm94R0xGdW5jdGlvblsncGllY2V3aXNlLWNvbnN0YW50J10odGhpcy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UudHJhbnNpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGUgPSB0cmFuc2l0aW9uZWQodGhpcy5jYWxjdWxhdGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uZWQoY2FsY3VsYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHosIHpoLCBkdXJhdGlvbikge1xuICAgICAgICB2YXIgZnJhY3Rpb24gPSB6ICUgMTtcbiAgICAgICAgdmFyIHQgPSBNYXRoLm1pbigoRGF0ZS5ub3coKSAtIHpoLmxhc3RJbnRlZ2VyWm9vbVRpbWUpIC8gZHVyYXRpb24sIDEpO1xuICAgICAgICB2YXIgZnJvbVNjYWxlID0gMTtcbiAgICAgICAgdmFyIHRvU2NhbGUgPSAxO1xuICAgICAgICB2YXIgbWl4LCBmcm9tLCB0bztcblxuICAgICAgICBpZiAoeiA+IHpoLmxhc3RJbnRlZ2VyWm9vbSkge1xuICAgICAgICAgICAgbWl4ID0gZnJhY3Rpb24gKyAoMSAtIGZyYWN0aW9uKSAqIHQ7XG4gICAgICAgICAgICBmcm9tU2NhbGUgKj0gMjtcbiAgICAgICAgICAgIGZyb20gPSBjYWxjdWxhdGUoeiAtIDEpO1xuICAgICAgICAgICAgdG8gPSBjYWxjdWxhdGUoeik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaXggPSAxIC0gKDEgLSB0KSAqIGZyYWN0aW9uO1xuICAgICAgICAgICAgdG8gPSBjYWxjdWxhdGUoeik7XG4gICAgICAgICAgICBmcm9tID0gY2FsY3VsYXRlKHogKyAxKTtcbiAgICAgICAgICAgIGZyb21TY2FsZSAvPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICBmcm9tU2NhbGU6IGZyb21TY2FsZSxcbiAgICAgICAgICAgIHRvOiB0byxcbiAgICAgICAgICAgIHRvU2NhbGU6IHRvU2NhbGUsXG4gICAgICAgICAgICB0OiBtaXhcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG52YXIgY29sb3JDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBwYXJzZUNvbG9yKHZhbHVlKSB7XG4gICAgaWYgKGNvbG9yQ2FjaGVbdmFsdWVdKSByZXR1cm4gY29sb3JDYWNoZVt2YWx1ZV07XG4gICAgdmFyIGNvbG9yID0gcHJlcGFyZUNvbG9yKHBhcnNlQ1NTQ29sb3IodmFsdWUpKTtcbiAgICBjb2xvckNhY2hlW3ZhbHVlXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbG9yKGMpIHtcbiAgICByZXR1cm4gW2NbMF0gLyAyNTUsIGNbMV0gLyAyNTUsIGNbMl0gLyAyNTUsIGNbM10gLyAxXTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbG9yRnVuY3Rpb24oZikge1xuICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSwgZiwge3N0b3BzOiBmLnN0b3BzLm1hcChmdW5jdGlvbihzdG9wKSB7XG4gICAgICAgIHJldHVybiBbc3RvcFswXSwgcGFyc2VDb2xvcihzdG9wWzFdKV07XG4gICAgfSl9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciByZWZlcmVuY2UgPSByZXF1aXJlKCcuL3JlZmVyZW5jZScpO1xudmFyIFN0eWxlQ29uc3RhbnQgPSByZXF1aXJlKCcuL3N0eWxlX2NvbnN0YW50Jyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vc3R5bGVfZGVjbGFyYXRpb24nKTtcblxudmFyIGxvb2t1cCA9IHtcbiAgICBwYWludDoge30sXG4gICAgbGF5b3V0OiB7fVxufTtcblxucmVmZXJlbmNlLmxheWVyLnR5cGUudmFsdWVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgIGxvb2t1cC5wYWludFt0eXBlXSA9IG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2VbJ3BhaW50XycgKyB0eXBlXSk7XG4gICAgbG9va3VwLmxheW91dFt0eXBlXSA9IG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2VbJ2xheW91dF8nICsgdHlwZV0pO1xufSk7XG5cbmZ1bmN0aW9uIG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICBmdW5jdGlvbiBTdHlsZURlY2xhcmF0aW9uU2V0KHByb3BlcnRpZXMsIGNvbnN0YW50cykge1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbnMgPSB7fTtcblxuICAgICAgICB0aGlzLl9jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzW2tdID0gU3R5bGVDb25zdGFudC5yZXNvbHZlKHByb3BlcnRpZXNba10sIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhyZWZlcmVuY2UpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSByZWZlcmVuY2Vba107XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0eWxlRGVjbGFyYXRpb25TZXQucHJvdG90eXBlLCBrLCB7XG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNba10gPSBuZXcgU3R5bGVEZWNsYXJhdGlvbihwcm9wZXJ0eSwgU3R5bGVDb25zdGFudC5yZXNvbHZlKHYsIHRoaXMuX2NvbnN0YW50cykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1trXS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZSwgayArICctdHJhbnNpdGlvbicsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbnNba10gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25zW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgICB9O1xuXG4gICAgU3R5bGVEZWNsYXJhdGlvblNldC5wcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKGssIGdsb2JhbCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuX3RyYW5zaXRpb25zW2tdIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHVyYXRpb246IHV0aWwuY29hbGVzY2UodC5kdXJhdGlvbiwgZ2xvYmFsLmR1cmF0aW9uLCAzMDApLFxuICAgICAgICAgICAgZGVsYXk6IHV0aWwuY29hbGVzY2UodC5kZWxheSwgZ2xvYmFsLmRlbGF5LCAwKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZS5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciB2IGluIHRoaXMuX3ZhbHVlcykge1xuICAgICAgICAgICAgcmVzdWx0W3ZdID0gdGhpcy5fdmFsdWVzW3ZdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90cmFuc2l0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0W3QgKyAnLXRyYW5zaXRpb24nXSA9IHRoaXMuX3RyYW5zaXRpb25zW3ZdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN0eWxlRGVjbGFyYXRpb25TZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVuZGVyVHlwZSwgbGF5ZXJUeXBlLCBwcm9wZXJ0aWVzLCBjb25zdGFudHMpIHtcbiAgICByZXR1cm4gbmV3IGxvb2t1cFtyZW5kZXJUeXBlXVtsYXllclR5cGVdKHByb3BlcnRpZXMsIGNvbnN0YW50cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIFN0eWxlQ29uc3RhbnQgPSByZXF1aXJlKCcuL3N0eWxlX2NvbnN0YW50Jyk7XG52YXIgU3R5bGVUcmFuc2l0aW9uID0gcmVxdWlyZSgnLi9zdHlsZV90cmFuc2l0aW9uJyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvblNldCA9IHJlcXVpcmUoJy4vc3R5bGVfZGVjbGFyYXRpb25fc2V0Jyk7XG52YXIgTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4vbGF5b3V0X3Byb3BlcnRpZXMnKTtcbnZhciBQYWludFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3BhaW50X3Byb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZUxheWVyO1xuXG5mdW5jdGlvbiBTdHlsZUxheWVyKGxheWVyLCBjb25zdGFudHMpIHtcbiAgICB0aGlzLl9sYXllciA9IGxheWVyO1xuICAgIHRoaXMuX2NvbnN0YW50cyA9IGNvbnN0YW50cztcblxuICAgIHRoaXMuaWQgPSBsYXllci5pZDtcbiAgICB0aGlzLnJlZiA9IGxheWVyLnJlZjtcblxuICAgIC8vIFJlc29sdmVkIGFuZCBjYXNjYWRlZCBwYWludCBwcm9wZXJ0aWVzLlxuICAgIHRoaXMuX3Jlc29sdmVkID0ge307IC8vIGNsYXNzIG5hbWUgLT4gU3R5bGVEZWNsYXJhdGlvblNldFxuICAgIHRoaXMuX2Nhc2NhZGVkID0ge307IC8vIHByb3BlcnR5IG5hbWUgLT4gU3R5bGVUcmFuc2l0aW9uXG5cbiAgICB0aGlzLmFzc2lnbihsYXllcik7XG59XG5cblN0eWxlTGF5ZXIucHJvdG90eXBlID0ge1xuICAgIHJlc29sdmVMYXlvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVmKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBMYXlvdXRQcm9wZXJ0aWVzW3RoaXMudHlwZV0oXG4gICAgICAgICAgICAgICAgU3R5bGVDb25zdGFudC5yZXNvbHZlQWxsKHRoaXMuX2xheWVyLmxheW91dCwgdGhpcy5fY29uc3RhbnRzKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dFsnc3ltYm9sLXBsYWNlbWVudCddID09PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGF5b3V0Lmhhc093blByb3BlcnR5KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sYXlvdXQuaGFzT3duUHJvcGVydHkoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10gPSAnbWFwJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbJ3N5bWJvbC1hdm9pZC1lZGdlcyddID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRbbmFtZV0gPSBTdHlsZUNvbnN0YW50LnJlc29sdmUodmFsdWUsIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgfSxcblxuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFtuYW1lXTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZVJlZmVyZW5jZTogZnVuY3Rpb24obGF5ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZikge1xuICAgICAgICAgICAgdGhpcy5hc3NpZ24obGF5ZXJzW3RoaXMucmVmXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzb2x2ZVBhaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiB0aGlzLl9sYXllcikge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gcC5tYXRjaCgvXnBhaW50KD86XFwuKC4qKSk/JC8pO1xuICAgICAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVkW21hdGNoWzFdIHx8ICcnXSA9XG4gICAgICAgICAgICAgICAgbmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoJ3BhaW50JywgdGhpcy50eXBlLCB0aGlzLl9sYXllcltwXSwgdGhpcy5fY29uc3RhbnRzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXTtcbiAgICAgICAgaWYgKCFkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXSA9XG4gICAgICAgICAgICAgICAgbmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoJ3BhaW50JywgdGhpcy50eXBlLCB7fSwgdGhpcy5fY29uc3RhbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBkZWNsYXJhdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9LFxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSwga2xhc3MpIHtcbiAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXTtcbiAgICAgICAgaWYgKCFkZWNsYXJhdGlvbnMpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25zW25hbWVdO1xuICAgIH0sXG5cbiAgICBjYXNjYWRlOiBmdW5jdGlvbihjbGFzc2VzLCBvcHRpb25zLCBnbG9iYWxUcmFucywgYW5pbWF0aW9uTG9vcCkge1xuICAgICAgICBmb3IgKHZhciBrbGFzcyBpbiB0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICAgICAgaWYgKGtsYXNzICE9PSBcIlwiICYmICFjbGFzc2VzW2tsYXNzXSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzXSxcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBkZWNsYXJhdGlvbnMudmFsdWVzKCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld0RlY2xhcmF0aW9uID0gdmFsdWVzW2tdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRUcmFuc2l0aW9uID0gb3B0aW9ucy50cmFuc2l0aW9uID8gdGhpcy5fY2FzY2FkZWRba10gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIG5ldyB0cmFuc2l0aW9uIGlmIHRoZSBkZWNsYXJhdGlvbiBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgaWYgKCFvbGRUcmFuc2l0aW9uIHx8IG9sZFRyYW5zaXRpb24uZGVjbGFyYXRpb24uanNvbiAhPT0gbmV3RGVjbGFyYXRpb24uanNvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U3R5bGVUcmFucyA9IGRlY2xhcmF0aW9ucy50cmFuc2l0aW9uKGssIGdsb2JhbFRyYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RyYW5zaXRpb24gPSB0aGlzLl9jYXNjYWRlZFtrXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3R5bGVUcmFuc2l0aW9uKG5ld0RlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCBuZXdTdHlsZVRyYW5zKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGFuaW1hdGlvbiBsb29wIHVudGlsIHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdUcmFuc2l0aW9uLmluc3RhbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHJhbnNpdGlvbi5sb29wSUQgPSBhbmltYXRpb25Mb29wLnNldChuZXdUcmFuc2l0aW9uLmVuZFRpbWUgLSAobmV3IERhdGUoKSkuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25Mb29wLmNhbmNlbChvbGRUcmFuc2l0aW9uLmxvb3BJRCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVjYWxjdWxhdGU6IGZ1bmN0aW9uKHosIHpvb21IaXN0b3J5KSB7XG4gICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlLFxuICAgICAgICAgICAgY2FsY3VsYXRlZCA9IHRoaXMucGFpbnQgPSBuZXcgUGFpbnRQcm9wZXJ0aWVzW3R5cGVdKCk7XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLl9jYXNjYWRlZCkge1xuICAgICAgICAgICAgY2FsY3VsYXRlZFtrXSA9IHRoaXMuX2Nhc2NhZGVkW2tdLmF0KHosIHpvb21IaXN0b3J5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGlkZGVuID0gKHRoaXMubWluem9vbSAmJiB6IDwgdGhpcy5taW56b29tKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1heHpvb20gJiYgeiA+PSB0aGlzLm1heHpvb20pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB2aXNpYmlsaXR5IGNoZWNrIGZvciBub24tYnVja2V0ZWQgYmFja2dyb3VuZCBsYXllcnNcbiAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sYXlvdXQudmlzaWJpbGl0eSA9PT0gJ25vbmUnKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIGlmICgoY2FsY3VsYXRlZFsndGV4dC1vcGFjaXR5J10gPT09IDAgfHwgIXRoaXMubGF5b3V0Wyd0ZXh0LWZpZWxkJ10pICYmXG4gICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRbJ2ljb24tb3BhY2l0eSddID09PSAwIHx8ICF0aGlzLmxheW91dFsnaWNvbi1pbWFnZSddKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlbXVsdGlwbHlMYXllcihjYWxjdWxhdGVkLCAndGV4dCcpO1xuICAgICAgICAgICAgICAgIHByZW11bHRpcGx5TGF5ZXIoY2FsY3VsYXRlZCwgJ2ljb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGNhbGN1bGF0ZWRbdHlwZSArICctb3BhY2l0eSddID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmVtdWx0aXBseUxheWVyKGNhbGN1bGF0ZWQsIHR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2Nhc2NhZGVkWydsaW5lLWRhc2hhcnJheSddKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBkYXNoZWQsIHNjYWxlIHRoZSBkYXNoIGxlbmd0aHMgYnkgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIHdpZHRoIGF0IHRoZSBwcmV2aW91cyByb3VuZCB6b29tIGxldmVsLlxuICAgICAgICAgICAgdmFyIGRhc2hBcnJheSA9IGNhbGN1bGF0ZWRbJ2xpbmUtZGFzaGFycmF5J107XG4gICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5fY2FzY2FkZWRbJ2xpbmUtd2lkdGgnXSA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FzY2FkZWRbJ2xpbmUtd2lkdGgnXS5hdChNYXRoLmZsb29yKHopLCBJbmZpbml0eSkgOlxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRbJ2xpbmUtd2lkdGgnXTtcblxuICAgICAgICAgICAgZGFzaEFycmF5LmZyb21TY2FsZSAqPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICBkYXNoQXJyYXkudG9TY2FsZSAqPSBsaW5lV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuaGlkZGVuO1xuICAgIH0sXG5cbiAgICBhc3NpZ246IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhsYXllcixcbiAgICAgICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJyxcbiAgICAgICAgICAgICdtaW56b29tJywgJ21heHpvb20nLCAnZmlsdGVyJyxcbiAgICAgICAgICAgICdsYXlvdXQnXSkpO1xuICAgIH0sXG5cbiAgICBqc29uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LFxuICAgICAgICAgICAgdGhpcy5fbGF5ZXIsXG4gICAgICAgICAgICB1dGlsLnBpY2sodGhpcyxcbiAgICAgICAgICAgICAgICBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsXG4gICAgICAgICAgICAgICAgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLFxuICAgICAgICAgICAgICAgICdsYXlvdXQnLCAncGFpbnQnXSkpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHByZW11bHRpcGx5TGF5ZXIobGF5ZXIsIHR5cGUpIHtcbiAgICB2YXIgY29sb3JQcm9wID0gdHlwZSArICctY29sb3InLFxuICAgICAgICBoYWxvUHJvcCA9IHR5cGUgKyAnLWhhbG8tY29sb3InLFxuICAgICAgICBvdXRsaW5lUHJvcCA9IHR5cGUgKyAnLW91dGxpbmUtY29sb3InLFxuICAgICAgICBjb2xvciA9IGxheWVyW2NvbG9yUHJvcF0sXG4gICAgICAgIGhhbG9Db2xvciA9IGxheWVyW2hhbG9Qcm9wXSxcbiAgICAgICAgb3V0bGluZUNvbG9yID0gbGF5ZXJbb3V0bGluZVByb3BdLFxuICAgICAgICBvcGFjaXR5ID0gbGF5ZXJbdHlwZSArICctb3BhY2l0eSddO1xuXG4gICAgdmFyIGNvbG9yT3BhY2l0eSA9IGNvbG9yICYmIChvcGFjaXR5ICogY29sb3JbM10pO1xuICAgIHZhciBoYWxvT3BhY2l0eSA9IGhhbG9Db2xvciAmJiAob3BhY2l0eSAqIGhhbG9Db2xvclszXSk7XG4gICAgdmFyIG91dGxpbmVPcGFjaXR5ID0gb3V0bGluZUNvbG9yICYmIChvcGFjaXR5ICogb3V0bGluZUNvbG9yWzNdKTtcblxuICAgIGlmIChjb2xvck9wYWNpdHkgIT09IHVuZGVmaW5lZCAmJiBjb2xvck9wYWNpdHkgPCAxKSB7XG4gICAgICAgIGxheWVyW2NvbG9yUHJvcF0gPSB1dGlsLnByZW11bHRpcGx5KFtjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBjb2xvck9wYWNpdHldKTtcbiAgICB9XG4gICAgaWYgKGhhbG9PcGFjaXR5ICE9PSB1bmRlZmluZWQgJiYgaGFsb09wYWNpdHkgPCAxKSB7XG4gICAgICAgIGxheWVyW2hhbG9Qcm9wXSA9IHV0aWwucHJlbXVsdGlwbHkoW2hhbG9Db2xvclswXSwgaGFsb0NvbG9yWzFdLCBoYWxvQ29sb3JbMl0sIGhhbG9PcGFjaXR5XSk7XG4gICAgfVxuICAgIGlmIChvdXRsaW5lT3BhY2l0eSAhPT0gdW5kZWZpbmVkICYmIG91dGxpbmVPcGFjaXR5IDwgMSkge1xuICAgICAgICBsYXllcltvdXRsaW5lUHJvcF0gPSB1dGlsLnByZW11bHRpcGx5KFtvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eV0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZVRyYW5zaXRpb247XG5cbi8qXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byBkZWNsYXJhdGlvbnNcbiAqL1xuZnVuY3Rpb24gU3R5bGVUcmFuc2l0aW9uKGRlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCB2YWx1ZSkge1xuXG4gICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5lbmRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuICAgIHZhciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTtcbiAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdhcnJheScpICYmIGRlY2xhcmF0aW9uLnRyYW5zaXRpb25hYmxlKSB7XG4gICAgICAgIHRoaXMuaW50ZXJwID0gaW50ZXJwWm9vbVRyYW5zaXRpb25lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVycCA9IGludGVycG9sYXRlW3R5cGVdO1xuICAgIH1cblxuICAgIHRoaXMub2xkVHJhbnNpdGlvbiA9IG9sZFRyYW5zaXRpb247XG4gICAgdGhpcy5kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uIHx8IDA7XG4gICAgdGhpcy5kZWxheSA9IHZhbHVlLmRlbGF5IHx8IDA7XG5cbiAgICBpZiAoIXRoaXMuaW5zdGFudCgpKSB7XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuc3RhcnRUaW1lICsgdGhpcy5kdXJhdGlvbiArIHRoaXMuZGVsYXk7XG4gICAgICAgIHRoaXMuZWFzZSA9IHV0aWwuZWFzZUN1YmljSW5PdXQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZFRyYW5zaXRpb24gJiYgb2xkVHJhbnNpdGlvbi5lbmRUaW1lIDw9IHRoaXMuc3RhcnRUaW1lKSB7XG4gICAgICAgIC8vIE9sZCB0cmFuc2l0aW9uIGlzIGRvbmUgcnVubmluZywgc28gd2UgY2FuXG4gICAgICAgIC8vIGRlbGV0ZSBpdHMgcmVmZXJlbmNlIHRvIGl0cyBvbGQgdHJhbnNpdGlvbi5cblxuICAgICAgICBkZWxldGUgb2xkVHJhbnNpdGlvbi5vbGRUcmFuc2l0aW9uO1xuICAgIH1cbn1cblxuU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5pbnN0YW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICF0aGlzLm9sZFRyYW5zaXRpb24gfHwgIXRoaXMuaW50ZXJwIHx8ICh0aGlzLmR1cmF0aW9uID09PSAwICYmIHRoaXMuZGVsYXkgPT09IDApO1xufTtcblxuLypcbiAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyYW5zaXRpb25pbmcgcHJvcGVydHkgYXQgem9vbSBsZXZlbCBgemAgYW5kIG9wdGlvbmFsIHRpbWUgYHRgXG4gKi9cblN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbih6LCB6b29tSGlzdG9yeSwgdCkge1xuXG4gICAgdmFyIHZhbHVlID0gdGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUoeiwgem9vbUhpc3RvcnksIHRoaXMuZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuaW5zdGFudCgpKSByZXR1cm4gdmFsdWU7XG5cbiAgICB0ID0gdCB8fCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKHQgPCB0aGlzLmVuZFRpbWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5vbGRUcmFuc2l0aW9uLmF0KHosIHpvb21IaXN0b3J5LCB0aGlzLnN0YXJ0VGltZSk7XG4gICAgICAgIHZhciBlYXNlZCA9IHRoaXMuZWFzZSgodCAtIHRoaXMuc3RhcnRUaW1lIC0gdGhpcy5kZWxheSkgLyB0aGlzLmR1cmF0aW9uKTtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmludGVycChvbGRWYWx1ZSwgdmFsdWUsIGVhc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG5cbn07XG5cbmZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQoZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBmcm9tLnRvLFxuICAgICAgICBmcm9tU2NhbGU6IGZyb20udG9TY2FsZSxcbiAgICAgICAgdG86IHRvLnRvLFxuICAgICAgICB0b1NjYWxlOiB0by50b1NjYWxlLFxuICAgICAgICB0OiB0XG4gICAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBBbmNob3I7XG5cbmZ1bmN0aW9uIEFuY2hvcih4LCB5LCBhbmdsZSwgc2VnbWVudCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG5cbiAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgfVxufVxuXG5BbmNob3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQb2ludC5wcm90b3R5cGUpO1xuXG5BbmNob3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcy54LCB0aGlzLnksIHRoaXMuYW5nbGUsIHRoaXMuc2VnbWVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpblBhY2s7XG5mdW5jdGlvbiBCaW5QYWNrKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5mcmVlID0gW3sgeDogMCwgeTogMCwgdzogd2lkdGgsIGg6IGhlaWdodCB9XTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgYWxnb3JpdGhtIHRvIHJlY3Vyc2l2ZWx5IG1lcmdlIHRoZSBuZXdseSByZWxlYXNlZCBjZWxsIHdpdGggaXRzXG4gKiBuZWlnaGJvci4gVGhpcyBkb2Vzbid0IG1lcmdlIG1vcmUgdGhhbiB0d28gY2VsbHMgYXQgYSB0aW1lLCBhbmQgZmFpbHNcbiAqIGZvciBjb21wbGljYXRlZCBtZXJnZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5CaW5QYWNrLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24ocmVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mcmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmcmVlID0gdGhpcy5mcmVlW2ldO1xuXG4gICAgICAgIGlmIChmcmVlLnkgPT09IHJlY3QueSAmJiBmcmVlLmggPT09IHJlY3QuaCAmJiBmcmVlLnggKyBmcmVlLncgPT09IHJlY3QueCkge1xuICAgICAgICAgICAgZnJlZS53ICs9IHJlY3QudztcblxuICAgICAgICB9IGVsc2UgaWYgKGZyZWUueCA9PT0gcmVjdC54ICYmIGZyZWUudyA9PT0gcmVjdC53ICYmIGZyZWUueSArIGZyZWUuaCA9PT0gcmVjdC55KSB7XG4gICAgICAgICAgICBmcmVlLmggKz0gcmVjdC5oO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjdC55ID09PSBmcmVlLnkgJiYgcmVjdC5oID09PSBmcmVlLmggJiYgcmVjdC54ICsgcmVjdC53ID09PSBmcmVlLngpIHtcbiAgICAgICAgICAgIGZyZWUueCA9IHJlY3QueDtcbiAgICAgICAgICAgIGZyZWUudyArPSByZWN0Lnc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWN0LnggPT09IGZyZWUueCAmJiByZWN0LncgPT09IGZyZWUudyAmJiByZWN0LnkgKyByZWN0LmggPT09IGZyZWUueSkge1xuICAgICAgICAgICAgZnJlZS55ID0gcmVjdC55O1xuICAgICAgICAgICAgZnJlZS5oICs9IHJlY3QuaDtcblxuICAgICAgICB9IGVsc2UgY29udGludWU7XG5cbiAgICAgICAgdGhpcy5mcmVlLnNwbGljZShpLCAxKTtcbiAgICAgICAgdGhpcy5yZWxlYXNlKGZyZWUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICB9XG4gICAgdGhpcy5mcmVlLnB1c2gocmVjdCk7XG59O1xuXG5CaW5QYWNrLnByb3RvdHlwZS5hbGxvY2F0ZSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCBmcmVlIHJlY3QgYW5nbGVcbiAgICB2YXIgcmVjdCA9IHsgeDogSW5maW5pdHksIHk6IEluZmluaXR5LCB3OiBJbmZpbml0eSwgaDogSW5maW5pdHkgfTtcbiAgICB2YXIgc21hbGxlc3QgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZnJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5mcmVlW2ldO1xuICAgICAgICBpZiAod2lkdGggPD0gcmVmLncgJiYgaGVpZ2h0IDw9IHJlZi5oICYmIHJlZi55IDw9IHJlY3QueSAmJiByZWYueCA8PSByZWN0LngpIHtcbiAgICAgICAgICAgIHJlY3QgPSByZWY7XG4gICAgICAgICAgICBzbWFsbGVzdCA9IGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc21hbGxlc3QgPCAwKSB7XG4gICAgICAgIC8vIFRoZXJlJ3Mgbm8gc3BhY2UgbGVmdCBmb3IgdGhpcyBjaGFyLlxuICAgICAgICByZXR1cm4geyB4OiAtMSwgeTogLTEgfTtcbiAgICB9XG5cbiAgICB0aGlzLmZyZWUuc3BsaWNlKHNtYWxsZXN0LCAxKTtcblxuICAgIC8vIFNob3J0ZXIvTG9uZ2VyIEF4aXMgU3BsaXQgUnVsZSAoU0FTKVxuICAgIC8vIGh0dHA6Ly9jbGIuZGVtb24uZmkvZmlsZXMvUmVjdGFuZ2xlQmluUGFjay5wZGYgcC4gMTVcbiAgICAvLyBJZ25vcmUgdGhlIGRpbWVuc2lvbiBvZiBSIGFuZCBqdXN0IHNwbGl0IGxvbmcgdGhlIHNob3J0ZXIgZGltZW5zaW9uXG4gICAgLy8gU2VlIEFsc286IGh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+Y2hhemVsbGUvcHVicy9ibGJpbnBhY2tpbmcucGRmXG4gICAgaWYgKHJlY3QudyA8IHJlY3QuaCkge1xuICAgICAgICAvLyBzcGxpdCBob3Jpem9udGFsbHlcbiAgICAgICAgLy8gKy0tKy0tLStcbiAgICAgICAgLy8gfF9ffF9fX3wgIDwtLSBiMVxuICAgICAgICAvLyArLS0tLS0tKyAgPC0tIGIyXG4gICAgICAgIGlmIChyZWN0LncgPiB3aWR0aCkgdGhpcy5mcmVlLnB1c2goeyB4OiByZWN0LnggKyB3aWR0aCwgeTogcmVjdC55LCB3OiByZWN0LncgLSB3aWR0aCwgaDogaGVpZ2h0IH0pO1xuICAgICAgICBpZiAocmVjdC5oID4gaGVpZ2h0KSB0aGlzLmZyZWUucHVzaCh7IHg6IHJlY3QueCwgeTogcmVjdC55ICsgaGVpZ2h0LCB3OiByZWN0LncsIGg6IHJlY3QuaCAtIGhlaWdodCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzcGxpdCB2ZXJ0aWNhbGx5XG4gICAgICAgIC8vICstLSstLS0rXG4gICAgICAgIC8vIHxfX3wgICB8IDwtLSBiMVxuICAgICAgICAvLyArLS18LS0tKyA8LS0gYjJcbiAgICAgICAgaWYgKHJlY3QudyA+IHdpZHRoKSB0aGlzLmZyZWUucHVzaCh7IHg6IHJlY3QueCArIHdpZHRoLCB5OiByZWN0LnksIHc6IHJlY3QudyAtIHdpZHRoLCBoOiByZWN0LmggfSk7XG4gICAgICAgIGlmIChyZWN0LmggPiBoZWlnaHQpIHRoaXMuZnJlZS5wdXNoKHsgeDogcmVjdC54LCB5OiByZWN0LnkgKyBoZWlnaHQsIHc6IHdpZHRoLCBoOiByZWN0LmggLSBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHc6IHdpZHRoLCBoOiBoZWlnaHQgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tNYXhBbmdsZTtcblxuLyoqXG4gKiBMYWJlbHMgcGxhY2VkIGFyb3VuZCByZWFsbHkgc2hhcnAgYW5nbGVzIGFyZW4ndCByZWFkYWJsZS4gQ2hlY2sgaWYgYW55XG4gKiBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgbGFiZWwgaGFzIGEgY29tYmluZWQgYW5nbGUgdGhhdCBpcyB0b28gYmlnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8UG9pbnQ+fSBsaW5lXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yIFRoZSBwb2ludCBvbiB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpbmRvd1NpemUgVGhlIGNoZWNrIGZhaWxzIGlmIHRoZSBjb21iaW5lZCBhbmdsZXMgd2l0aGluIGEgcGFydCBvZiB0aGUgbGluZSB0aGF0IGlzIGB3aW5kb3dTaXplYCBsb25nIGlzIHRvbyBiaWcuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4QW5nbGUgVGhlIG1heGltdW0gY29tYmluZWQgYW5nbGUgdGhhdCBhbnkgd2luZG93IGFsb25nIHRoZSBsYWJlbCBpcyBhbGxvd2VkIHRvIGhhdmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgd2luZG93U2l6ZSwgbWF4QW5nbGUpIHtcblxuICAgIC8vIGhvcml6b250YWwgbGFiZWxzIGFsd2F5cyBwYXNzXG4gICAgaWYgKGFuY2hvci5zZWdtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHAgPSBhbmNob3I7XG4gICAgdmFyIGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIHZhciBhbmNob3JEaXN0YW5jZSA9IDA7XG5cbiAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgaW5kZXgtLTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9XG5cbiAgICBhbmNob3JEaXN0YW5jZSArPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgaW5kZXgrKztcblxuICAgIC8vIHN0b3JlIHJlY2VudCBjb3JuZXJzIGFuZCB0aGVpciB0b3RhbCBhbmdsZSBkaWZmZXJlbmNlXG4gICAgdmFyIHJlY2VudENvcm5lcnMgPSBbXTtcbiAgICB2YXIgcmVjZW50QW5nbGVEZWx0YSA9IDA7XG5cbiAgICAvLyBtb3ZlIGZvcndhcmRzIGJ5IHRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGFuZCBjaGVjayBhbmdsZXMgYWxvbmcgdGhlIHdheVxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA8IGxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgdmFyIG5leHQgPSBsaW5lW2luZGV4ICsgMV07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoIW5leHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB2YXIgYW5nbGVEZWx0YSA9IHByZXYuYW5nbGVUbyhjdXJyZW50KSAtIGN1cnJlbnQuYW5nbGVUbyhuZXh0KTtcbiAgICAgICAgLy8gcmVzdHJpY3QgYW5nbGUgdG8gLXBpLi5waSByYW5nZVxuICAgICAgICBhbmdsZURlbHRhID0gKChhbmdsZURlbHRhICsgMyAqIE1hdGguUEkpICUgKE1hdGguUEkgKiAyKSkgLSBNYXRoLlBJO1xuXG4gICAgICAgIHJlY2VudENvcm5lcnMucHVzaCh7XG4gICAgICAgICAgICBkaXN0YW5jZTogYW5jaG9yRGlzdGFuY2UsXG4gICAgICAgICAgICBhbmdsZURlbHRhOiBhbmdsZURlbHRhXG4gICAgICAgIH0pO1xuICAgICAgICByZWNlbnRBbmdsZURlbHRhICs9IGFuZ2xlRGVsdGE7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcm5lcnMgdGhhdCBhcmUgZmFyIGVub3VnaCBhd2F5IGZyb20gdGhlIGxpc3Qgb2YgcmVjZW50IGFuY2hvcnNcbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlIC0gcmVjZW50Q29ybmVyc1swXS5kaXN0YW5jZSA+IHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgLT0gcmVjZW50Q29ybmVycy5zaGlmdCgpLmFuZ2xlRGVsdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgc3VtIG9mIGFuZ2xlcyB3aXRoaW4gdGhlIHdpbmRvdyBhcmVhIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS4gY2hlY2sgZmFpbHMuXG4gICAgICAgIGlmIChNYXRoLmFicyhyZWNlbnRBbmdsZURlbHRhKSA+IG1heEFuZ2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gY3VycmVudC5kaXN0KG5leHQpO1xuICAgIH1cblxuICAgIC8vIG5vIHBhcnQgb2YgdGhlIGxpbmUgaGFkIGFuIGFuZ2xlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiBjaGVjayBwYXNzZXMuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcExpbmU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydCBvZiBhIG11bHRpbGluZSB0aGF0IGludGVyc2VjdHMgd2l0aCB0aGUgcHJvdmlkZWQgcmVjdGFuZ3VsYXIgYm94LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8UG9pbnQ+Pn0gbGluZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHtudW1iZXJ9IHgyIHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJveFxuICogQHJldHVybnMge0FycmF5PEFycmF5PFBvaW50Pj59IGxpbmVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGlwTGluZShsaW5lcywgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgY2xpcHBlZExpbmVzID0gW107XG5cbiAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICAgIHZhciBjbGlwcGVkTGluZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcDAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgdmFyIHAxID0gbGluZVtpICsgMV07XG5cblxuICAgICAgICAgICAgaWYgKHAwLnggPCB4MSAmJiBwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55IDwgeTEgJiYgcDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueCA+PSB4MiAmJiBwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55ID49IHkyICYmIHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjbGlwcGVkTGluZSB8fCAhcDAuZXF1YWxzKGNsaXBwZWRMaW5lW2NsaXBwZWRMaW5lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lID0gW3AwXTtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZXMucHVzaChjbGlwcGVkTGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaXBwZWRMaW5lLnB1c2gocDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWRMaW5lcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25Cb3g7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gYm94IHJlcHJlc2VudHMgYW4gYXJlYSBvZiB0aGUgbWFwIHRoYXQgdGhhdCBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGxhYmVsLiBDb2xsaXNpb25GZWF0dXJlIHVzZXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgY29sbGlzaW9uIGJveGVzIHRvXG4gKiByZXByZXNlbnQgYWxsIHRoZSBhcmVhIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGFiZWwuIFRoZXkgYXJlIHVzZWQgdG9cbiAqIHByZXZlbnQgY29sbGlzaW9ucyBiZXR3ZWVuIGxhYmVscy5cbiAqXG4gKiBBIGNvbGxpc2lvbiBib3ggYWN0dWFsbHkgcmVwcmVzZW50cyBhIDNkIHZvbHVtZS4gVGhlIGZpcnN0IHR3byBkaW1lbnNpb25zLFxuICogeCBhbmQgeSwgYXJlIHNwZWNpZmllZCB3aXRoIGBhbmNob3JgIGFsb25nIHdpdGggYHgxYCwgYHkxYCwgYHgyYCwgYHkyYC5cbiAqIFRoZSB0aGlyZCBkaW1lbnNpb24sIHpvb20sIGlzIGxpbWl0ZWQgYnkgYG1heFNjYWxlYCB3aGljaCBkZXRlcm1pbmVzXG4gKiBob3cgZmFyIGluIHRoZSB6IGRpbWVuc2lvbnMgdGhlIGJveCBleHRlbmRzLlxuICpcbiAqIEFzIHlvdSB6b29tIGluIG9uIGEgbWFwLCBhbGwgcG9pbnRzIG9uIHRoZSBtYXAgZ2V0IGZ1cnRoZXIgYW5kIGZ1cnRoZXIgYXBhcnRcbiAqIGJ1dCBsYWJlbHMgc3RheSByb3VnaGx5IHRoZSBzYW1lIHNpemUuIExhYmVscyBjb3ZlciBsZXNzIHJlYWwgd29ybGQgYXJlYSBvblxuICogdGhlIG1hcCBhdCBoaWdoZXIgem9vbSBsZXZlbHMgdGhhbiB0aGV5IGRvIGF0IGxvd2VyIHpvb20gbGV2ZWxzLiBUaGlzIGlzIHdoeVxuICogYXJlYXMgYXJlIGFyZSByZXByZXNlbnRlZCB3aXRoIGFuIGFuY2hvciBwb2ludCBhbmQgb2Zmc2V0cyBmcm9tIHRoYXQgcG9pbnRcbiAqIGluc3RlYWQgb2YganVzdCB1c2luZyBmb3VyIGFic29sdXRlIHBvaW50cy5cbiAqXG4gKiBMaW5lIGxhYmVscyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzZXQgb2YgdGhlc2UgYm94ZXMgc3BhY2VkIG91dCBhbG9uZyBhIGxpbmUuXG4gKiBXaGVuIHlvdSB6b29tIGluLCBsaW5lIGxhYmVscyBjb3ZlciBsZXNzIHJlYWwgd29ybGQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmVcbiAqIHRoYW4gdGhleSB1c2VkIHRvLiBDb2xsaXNpb24gYm94ZXMgbmVhciB0aGUgZWRnZXMgdGhhdCB1c2VkIHRvIGNvdmVyIGxhYmVsXG4gKiBubyBsb25nZXIgZG8uIElmIGEgYm94IGRvZXNuJ3QgY292ZXIgdGhlIGxhYmVsIGFueW1vcmUgaXQgc2hvdWxkIGJlIGlnbm9yZWRcbiAqIHdoZW4gZG9pbmcgY29sbGlzaW9uIGNoZWNrcy4gYG1heFNjYWxlYCBpcyBob3cgbXVjaCB5b3UgY2FuIHNjYWxlIHRoZSBtYXBcbiAqIGJlZm9yZSB0aGUgbGFiZWwgaXNuJ3Qgd2l0aGluIHRoZSBib3ggYW55bW9yZS5cbiAqIEZvciBleGFtcGxlXG4gKiBsb3dlciB6b29tOlxuICogaHR0cHM6Ly9jbG91ZC5naXRodWJ1c2VyY29udGVudC5jb20vYXNzZXRzLzE0MjE2NTIvODA2MDA5NC80ZDk3NWY3Ni0wZTkxLTExZTUtODRiMS00ZWRlYjMwYTU4NzUucG5nXG4gKiBzbGlnaHRseSBoaWdoZXIgem9vbTpcbiAqIGh0dHBzOi8vY2xvdWQuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fzc2V0cy8xNDIxNjUyLzgwNjAwNjEvMjZhZTFjMzgtMGU5MS0xMWU1LThjNWEtOWYzODBiZjI5ZjBhLnBuZ1xuICogSW4gdGhlIHpvb21lZCBpbiBpbWFnZSB0aGUgdHdvIGdyZXkgYm94ZXMgb24gZWl0aGVyIHNpZGUgZG9uJ3QgY292ZXIgdGhlXG4gKiBsYWJlbCBhbnltb3JlLiBUaGVpciBtYXhTY2FsZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NhbGUuXG4gKlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25Cb3hcbiAqIEBwYXJhbSB7UG9pbnR9IGFuY2hvclBvaW50IFRoZSBhbmNob3IgcG9pbnQgdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQuXG4gKiBAcGFyYW0ge251bWJlcn0geDEgVGhlIGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvciB0byB0aGUgbGVmdCBlZGdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHkxIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IgdG8gdGhlIHRvcCBlZGdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHgyIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IgdG8gdGhlIHJpZ2h0IGVkZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0geTIgVGhlIGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvciB0byB0aGUgYm90dG9tIGVkZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4U2NhbGUgVGhlIG1heGltdW0gc2NhbGUgdGhpcyBib3ggY2FuIGJsb2NrIG90aGVyIGJveGVzIGF0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29sbGlzaW9uQm94KGFuY2hvclBvaW50LCB4MSwgeTEsIHgyLCB5MiwgbWF4U2NhbGUpIHtcbiAgICAvLyB0aGUgYm94IGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50XG4gICAgdGhpcy5hbmNob3JQb2ludCA9IGFuY2hvclBvaW50O1xuXG4gICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICB0aGlzLngxID0geDE7XG4gICAgdGhpcy55MSA9IHkxO1xuICAgIHRoaXMueDIgPSB4MjtcbiAgICB0aGlzLnkyID0geTI7XG5cbiAgICAvLyB0aGUgYm94IGlzIG9ubHkgdmFsaWQgZm9yIHNjYWxlcyA8IG1heFNjYWxlLlxuICAgIC8vIFRoZSBib3ggZG9lcyBub3QgYmxvY2sgb3RoZXIgYm94ZXMgYXQgc2NhbGVzID49IG1heFNjYWxlO1xuICAgIHRoaXMubWF4U2NhbGUgPSBtYXhTY2FsZTtcblxuICAgIC8vIHRoZSBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgY2FuIGZpcnN0IGJlIHNob3duXG4gICAgdGhpcy5wbGFjZW1lbnRTY2FsZSA9IDA7XG5cbiAgICAvLyByb3RhdGVkIGFuZCBzY2FsZWQgYmJveCB1c2VkIGZvciBpbmRleGluZ1xuICAgIHRoaXNbMF0gPSB0aGlzWzFdID0gdGhpc1syXSA9IHRoaXNbM10gPSAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29sbGlzaW9uQm94ID0gcmVxdWlyZSgnLi9jb2xsaXNpb25fYm94Jyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkZlYXR1cmU7XG5cbi8qKlxuICogQSBDb2xsaXNpb25GZWF0dXJlIHJlcHJlc2VudHMgdGhlIGFyZWEgb2YgdGhlIHRpbGUgY292ZXJlZCBieSBhIHNpbmdsZSBsYWJlbC5cbiAqIEl0IGlzIHVzZWQgd2l0aCBDb2xsaXNpb25UaWxlIHRvIGNoZWNrIGlmIHRoZSBsYWJlbCBvdmVybGFwcyB3aXRoIGFueVxuICogcHJldmlvdXMgbGFiZWxzLiBBIENvbGxpc2lvbkZlYXR1cmUgaXMgbW9zdGx5IGp1c3QgYSBzZXQgb2YgQ29sbGlzaW9uQm94XG4gKiBvYmplY3RzLlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25GZWF0dXJlXG4gKiBAcGFyYW0ge0FycmF5PFBvaW50Pn0gbGluZSBUaGUgZ2VvbWV0cnkgdGhlIGxhYmVsIGlzIHBsYWNlZCBvbi5cbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3IgVGhlIHBvaW50IGFsb25nIHRoZSBsaW5lIGFyb3VuZCB3aGljaCB0aGUgbGFiZWwgaXMgYW5jaG9yZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gc2hhcGVkIFRoZSB0ZXh0IG9yIGljb24gc2hhcGluZyByZXN1bHRzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZyBUaGUgYW1vdW50IG9mIHBhZGRpbmcgdG8gYWRkIGFyb3VuZCB0aGUgbGFiZWwgZWRnZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsaWduTGluZSBXaGV0aGVyIHRoZSBsYWJlbCBpcyBhbGlnbmVkIHdpdGggdGhlIGxpbmUgb3IgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvbGxpc2lvbkZlYXR1cmUobGluZSwgYW5jaG9yLCBzaGFwZWQsIGJveFNjYWxlLCBwYWRkaW5nLCBhbGlnbkxpbmUpIHtcblxuICAgIHZhciB5MSA9IHNoYXBlZC50b3AgKiBib3hTY2FsZSAtIHBhZGRpbmc7XG4gICAgdmFyIHkyID0gc2hhcGVkLmJvdHRvbSAqIGJveFNjYWxlICsgcGFkZGluZztcbiAgICB2YXIgeDEgPSBzaGFwZWQubGVmdCAqIGJveFNjYWxlIC0gcGFkZGluZztcbiAgICB2YXIgeDIgPSBzaGFwZWQucmlnaHQgKiBib3hTY2FsZSArIHBhZGRpbmc7XG5cbiAgICB0aGlzLmJveGVzID0gW107XG5cbiAgICBpZiAoYWxpZ25MaW5lKSB7XG5cbiAgICAgICAgdmFyIGhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgIHZhciBsZW5ndGggPSB4MiAtIHgxO1xuXG4gICAgICAgIGlmIChoZWlnaHQgPD0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICBoZWlnaHQgPSBNYXRoLm1heCgxMCAqIGJveFNjYWxlLCBoZWlnaHQpO1xuXG4gICAgICAgIHRoaXMuX2FkZExpbmVDb2xsaXNpb25Cb3hlcyhsaW5lLCBhbmNob3IsIGxlbmd0aCwgaGVpZ2h0KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm94ZXMucHVzaChuZXcgQ29sbGlzaW9uQm94KG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpLCB4MSwgeTEsIHgyLCB5MiwgSW5maW5pdHkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2V0IG9mIENvbGxpc2lvbkJveCBvYmplY3RzIGZvciBhIGxpbmUuXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmVcbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3hTaXplIFRoZSBzaXplIG9mIHRoZSBjb2xsaXNpb24gYm94ZXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcyA9IGZ1bmN0aW9uKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGJveFNpemUpIHtcbiAgICB2YXIgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgIHZhciBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCk7XG5cbiAgICAvLyBvZmZzZXQgdGhlIGNlbnRlciBvZiB0aGUgZmlyc3QgYm94IGJ5IGhhbGYgYSBib3ggc28gdGhhdCB0aGUgZWRnZSBvZiB0aGVcbiAgICAvLyBib3ggaXMgYXQgdGhlIGVkZ2Ugb2YgdGhlIGxhYmVsLlxuICAgIHZhciBmaXJzdEJveE9mZnNldCA9IC1ib3hTaXplIC8gMjtcblxuICAgIHZhciBiYm94ZXMgPSB0aGlzLmJveGVzO1xuXG4gICAgdmFyIHAgPSBhbmNob3I7XG4gICAgdmFyIGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIHZhciBhbmNob3JEaXN0YW5jZSA9IGZpcnN0Qm94T2Zmc2V0O1xuXG4gICAgLy8gbW92ZSBiYWNrd2FyZHMgYWxvbmcgdGhlIGxpbmUgdG8gdGhlIGZpcnN0IHNlZ21lbnQgdGhlIGxhYmVsIGFwcGVhcnMgb25cbiAgICBkbyB7XG4gICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgIC8vIGNoZWNrTWF4QW5nbGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYXVnaHQgdGhpc1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gYmJveGVzO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9IHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpO1xuXG4gICAgdmFyIHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5Cb3hlczsgaSsrKSB7XG4gICAgICAgIC8vIHRoZSBkaXN0YW5jZSB0aGUgYm94IHdpbGwgYmUgZnJvbSB0aGUgYW5jaG9yXG4gICAgICAgIHZhciBib3hEaXN0YW5jZVRvQW5jaG9yID0gLWxhYmVsTGVuZ3RoIC8gMiArIGkgKiBzdGVwO1xuXG4gICAgICAgIC8vIHRoZSBib3ggaXMgbm90IG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIE1vdmUgdG8gdGhlIG5leHQgc2VnbWVudC5cbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlICsgc2VnbWVudExlbmd0aCA8IGJveERpc3RhbmNlVG9BbmNob3IpIHtcbiAgICAgICAgICAgIGFuY2hvckRpc3RhbmNlICs9IHNlZ21lbnRMZW5ndGg7XG4gICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBlbm91Z2ggcm9vbSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gbGluZS5sZW5ndGgpIHJldHVybiBiYm94ZXM7XG5cbiAgICAgICAgICAgIHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudFxuICAgICAgICB2YXIgc2VnbWVudEJveERpc3RhbmNlID0gYm94RGlzdGFuY2VUb0FuY2hvciAtIGFuY2hvckRpc3RhbmNlO1xuXG4gICAgICAgIHZhciBwMCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICB2YXIgcDEgPSBsaW5lW2luZGV4ICsgMV07XG4gICAgICAgIHZhciBib3hBbmNob3JQb2ludCA9IHAxLnN1YihwMCkuX3VuaXQoKS5fbXVsdChzZWdtZW50Qm94RGlzdGFuY2UpLl9hZGQocDApO1xuXG4gICAgICAgIHZhciBkaXN0YW5jZVRvSW5uZXJFZGdlID0gTWF0aC5tYXgoTWF0aC5hYnMoYm94RGlzdGFuY2VUb0FuY2hvciAtIGZpcnN0Qm94T2Zmc2V0KSAtIHN0ZXAgLyAyLCAwKTtcbiAgICAgICAgdmFyIG1heFNjYWxlID0gbGFiZWxMZW5ndGggLyAyIC8gZGlzdGFuY2VUb0lubmVyRWRnZTtcblxuICAgICAgICBiYm94ZXMucHVzaChuZXcgQ29sbGlzaW9uQm94KGJveEFuY2hvclBvaW50LCAtYm94U2l6ZSAvIDIsIC1ib3hTaXplIC8gMiwgYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLCBtYXhTY2FsZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYm94ZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmJ1c2ggPSByZXF1aXJlKCdyYnVzaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvblRpbGU7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gdGlsZSB1c2VkIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIG92ZXJsYXBwaW5nLiBJdCBrZWVwIHRyYWNrcyBvZlxuICogd2hlcmUgcHJldmlvdXMgc3ltYm9scyBoYXZlIGJlZW4gcGxhY2VkIGFuZCBpcyB1c2VkIHRvIGNoZWNrIGlmIGEgbmV3XG4gKiBzeW1ib2wgb3ZlcmxhcHMgd2l0aCBhbnkgcHJldmlvdXNseSBhZGRlZCBzeW1ib2xzLlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25UaWxlXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwaXRjaFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29sbGlzaW9uVGlsZShhbmdsZSwgcGl0Y2gpIHtcbiAgICB0aGlzLnRyZWUgPSByYnVzaCgpO1xuICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcblxuICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gW2NvcywgLXNpbiwgc2luLCBjb3NdO1xuXG4gICAgLy8gU3RyZXRjaCBib3hlcyBpbiB5IGRpcmVjdGlvbiB0byBhY2NvdW50IGZvciB0aGUgbWFwIHRpbHQuXG4gICAgdGhpcy55U3RyZXRjaCA9IDEgLyBNYXRoLmNvcyhwaXRjaCAvIDE4MCAqIE1hdGguUEkpO1xuXG4gICAgLy8gVGhlIGFtb3VudCB0aGUgbWFwIGlzIHNxdWlzaGVkIGRlcGVuZHMgb24gdGhlIHkgcG9zaXRpb24uXG4gICAgLy8gU29ydCBvZiBhY2NvdW50IGZvciB0aGlzIGJ5IG1ha2luZyBhbGwgYm94ZXMgYSBiaXQgYmlnZ2VyLlxuICAgIHRoaXMueVN0cmV0Y2ggPSBNYXRoLnBvdyh0aGlzLnlTdHJldGNoLCAxLjMpO1xufVxuXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5taW5TY2FsZSA9IDAuMjU7XG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZSA9IDI7XG5cblxuLyoqXG4gKiBGaW5kIHRoZSBzY2FsZSBhdCB3aGljaCB0aGUgY29sbGlzaW9uRmVhdHVyZSBjYW4gYmUgc2hvd24gd2l0aG91dFxuICogb3ZlcmxhcHBpbmcgd2l0aCBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0ge0NvbGxpc2lvbkZlYXR1cmV9IGNvbGxpc2lvbkZlYXR1cmVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHBsYWNlbWVudFNjYWxlXG4gKiBAcHJpdmF0ZVxuICovXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5wbGFjZUNvbGxpc2lvbkZlYXR1cmUgPSBmdW5jdGlvbihjb2xsaXNpb25GZWF0dXJlKSB7XG5cbiAgICB2YXIgbWluUGxhY2VtZW50U2NhbGUgPSB0aGlzLm1pblNjYWxlO1xuICAgIHZhciByb3RhdGlvbk1hdHJpeCA9IHRoaXMucm90YXRpb25NYXRyaXg7XG4gICAgdmFyIHlTdHJldGNoID0gdGhpcy55U3RyZXRjaDtcblxuICAgIGZvciAodmFyIGIgPSAwOyBiIDwgY29sbGlzaW9uRmVhdHVyZS5ib3hlcy5sZW5ndGg7IGIrKykge1xuXG4gICAgICAgIHZhciBib3ggPSBjb2xsaXNpb25GZWF0dXJlLmJveGVzW2JdO1xuXG4gICAgICAgIHZhciBhbmNob3JQb2ludCA9IGJveC5hbmNob3JQb2ludC5tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcbiAgICAgICAgdmFyIHggPSBhbmNob3JQb2ludC54O1xuICAgICAgICB2YXIgeSA9IGFuY2hvclBvaW50Lnk7XG5cbiAgICAgICAgYm94WzBdID0geCArIGJveC54MTtcbiAgICAgICAgYm94WzFdID0geSArIGJveC55MSAqIHlTdHJldGNoO1xuICAgICAgICBib3hbMl0gPSB4ICsgYm94LngyO1xuICAgICAgICBib3hbM10gPSB5ICsgYm94LnkyICogeVN0cmV0Y2g7XG5cbiAgICAgICAgdmFyIGJsb2NraW5nQm94ZXMgPSB0aGlzLnRyZWUuc2VhcmNoKGJveCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja2luZ0JveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2tpbmcgPSBibG9ja2luZ0JveGVzW2ldO1xuICAgICAgICAgICAgdmFyIGJsb2NraW5nQW5jaG9yUG9pbnQgPSBibG9ja2luZy5hbmNob3JQb2ludC5tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbG93ZXN0IHNjYWxlIGF0IHdoaWNoIHRoZSB0d28gYm94ZXMgY2FuIGZpdCBzaWRlIGJ5IHNpZGUgd2l0aG91dCBvdmVybGFwcGluZy5cbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIGFsZ29yaXRobTpcbiAgICAgICAgICAgIHZhciBzMSA9IChibG9ja2luZy54MSAtIGJveC54MikgLyAoeCAtIGJsb2NraW5nQW5jaG9yUG9pbnQueCk7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIGxlZnQgb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHMyID0gKGJsb2NraW5nLngyIC0gYm94LngxKSAvICh4IC0gYmxvY2tpbmdBbmNob3JQb2ludC54KTsgLy8gc2NhbGUgYXQgd2hpY2ggbmV3IGJveCBpcyB0byB0aGUgcmlnaHQgb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHMzID0gKGJsb2NraW5nLnkxIC0gYm94LnkyKSAqIHlTdHJldGNoIC8gKHkgLSBibG9ja2luZ0FuY2hvclBvaW50LnkpOyAvLyBzY2FsZSBhdCB3aGljaCBuZXcgYm94IGlzIHRvIHRoZSB0b3Agb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHM0ID0gKGJsb2NraW5nLnkyIC0gYm94LnkxKSAqIHlTdHJldGNoIC8gKHkgLSBibG9ja2luZ0FuY2hvclBvaW50LnkpOyAvLyBzY2FsZSBhdCB3aGljaCBuZXcgYm94IGlzIHRvIHRoZSBib3R0b20gb2Ygb2xkIGJveFxuXG4gICAgICAgICAgICBpZiAoaXNOYU4oczEpIHx8IGlzTmFOKHMyKSkgczEgPSBzMiA9IDE7XG4gICAgICAgICAgICBpZiAoaXNOYU4oczMpIHx8IGlzTmFOKHM0KSkgczMgPSBzNCA9IDE7XG5cbiAgICAgICAgICAgIHZhciBjb2xsaXNpb25GcmVlU2NhbGUgPSBNYXRoLm1pbihNYXRoLm1heChzMSwgczIpLCBNYXRoLm1heChzMywgczQpKTtcblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IGJsb2NraW5nLm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBib3gncyBtYXhTY2FsZSB0aGUgbGFiZWwgaGFzIHNocnVuayBlbm91Z2ggdGhhdCB0aGUgYm94IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gY292ZXIgaXQsXG4gICAgICAgICAgICAgICAgLy8gc28gdW5ibG9jayB0aGUgbmV3IGJveCBhdCB0aGUgc2NhbGUgdGhhdCB0aGUgb2xkIGJveCBkaXNhcHBlYXJzLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJsb2NraW5nLm1heFNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uRnJlZVNjYWxlID4gYm94Lm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBjYW4gb25seSBiZSBzaG93biBhZnRlciBpdCBpcyB2aXNpYmxlLCB0aGVuIHRoZSBib3ggY2FuIG5ldmVyIGJlIHNob3duLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB0aGUgbGFiZWwgY2FuIGJlIHNob3duIGFmdGVyIHRoaXMgYm94IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJveC5tYXhTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IG1pblBsYWNlbWVudFNjYWxlICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA+PSBibG9ja2luZy5wbGFjZW1lbnRTY2FsZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY29sbGlzaW9uIG9jY3VycyBhdCBhIGxvd2VyIHNjYWxlIHRoYW4gcHJldmlvdXNseSBmb3VuZCBjb2xsaXNpb25zXG4gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBjb2xsaXNpb24gb2NjdXJzIHdoaWxlIHRoZSBvdGhlciBsYWJlbCBpcyB2aXNpYmxlXG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIHRoaXMgaXMgdGhlIGxvd2VzdCBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgd29uJ3QgY29sbGlkZSB3aXRoIGFueXRoaW5nXG4gICAgICAgICAgICAgICAgbWluUGxhY2VtZW50U2NhbGUgPSBjb2xsaXNpb25GcmVlU2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtaW5QbGFjZW1lbnRTY2FsZSA+PSB0aGlzLm1heFNjYWxlKSByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG59O1xuXG4vKipcbiAqIFJlbWVtYmVyIHRoaXMgY29sbGlzaW9uRmVhdHVyZSBhbmQgd2hhdCBzY2FsZSBpdCB3YXMgcGxhY2VkIGF0IHRvIGJsb2NrXG4gKiBsYXRlciBmZWF0dXJlcyBmcm9tIG92ZXJsYXBwaW5nIHdpdGggaXQuXG4gKlxuICogQHBhcmFtIHtDb2xsaXNpb25GZWF0dXJlfSBjb2xsaXNpb25GZWF0dXJlXG4gKiBAcGFyYW0ge251bWJlcn0gbWluUGxhY2VtZW50U2NhbGVcbiAqIEBwcml2YXRlXG4gKi9cbkNvbGxpc2lvblRpbGUucHJvdG90eXBlLmluc2VydENvbGxpc2lvbkZlYXR1cmUgPSBmdW5jdGlvbihjb2xsaXNpb25GZWF0dXJlLCBtaW5QbGFjZW1lbnRTY2FsZSkge1xuXG4gICAgdmFyIGJveGVzID0gY29sbGlzaW9uRmVhdHVyZS5ib3hlcztcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGJveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGJveGVzW2tdLnBsYWNlbWVudFNjYWxlID0gbWluUGxhY2VtZW50U2NhbGU7XG4gICAgfVxuXG4gICAgaWYgKG1pblBsYWNlbWVudFNjYWxlIDwgdGhpcy5tYXhTY2FsZSkge1xuICAgICAgICB0aGlzLnRyZWUubG9hZChib3hlcyk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGludGVycG9sYXRlID0gcmVxdWlyZSgnLi4vdXRpbC9pbnRlcnBvbGF0ZScpO1xudmFyIEFuY2hvciA9IHJlcXVpcmUoJy4uL3N5bWJvbC9hbmNob3InKTtcbnZhciBjaGVja01heEFuZ2xlID0gcmVxdWlyZSgnLi9jaGVja19tYXhfYW5nbGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbmNob3JzO1xuXG5mdW5jdGlvbiBnZXRBbmNob3JzKGxpbmUsIHNwYWNpbmcsIG1heEFuZ2xlLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBnbHlwaFNpemUsIGJveFNjYWxlLCBvdmVyc2NhbGluZykge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICB2YXIgYW5nbGVXaW5kb3dTaXplID0gc2hhcGVkVGV4dCA/XG4gICAgICAgIDMgLyA1ICogZ2x5cGhTaXplICogYm94U2NhbGUgOlxuICAgICAgICAwO1xuXG4gICAgdmFyIGxhYmVsTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgICAgIHNoYXBlZFRleHQgPyBzaGFwZWRUZXh0LnJpZ2h0IC0gc2hhcGVkVGV4dC5sZWZ0IDogMCxcbiAgICAgICAgc2hhcGVkSWNvbiA/IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQgOiAwKTtcblxuICAgIC8vIElzIHRoZSBsaW5lIGNvbnRpbnVlZCBmcm9tIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcnk/XG4gICAgaWYgKGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IDQwOTYgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gNDA5Nikge1xuICAgICAgICB2YXIgY29udGludWVkTGluZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhlIGxhYmVsIGxvbmcsIHJlbGF0aXZlIHRvIHRoZSBzcGFjaW5nP1xuICAgIC8vIElmIHNvLCBhZGp1c3QgdGhlIHNwYWNpbmcgc28gdGhlcmUgaXMgYWx3YXlzIGEgbWluaW11bSBzcGFjZSBvZiBgc3BhY2luZyAvIDRgIGJldHdlZW4gbGFiZWwgZWRnZXMuXG4gICAgaWYgKHNwYWNpbmcgLSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICA8IHNwYWNpbmcgLyA0KSB7XG4gICAgICAgIHNwYWNpbmcgPSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICsgc3BhY2luZyAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT2Zmc2V0IHRoZSBmaXJzdCBhbmNob3IgYnk6XG4gICAgLy8gRWl0aGVyIGhhbGYgdGhlIGxhYmVsIGxlbmd0aCBwbHVzIGEgZml4ZWQgZXh0cmEgb2Zmc2V0IGlmIHRoZSBsaW5lIGlzIG5vdCBjb250aW51ZWRcbiAgICAvLyBPciBoYWxmIHRoZSBzcGFjaW5nIGlmIHRoZSBsaW5lIGlzIGNvbnRpbnVlZC5cblxuICAgIC8vIEZvciBub24tY29udGludWVkIGxpbmVzLCBhZGQgYSBiaXQgb2YgZml4ZWQgZXh0cmEgb2Zmc2V0IHRvIGF2b2lkIGNvbGxpc2lvbnMgYXQgVCBpbnRlcnNlY3Rpb25zLlxuICAgIHZhciBmaXhlZEV4dHJhT2Zmc2V0ID0gZ2x5cGhTaXplICogMjtcblxuICAgIHZhciBvZmZzZXQgPSAhY29udGludWVkTGluZSA/XG4gICAgICAgICgobGFiZWxMZW5ndGggLyAyICsgZml4ZWRFeHRyYU9mZnNldCkgKiBib3hTY2FsZSAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmcgOlxuICAgICAgICAoc3BhY2luZyAvIDIgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nO1xuXG4gICAgcmV0dXJuIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGggKiBib3hTY2FsZSwgY29udGludWVkTGluZSwgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGNvbnRpbnVlZExpbmUsIHBsYWNlQXRNaWRkbGUpIHtcblxuICAgIHZhciBkaXN0YW5jZSA9IDAsXG4gICAgICAgIG1hcmtlZERpc3RhbmNlID0gb2Zmc2V0IC0gc3BhY2luZztcblxuICAgIHZhciBhbmNob3JzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIHZhciBzZWdtZW50RGlzdCA9IGEuZGlzdChiKSxcbiAgICAgICAgICAgIGFuZ2xlID0gYi5hbmdsZVRvKGEpO1xuXG4gICAgICAgIHdoaWxlIChtYXJrZWREaXN0YW5jZSArIHNwYWNpbmcgPCBkaXN0YW5jZSArIHNlZ21lbnREaXN0KSB7XG4gICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArPSBzcGFjaW5nO1xuXG4gICAgICAgICAgICB2YXIgdCA9IChtYXJrZWREaXN0YW5jZSAtIGRpc3RhbmNlKSAvIHNlZ21lbnREaXN0LFxuICAgICAgICAgICAgICAgIHggPSBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICAgICAgeSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgNDA5NiAmJiB5ID49IDAgJiYgeSA8IDQwOTYpIHtcbiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICAgICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBhbmdsZSwgaSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaChhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0O1xuICAgIH1cblxuICAgIGlmICghcGxhY2VBdE1pZGRsZSAmJiAhYW5jaG9ycy5sZW5ndGggJiYgIWNvbnRpbnVlZExpbmUpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IGF0dGVtcHQgYXQgZmluZGluZyBhbmNob3JzIGF0IHdoaWNoIGxhYmVscyBjYW4gYmUgcGxhY2VkIGZhaWxlZC5cbiAgICAgICAgLy8gVHJ5IGFnYWluLCBidXQgdGhpcyB0aW1lIGp1c3QgdHJ5IHBsYWNpbmcgb25lIGFuY2hvciBhdCB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lLlxuICAgICAgICAvLyBUaGlzIGhhcyB0aGUgbW9zdCBlZmZlY3QgZm9yIHNob3J0IGxpbmVzIGluIG92ZXJzY2FsZWQgdGlsZXMsIHNpbmNlIHRoZVxuICAgICAgICAvLyBpbml0aWFsIG9mZnNldCB1c2VkIGluIG92ZXJzY2FsZWQgdGlsZXMgaXMgY2FsY3VsYXRlZCB0byBhbGlnbiBsYWJlbHMgd2l0aCBwb3NpdGlvbnMgaW5cbiAgICAgICAgLy8gcGFyZW50IHRpbGVzIGluc3RlYWQgb2YgcGxhY2luZyB0aGUgbGFiZWwgYXMgY2xvc2UgdG8gdGhlIGJlZ2lubmluZyBhcyBwb3NzaWJsZS5cbiAgICAgICAgYW5jaG9ycyA9IHJlc2FtcGxlKGxpbmUsIGRpc3RhbmNlIC8gMiwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGNvbnRpbnVlZExpbmUsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNob3JzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQmluUGFjayA9IHJlcXVpcmUoJy4vYmluX3BhY2snKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaEF0bGFzO1xuZnVuY3Rpb24gR2x5cGhBdGxhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgdGhpcy5iaW4gPSBuZXcgQmluUGFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmluZGV4ID0ge307XG4gICAgdGhpcy5pZHMgPSB7fTtcbiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG59XG5cbkdseXBoQXRsYXMucHJvdG90eXBlID0ge1xuICAgIGdldCBkZWJ1ZygpIHtcbiAgICAgICAgcmV0dXJuICdjYW52YXMnIGluIHRoaXM7XG4gICAgfSxcbiAgICBzZXQgZGVidWcodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLmdldEdseXBocyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBnbHlwaHMgPSB7fSxcbiAgICAgICAgc3BsaXQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgIHNwbGl0ID0ga2V5LnNwbGl0KCcjJyk7XG4gICAgICAgIG5hbWUgPSBzcGxpdFswXTtcbiAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICBpZiAoIWdseXBoc1tuYW1lXSkgZ2x5cGhzW25hbWVdID0gW107XG4gICAgICAgIGdseXBoc1tuYW1lXS5wdXNoKGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUuZ2V0UmVjdHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdHMgPSB7fSxcbiAgICAgICAgc3BsaXQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgIHNwbGl0ID0ga2V5LnNwbGl0KCcjJyk7XG4gICAgICAgIG5hbWUgPSBzcGxpdFswXTtcbiAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICBpZiAoIXJlY3RzW25hbWVdKSByZWN0c1tuYW1lXSA9IHt9O1xuICAgICAgICByZWN0c1tuYW1lXVtpZF0gPSB0aGlzLmluZGV4W2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY3RzO1xufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUucmVtb3ZlR2x5cGhzID0gZnVuY3Rpb24oaWQpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5pZHMpIHtcblxuICAgICAgICB2YXIgaWRzID0gdGhpcy5pZHNba2V5XTtcblxuICAgICAgICB2YXIgcG9zID0gaWRzLmluZGV4T2YoaWQpO1xuICAgICAgICBpZiAocG9zID49IDApIGlkcy5zcGxpY2UocG9zLCAxKTtcbiAgICAgICAgdGhpcy5pZHNba2V5XSA9IGlkcztcblxuICAgICAgICBpZiAoIWlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciByZWN0ID0gdGhpcy5pbmRleFtrZXldO1xuXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kYXRhO1xuICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCByZWN0Lmg7IHkrKykge1xuICAgICAgICAgICAgICAgIHZhciB5MSA9IHRoaXMud2lkdGggKiAocmVjdC55ICsgeSkgKyByZWN0Lng7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCByZWN0Lnc7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbeTEgKyB4XSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5iaW4ucmVsZWFzZShyZWN0KTtcblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW5kZXhba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmlkc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLnVwZGF0ZVRleHR1cmUodGhpcy5nbCk7XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uKGlkLCBuYW1lLCBnbHlwaCwgYnVmZmVyKSB7XG4gICAgaWYgKCFnbHlwaCkge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJ21pc3NpbmcgZ2x5cGgnLCBjb2RlLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBrZXkgPSBuYW1lICsgXCIjXCIgKyBnbHlwaC5pZDtcblxuICAgIC8vIFRoZSBnbHlwaCBpcyBhbHJlYWR5IGluIHRoaXMgdGV4dHVyZS5cbiAgICBpZiAodGhpcy5pbmRleFtrZXldKSB7XG4gICAgICAgIGlmICh0aGlzLmlkc1trZXldLmluZGV4T2YoaWQpIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5pZHNba2V5XS5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbmRleFtrZXldO1xuICAgIH1cblxuICAgIC8vIFRoZSBnbHlwaCBiaXRtYXAgaGFzIHplcm8gd2lkdGguXG4gICAgaWYgKCFnbHlwaC5iaXRtYXApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcmVkV2lkdGggPSBnbHlwaC53aWR0aCArIGJ1ZmZlciAqIDI7XG4gICAgdmFyIGJ1ZmZlcmVkSGVpZ2h0ID0gZ2x5cGguaGVpZ2h0ICsgYnVmZmVyICogMjtcblxuICAgIC8vIEFkZCBhIDFweCBib3JkZXIgYXJvdW5kIGV2ZXJ5IGltYWdlLlxuICAgIHZhciBwYWRkaW5nID0gMTtcbiAgICB2YXIgcGFja1dpZHRoID0gYnVmZmVyZWRXaWR0aCArIDIgKiBwYWRkaW5nO1xuICAgIHZhciBwYWNrSGVpZ2h0ID0gYnVmZmVyZWRIZWlnaHQgKyAyICogcGFkZGluZztcblxuICAgIC8vIEluY3JlYXNlIHRvIG5leHQgbnVtYmVyIGRpdmlzaWJsZSBieSA0LCBidXQgYXQgbGVhc3QgMS5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiBzY2FsZSBkb3duIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFuZCBwYWNrIHRoZW1cbiAgICAvLyBpbnRvIDIgYnl0ZXMgcmF0aGVyIHRoYW4gNCBieXRlcy5cbiAgICBwYWNrV2lkdGggKz0gKDQgLSBwYWNrV2lkdGggJSA0KTtcbiAgICBwYWNrSGVpZ2h0ICs9ICg0IC0gcGFja0hlaWdodCAlIDQpO1xuXG4gICAgdmFyIHJlY3QgPSB0aGlzLmJpbi5hbGxvY2F0ZShwYWNrV2lkdGgsIHBhY2tIZWlnaHQpO1xuICAgIGlmIChyZWN0LnggPCAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignZ2x5cGggYml0bWFwIG92ZXJmbG93Jyk7XG4gICAgICAgIHJldHVybiB7IGdseXBoOiBnbHlwaCwgcmVjdDogbnVsbCB9O1xuICAgIH1cblxuICAgIHRoaXMuaW5kZXhba2V5XSA9IHJlY3Q7XG4gICAgdGhpcy5pZHNba2V5XSA9IFtpZF07XG5cbiAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kYXRhO1xuICAgIHZhciBzb3VyY2UgPSBnbHlwaC5iaXRtYXA7XG4gICAgZm9yICh2YXIgeSA9IDA7IHkgPCBidWZmZXJlZEhlaWdodDsgeSsrKSB7XG4gICAgICAgIHZhciB5MSA9IHRoaXMud2lkdGggKiAocmVjdC55ICsgeSArIHBhZGRpbmcpICsgcmVjdC54ICsgcGFkZGluZztcbiAgICAgICAgdmFyIHkyID0gYnVmZmVyZWRXaWR0aCAqIHk7XG4gICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYnVmZmVyZWRXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICB0YXJnZXRbeTEgKyB4XSA9IHNvdXJjZVt5MiArIHhdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICByZXR1cm4gcmVjdDtcbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCkge1xuICAgIHRoaXMuZ2wgPSBnbDtcbiAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLkFMUEhBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgZ2wuQUxQSEEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICB9XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlID0gZnVuY3Rpb24oZ2wpIHtcbiAgICB0aGlzLmJpbmQoZ2wpO1xuICAgIGlmICh0aGlzLmRpcnR5KSB7XG5cbiAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2wuQUxQSEEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgaWYgKHRoaXMuY3R4KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YVtqXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICBkYXRhLmRhdGFbaiArIDFdID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YVtqICsgMl0gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgZGF0YS5kYXRhW2ogKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3R4LnB1dEltYWdlRGF0YShkYXRhLCAwLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5iaW4uZnJlZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHZhciBmcmVlID0gdGhpcy5iaW4uZnJlZVtrXTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VSZWN0KGZyZWUueCwgZnJlZS55LCBmcmVlLncsIGZyZWUuaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRU5EIERFQlVHXG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZUdseXBoc1VSTDtcbnZhciBnZXRBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpLmdldEFycmF5QnVmZmVyO1xudmFyIEdseXBocyA9IHJlcXVpcmUoJy4uL3V0aWwvZ2x5cGhzJyk7XG52YXIgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaFNvdXJjZTtcblxuLyoqXG4gKiBBIGdseXBoIHNvdXJjZSBoYXMgYSBVUkwgZnJvbSB3aGljaCB0byBsb2FkIG5ldyBnbHlwaHMgYW5kIG93bnMgYSBHbHlwaEF0bGFzXG4gKiB0aGF0IHN0b3JlcyBjdXJyZW50bHktbG9hZGVkIGdseXBocy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIGdseXBoIHRlbXBsYXRlIHVybFxuICogQHBhcmFtIHtPYmplY3R9IGdseXBoQXRsYXMgZ2x5cGggYXRsYXMgb2JqZWN0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBHbHlwaFNvdXJjZSh1cmwsIGdseXBoQXRsYXMpIHtcbiAgICB0aGlzLnVybCA9IHVybCAmJiBub3JtYWxpemVVUkwodXJsKTtcbiAgICB0aGlzLmdseXBoQXRsYXMgPSBnbHlwaEF0bGFzO1xuICAgIHRoaXMuc3RhY2tzID0gW107XG4gICAgdGhpcy5sb2FkaW5nID0ge307XG59XG5cbkdseXBoU291cmNlLnByb3RvdHlwZS5nZXRTaW1wbGVHbHlwaHMgPSBmdW5jdGlvbihmb250c3RhY2ssIGdseXBoSURzLCB1aWQsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAodGhpcy5zdGFja3NbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnN0YWNrc1tmb250c3RhY2tdID0ge307XG5cbiAgICB2YXIgZ2x5cGhzID0ge307XG5cbiAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrc1tmb250c3RhY2tdO1xuICAgIHZhciBnbHlwaEF0bGFzID0gdGhpcy5nbHlwaEF0bGFzO1xuXG4gICAgLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIHNkZiBiaXRtYXBzIGFyZSBwYWRkZWQgYnlcbiAgICB2YXIgYnVmZmVyID0gMztcblxuICAgIHZhciBtaXNzaW5nID0ge307XG4gICAgdmFyIHJlbWFpbmluZyA9IDA7XG4gICAgdmFyIHJhbmdlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2x5cGhJRCA9IGdseXBoSURzW2ldO1xuICAgICAgICByYW5nZSA9IE1hdGguZmxvb3IoZ2x5cGhJRCAvIDI1Nik7XG5cbiAgICAgICAgaWYgKHN0YWNrW3JhbmdlXSkge1xuICAgICAgICAgICAgdmFyIGdseXBoID0gc3RhY2tbcmFuZ2VdLmdseXBoc1tnbHlwaElEXTtcbiAgICAgICAgICAgIHZhciByZWN0ICA9IGdseXBoQXRsYXMuYWRkR2x5cGgodWlkLCBmb250c3RhY2ssIGdseXBoLCBidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGdseXBoKSBnbHlwaHNbZ2x5cGhJRF0gPSBuZXcgU2ltcGxlR2x5cGgoZ2x5cGgsIHJlY3QsIGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZ1tyYW5nZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1pc3NpbmdbcmFuZ2VdID0gW107XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaXNzaW5nW3JhbmdlXS5wdXNoKGdseXBoSUQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZW1haW5pbmcpIGNhbGxiYWNrKHVuZGVmaW5lZCwgZ2x5cGhzKTtcblxuICAgIHZhciBvblJhbmdlTG9hZGVkID0gZnVuY3Rpb24oZXJyLCByYW5nZSwgZGF0YSkge1xuICAgICAgICAvLyBUT0RPIG5vdCBiZSBzaWxlbnQgYWJvdXQgZXJyb3JzXG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrc1tmb250c3RhY2tdW3JhbmdlXSA9IGRhdGEuc3RhY2tzWzBdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nW3JhbmdlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBnbHlwaElEID0gbWlzc2luZ1tyYW5nZV1baV07XG4gICAgICAgICAgICAgICAgdmFyIGdseXBoID0gc3RhY2suZ2x5cGhzW2dseXBoSURdO1xuICAgICAgICAgICAgICAgIHZhciByZWN0ICA9IGdseXBoQXRsYXMuYWRkR2x5cGgodWlkLCBmb250c3RhY2ssIGdseXBoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmIChnbHlwaCkgZ2x5cGhzW2dseXBoSURdID0gbmV3IFNpbXBsZUdseXBoKGdseXBoLCByZWN0LCBidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbWFpbmluZy0tO1xuICAgICAgICBpZiAoIXJlbWFpbmluZykgY2FsbGJhY2sodW5kZWZpbmVkLCBnbHlwaHMpO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGZvciAodmFyIHIgaW4gbWlzc2luZykge1xuICAgICAgICB0aGlzLmxvYWRSYW5nZShmb250c3RhY2ssIHIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgIH1cbn07XG5cbi8vIEEgc2ltcGxpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2x5cGggY29udGFpbmluZyBvbmx5IHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3Igc2hhcGluZy5cbmZ1bmN0aW9uIFNpbXBsZUdseXBoKGdseXBoLCByZWN0LCBidWZmZXIpIHtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdGhpcy5hZHZhbmNlID0gZ2x5cGguYWR2YW5jZTtcbiAgICB0aGlzLmxlZnQgPSBnbHlwaC5sZWZ0IC0gYnVmZmVyIC0gcGFkZGluZztcbiAgICB0aGlzLnRvcCA9IGdseXBoLnRvcCArIGJ1ZmZlciArIHBhZGRpbmc7XG4gICAgdGhpcy5yZWN0ID0gcmVjdDtcbn1cblxuR2x5cGhTb3VyY2UucHJvdG90eXBlLmxvYWRSYW5nZSA9IGZ1bmN0aW9uKGZvbnRzdGFjaywgcmFuZ2UsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAocmFuZ2UgKiAyNTYgPiA2NTUzNSkgcmV0dXJuIGNhbGxiYWNrKCdneXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWQnKTtcblxuICAgIGlmICh0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9IHt9O1xuICAgIHZhciBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW2ZvbnRzdGFja107XG5cbiAgICBpZiAobG9hZGluZ1tyYW5nZV0pIHtcbiAgICAgICAgbG9hZGluZ1tyYW5nZV0ucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZGluZ1tyYW5nZV0gPSBbY2FsbGJhY2tdO1xuXG4gICAgICAgIHZhciByYW5nZU5hbWUgPSAocmFuZ2UgKiAyNTYpICsgJy0nICsgKHJhbmdlICogMjU2ICsgMjU1KTtcbiAgICAgICAgdmFyIHVybCA9IGdseXBoVXJsKGZvbnRzdGFjaywgcmFuZ2VOYW1lLCB0aGlzLnVybCk7XG5cbiAgICAgICAgZ2V0QXJyYXlCdWZmZXIodXJsLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSAhZXJyICYmIG5ldyBHbHlwaHMobmV3IFByb3RvYnVmKG5ldyBVaW50OEFycmF5KGRhdGEpKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvYWRpbmdbcmFuZ2VdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ1tyYW5nZV1baV0oZXJyLCByYW5nZSwgZ2x5cGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBsb2FkaW5nW3JhbmdlXTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBVc2UgQ05BTUUgc2hhcmRpbmcgdG8gbG9hZCBhIHNwZWNpZmljIGdseXBoIHJhbmdlIG92ZXIgYSByYW5kb21pemVkXG4gKiBidXQgY29uc2lzdGVudCBzdWJkb21haW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udHN0YWNrIGNvbW1hLWpvaW5lZCBmb250c1xuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlIGNvbW1hLWpvaW5lZCByYW5nZVxuICogQHBhcmFtIHt1cmx9IHVybCB0ZW1wbGF0ZWQgdXJsXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1YmRvbWFpbnM9YWJjXSBzdWJkb21haW5zIGFzIGEgc3RyaW5nIHdoZXJlIGVhY2ggbGV0dGVyIGlzIG9uZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGEgdXJsIHRvIGxvYWQgdGhhdCBzZWN0aW9uIG9mIGdseXBoc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2x5cGhVcmwoZm9udHN0YWNrLCByYW5nZSwgdXJsLCBzdWJkb21haW5zKSB7XG4gICAgc3ViZG9tYWlucyA9IHN1YmRvbWFpbnMgfHwgJ2FiYyc7XG5cbiAgICByZXR1cm4gdXJsXG4gICAgICAgIC5yZXBsYWNlKCd7c30nLCBzdWJkb21haW5zW2ZvbnRzdGFjay5sZW5ndGggJSBzdWJkb21haW5zLmxlbmd0aF0pXG4gICAgICAgIC5yZXBsYWNlKCd7Zm9udHN0YWNrfScsIGZvbnRzdGFjaylcbiAgICAgICAgLnJlcGxhY2UoJ3tyYW5nZX0nLCByYW5nZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB0ZXh0RmVhdHVyZXMsIGdlb21ldHJpZXMpIHtcblxuICAgIHZhciBsZWZ0SW5kZXggPSB7fSxcbiAgICAgICAgcmlnaHRJbmRleCA9IHt9LFxuICAgICAgICBtZXJnZWRGZWF0dXJlcyA9IFtdLFxuICAgICAgICBtZXJnZWRHZW9tID0gW10sXG4gICAgICAgIG1lcmdlZFRleHRzID0gW10sXG4gICAgICAgIG1lcmdlZEluZGV4ID0gMCxcbiAgICAgICAgaztcblxuICAgIGZ1bmN0aW9uIGFkZChrKSB7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzLnB1c2goZmVhdHVyZXNba10pO1xuICAgICAgICBtZXJnZWRHZW9tLnB1c2goZ2VvbWV0cmllc1trXSk7XG4gICAgICAgIG1lcmdlZFRleHRzLnB1c2godGV4dEZlYXR1cmVzW2tdKTtcbiAgICAgICAgbWVyZ2VkSW5kZXgrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSkge1xuICAgICAgICB2YXIgaSA9IHJpZ2h0SW5kZXhbbGVmdEtleV07XG4gICAgICAgIGRlbGV0ZSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICByaWdodEluZGV4W3JpZ2h0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXS5wb3AoKTtcbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXSA9IG1lcmdlZEdlb21baV1bMF0uY29uY2F0KGdlb21bMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKSB7XG4gICAgICAgIHZhciBpID0gbGVmdEluZGV4W3JpZ2h0S2V5XTtcbiAgICAgICAgZGVsZXRlIGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXS5zaGlmdCgpO1xuICAgICAgICBtZXJnZWRHZW9tW2ldWzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkR2VvbVtpXVswXSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEtleSh0ZXh0LCBnZW9tLCBvblJpZ2h0KSB7XG4gICAgICAgIHZhciBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gdGV4dCArICc6JyArIHBvaW50LnggKyAnOicgKyBwb2ludC55O1xuICAgIH1cblxuICAgIGZvciAoayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IGdlb21ldHJpZXNba10sXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dEZlYXR1cmVzW2tdO1xuXG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgYWRkKGspO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGVmdEtleSA9IGdldEtleSh0ZXh0LCBnZW9tKSxcbiAgICAgICAgICAgIHJpZ2h0S2V5ID0gZ2V0S2V5KHRleHQsIGdlb20sIHRydWUpO1xuXG4gICAgICAgIGlmICgobGVmdEtleSBpbiByaWdodEluZGV4KSAmJiAocmlnaHRLZXkgaW4gbGVmdEluZGV4KSAmJiAocmlnaHRJbmRleFtsZWZ0S2V5XSAhPT0gbGVmdEluZGV4W3JpZ2h0S2V5XSkpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCBhZGphY2VudCB0byBib3RoIGVuZHMgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2UgYWxsIHRocmVlXG4gICAgICAgICAgICB2YXIgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgdmFyIGkgPSBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgbWVyZ2VkR2VvbVtqXSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEdlb21baV0sIHRydWUpXSA9IGk7XG4gICAgICAgICAgICBtZXJnZWRHZW9tW2pdID0gbnVsbDtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmVhdHVyZXM6IG1lcmdlZEZlYXR1cmVzLFxuICAgICAgICB0ZXh0RmVhdHVyZXM6IG1lcmdlZFRleHRzLFxuICAgICAgICBnZW9tZXRyaWVzOiBtZXJnZWRHZW9tXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldEljb25RdWFkczogZ2V0SWNvblF1YWRzLFxuICAgIGdldEdseXBoUXVhZHM6IGdldEdseXBoUXVhZHNcbn07XG5cbnZhciBtaW5TY2FsZSA9IDAuNTsgLy8gdW5kZXJzY2FsZSBieSAxIHpvb20gbGV2ZWxcblxuLyoqXG4gKiBBIHRleHR1cmVkIHF1YWQgZm9yIHJlbmRlcmluZyBhIHNpbmdsZSBpY29uIG9yIGdseXBoLlxuICpcbiAqIFRoZSB6b29tIHJhbmdlIHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gaXMgZGVmaW5lZCBieSBtaW5TY2FsZSBhbmQgbWF4U2NhbGUuXG4gKlxuICogQHBhcmFtIHtQb2ludH0gYW5jaG9yUG9pbnQgdGhlIHBvaW50IHRoZSBzeW1ib2wgaXMgYW5jaG9yZWQgYXJvdW5kXG4gKiBAcGFyYW0ge1BvaW50fSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gdHIgVGhlIG9mZnNldCBvZiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge1BvaW50fSBibCBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge09iamVjdH0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIFRoZSBhbmdsZSBvZiB0aGUgbGFiZWwgYXQgaXQncyBjZW50ZXIsIG5vdCB0aGUgYW5nbGUgb2YgdGhpcyBxdWFkLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pblNjYWxlIFRoZSBtaW5pbXVtIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgdGlsZSdzIGludGVuZGVkIHNjYWxlLCB0aGF0IHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4U2NhbGUgVGhlIG1heGltdW0gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSB0aWxlJ3MgaW50ZW5kZWQgc2NhbGUsIHRoYXQgdGhlIGdseXBoIGNhbiBiZSBzaG93biBhdC5cbiAqXG4gKiBAY2xhc3MgU3ltYm9sUXVhZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gU3ltYm9sUXVhZChhbmNob3JQb2ludCwgdGwsIHRyLCBibCwgYnIsIHRleCwgYW5nbGUsIG1pblNjYWxlLCBtYXhTY2FsZSkge1xuICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDtcbiAgICB0aGlzLnRsID0gdGw7XG4gICAgdGhpcy50ciA9IHRyO1xuICAgIHRoaXMuYmwgPSBibDtcbiAgICB0aGlzLmJyID0gYnI7XG4gICAgdGhpcy50ZXggPSB0ZXg7XG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgIHRoaXMubWluU2NhbGUgPSBtaW5TY2FsZTtcbiAgICB0aGlzLm1heFNjYWxlID0gbWF4U2NhbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYW4gaWNvbi5cbiAqXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gKiBAcGFyYW0ge1Bvc2l0aW9uZWRJY29ufSBzaGFwZWRJY29uXG4gKiBAcGFyYW0ge251bWJlcn0gYm94U2NhbGUgQSBtYWdpYyBudW1iZXIgZm9yIGNvbnZlcnRpbmcgZ2x5cGggbWV0cmljIHVuaXRzIHRvIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxQb2ludD4+fSBsaW5lXG4gKiBAcGFyYW0ge0xheW91dFByb3BlcnRpZXN9IGxheW91dFxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgaWNvbiBzaG91bGQgYmUgcGxhY2VkIGFsb25nIHRoZSBsaW5lLlxuICogQHJldHVybnMge0FycmF5PFN5bWJvbFF1YWQ+fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvciwgc2hhcGVkSWNvbiwgYm94U2NhbGUsIGxpbmUsIGxheW91dCwgYWxvbmdMaW5lKSB7XG5cbiAgICB2YXIgcmVjdCA9IHNoYXBlZEljb24uaW1hZ2UucmVjdDtcblxuICAgIHZhciBib3JkZXIgPSAxO1xuICAgIHZhciBsZWZ0ID0gc2hhcGVkSWNvbi5sZWZ0IC0gYm9yZGVyO1xuICAgIHZhciByaWdodCA9IGxlZnQgKyByZWN0Lnc7XG4gICAgdmFyIHRvcCA9IHNoYXBlZEljb24udG9wIC0gYm9yZGVyO1xuICAgIHZhciBib3R0b20gPSB0b3AgKyByZWN0Lmg7XG4gICAgdmFyIHRsID0gbmV3IFBvaW50KGxlZnQsIHRvcCk7XG4gICAgdmFyIHRyID0gbmV3IFBvaW50KHJpZ2h0LCB0b3ApO1xuICAgIHZhciBiciA9IG5ldyBQb2ludChyaWdodCwgYm90dG9tKTtcbiAgICB2YXIgYmwgPSBuZXcgUG9pbnQobGVmdCwgYm90dG9tKTtcblxuICAgIHZhciBhbmdsZSA9IGxheW91dFsnaWNvbi1yb3RhdGUnXSAqIE1hdGguUEkgLyAxODA7XG4gICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbYW5jaG9yLnNlZ21lbnRdO1xuICAgICAgICBhbmdsZSArPSBNYXRoLmF0YW4yKGFuY2hvci55IC0gcHJldi55LCBhbmNob3IueCAtIHByZXYueCk7XG4gICAgfVxuXG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgdGwgPSB0bC5tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIHRyID0gdHIubWF0TXVsdChtYXRyaXgpO1xuICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgYnIgPSBici5tYXRNdWx0KG1hdHJpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtuZXcgU3ltYm9sUXVhZChuZXcgUG9pbnQoYW5jaG9yLngsIGFuY2hvci55KSwgdGwsIHRyLCBibCwgYnIsIHNoYXBlZEljb24uaW1hZ2UucmVjdCwgMCwgbWluU2NhbGUsIEluZmluaXR5KV07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYSB0ZXh0IGxhYmVsLlxuICpcbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3JcbiAqIEBwYXJhbSB7U2hhcGluZ30gc2hhcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIGZvciBjb252ZXJ0aW5nIGZyb20gZ2x5cGggbWV0cmljIHVuaXRzIHRvIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxQb2ludD4+fSBsaW5lXG4gKiBAcGFyYW0ge0xheW91dFByb3BlcnRpZXN9IGxheW91dFxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIHBsYWNlZCBhbG9uZyB0aGUgbGluZS5cbiAqIEByZXR1cm5zIHtBcnJheTxTeW1ib2xRdWFkPn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwaW5nLCBib3hTY2FsZSwgbGluZSwgbGF5b3V0LCBhbG9uZ0xpbmUpIHtcblxuICAgIHZhciB0ZXh0Um90YXRlID0gbGF5b3V0Wyd0ZXh0LXJvdGF0ZSddICogTWF0aC5QSSAvIDE4MDtcbiAgICB2YXIga2VlcFVwcmlnaHQgPSBsYXlvdXRbJ3RleHQta2VlcC11cHJpZ2h0J107XG5cbiAgICB2YXIgcG9zaXRpb25lZEdseXBocyA9IHNoYXBpbmcucG9zaXRpb25lZEdseXBocztcbiAgICB2YXIgcXVhZHMgPSBbXTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1trXTtcbiAgICAgICAgdmFyIGdseXBoID0gcG9zaXRpb25lZEdseXBoLmdseXBoO1xuICAgICAgICB2YXIgcmVjdCA9IGdseXBoLnJlY3Q7XG5cbiAgICAgICAgaWYgKCFyZWN0KSBjb250aW51ZTtcblxuICAgICAgICB2YXIgY2VudGVyWCA9IChwb3NpdGlvbmVkR2x5cGgueCArIGdseXBoLmFkdmFuY2UgLyAyKSAqIGJveFNjYWxlO1xuXG4gICAgICAgIHZhciBnbHlwaEluc3RhbmNlcztcbiAgICAgICAgdmFyIGxhYmVsTWluU2NhbGUgPSBtaW5TY2FsZTtcbiAgICAgICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICAgICAgZ2x5cGhJbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgICAgIGxhYmVsTWluU2NhbGUgPSBnZXRTZWdtZW50R2x5cGhzKGdseXBoSW5zdGFuY2VzLCBhbmNob3IsIGNlbnRlclgsIGxpbmUsIGFuY2hvci5zZWdtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChrZWVwVXByaWdodCkge1xuICAgICAgICAgICAgICAgIGxhYmVsTWluU2NhbGUgPSBNYXRoLm1pbihsYWJlbE1pblNjYWxlLCBnZXRTZWdtZW50R2x5cGhzKGdseXBoSW5zdGFuY2VzLCBhbmNob3IsIGNlbnRlclgsIGxpbmUsIGFuY2hvci5zZWdtZW50LCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbHlwaEluc3RhbmNlcyA9IFt7XG4gICAgICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgICAgICAgICBtYXhTY2FsZTogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWluU2NhbGU6IG1pblNjYWxlXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4MSA9IHBvc2l0aW9uZWRHbHlwaC54ICsgZ2x5cGgubGVmdCxcbiAgICAgICAgICAgIHkxID0gcG9zaXRpb25lZEdseXBoLnkgLSBnbHlwaC50b3AsXG4gICAgICAgICAgICB4MiA9IHgxICsgcmVjdC53LFxuICAgICAgICAgICAgeTIgPSB5MSArIHJlY3QuaCxcblxuICAgICAgICAgICAgb3RsID0gbmV3IFBvaW50KHgxLCB5MSksXG4gICAgICAgICAgICBvdHIgPSBuZXcgUG9pbnQoeDIsIHkxKSxcbiAgICAgICAgICAgIG9ibCA9IG5ldyBQb2ludCh4MSwgeTIpLFxuICAgICAgICAgICAgb2JyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnbHlwaEluc3RhbmNlc1tpXSxcbiAgICAgICAgICAgICAgICB0bCA9IG90bCxcbiAgICAgICAgICAgICAgICB0ciA9IG90cixcbiAgICAgICAgICAgICAgICBibCA9IG9ibCxcbiAgICAgICAgICAgICAgICBiciA9IG9icixcbiAgICAgICAgICAgICAgICBhbmdsZSA9IGluc3RhbmNlLmFuZ2xlICsgdGV4dFJvdGF0ZTtcblxuICAgICAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgICAgICB0bCA9IHRsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICB0ciA9IHRyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBiciA9IGJyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCBsYWJlbCBmcm9tIGV4dGVuZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIHZhciBnbHlwaE1pblNjYWxlID0gTWF0aC5tYXgoaW5zdGFuY2UubWluU2NhbGUsIGxhYmVsTWluU2NhbGUpO1xuXG4gICAgICAgICAgICB2YXIgZ2x5cGhBbmdsZSA9IChhbmNob3IuYW5nbGUgKyB0ZXh0Um90YXRlICsgaW5zdGFuY2Uub2Zmc2V0ICsgMiAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFN5bWJvbFF1YWQoaW5zdGFuY2UuYW5jaG9yUG9pbnQsIHRsLCB0ciwgYmwsIGJyLCByZWN0LCBnbHlwaEFuZ2xlLCBnbHlwaE1pblNjYWxlLCBpbnN0YW5jZS5tYXhTY2FsZSkpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG5cbi8qKlxuICogV2UgY2FuIG9ubHkgcmVuZGVyIGdseXBoIHF1YWRzIHRoYXQgc2xpZGUgYWxvbmcgYSBzdHJhaWdodCBsaW5lLiBUbyBkcmF3XG4gKiBjdXJ2ZWQgbGluZXMgd2UgbmVlZCBhbiBpbnN0YW5jZSBvZiBhIGdseXBoIGZvciBlYWNoIHNlZ21lbnQgaXQgYXBwZWFycyBvbi5cbiAqIFRoaXMgY3JlYXRlcyBhbGwgdGhlIGluc3RhbmNlcyBvZiBhIGdseXBoIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byByZW5kZXIgYSBsYWJlbC5cbiAqXG4gKiBXZSBuZWVkIGFcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZ2x5cGhJbnN0YW5jZXMgQW4gZW1wdHkgYXJyYXkgdGhhdCBnbHlwaEluc3RhbmNlcyBhcmUgYWRkZWQgdG8uXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBnbHlwaCdzIG9mZnNldCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGxhYmVsLlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50IFRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgYW5jaG9yIGV4aXN0cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yd2FyZCBJZiB0cnVlIGdldCB0aGUgZ2x5cGhzIHRoYXQgY29tZSBsYXRlciBvbiB0aGUgbGluZSwgb3RoZXJ3aXNlIGdldCB0aGUgZ2x5cGhzIHRoYXQgY29tZSBlYXJsaWVyLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBnbHlwaEluc3RhbmNlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VnbWVudEdseXBocyhnbHlwaHMsIGFuY2hvciwgb2Zmc2V0LCBsaW5lLCBzZWdtZW50LCBmb3J3YXJkKSB7XG4gICAgdmFyIHVwc2lkZURvd24gPSAhZm9yd2FyZDtcblxuICAgIGlmIChvZmZzZXQgPCAwKSBmb3J3YXJkID0gIWZvcndhcmQ7XG5cbiAgICBpZiAoZm9yd2FyZCkgc2VnbWVudCsrO1xuXG4gICAgdmFyIG5ld0FuY2hvclBvaW50ID0gbmV3IFBvaW50KGFuY2hvci54LCBhbmNob3IueSk7XG4gICAgdmFyIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgdmFyIHByZXZTY2FsZSA9IEluZmluaXR5O1xuXG4gICAgb2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcblxuICAgIHZhciBwbGFjZW1lbnRTY2FsZSA9IG1pblNjYWxlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gbmV3QW5jaG9yUG9pbnQuZGlzdChlbmQpO1xuICAgICAgICB2YXIgc2NhbGUgPSBvZmZzZXQgLyBkaXN0YW5jZTtcblxuICAgICAgICAvLyBHZXQgdGhlIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnRcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihlbmQueSAtIG5ld0FuY2hvclBvaW50LnksIGVuZC54IC0gbmV3QW5jaG9yUG9pbnQueCk7XG4gICAgICAgIGlmICghZm9yd2FyZCkgYW5nbGUgKz0gTWF0aC5QSTtcbiAgICAgICAgaWYgKHVwc2lkZURvd24pIGFuZ2xlICs9IE1hdGguUEk7XG5cbiAgICAgICAgZ2x5cGhzLnB1c2goe1xuICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IG5ld0FuY2hvclBvaW50LFxuICAgICAgICAgICAgb2Zmc2V0OiB1cHNpZGVEb3duID8gTWF0aC5QSSA6IDAsXG4gICAgICAgICAgICBtaW5TY2FsZTogc2NhbGUsXG4gICAgICAgICAgICBtYXhTY2FsZTogcHJldlNjYWxlLFxuICAgICAgICAgICAgYW5nbGU6IChhbmdsZSArIDIgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNjYWxlIDw9IHBsYWNlbWVudFNjYWxlKSBicmVhaztcblxuICAgICAgICBuZXdBbmNob3JQb2ludCA9IGVuZDtcblxuICAgICAgICAvLyBza2lwIGR1cGxpY2F0ZSBub2Rlc1xuICAgICAgICB3aGlsZSAobmV3QW5jaG9yUG9pbnQuZXF1YWxzKGVuZCkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgICAgIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0ID0gZW5kLnN1YihuZXdBbmNob3JQb2ludCkuX3VuaXQoKTtcbiAgICAgICAgbmV3QW5jaG9yUG9pbnQgPSBuZXdBbmNob3JQb2ludC5zdWIodW5pdC5fbXVsdChkaXN0YW5jZSkpO1xuXG4gICAgICAgIHByZXZTY2FsZSA9IHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBwbGFjZW1lbnRTY2FsZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmVUb2tlbnMgPSByZXF1aXJlKCcuLi91dGlsL3Rva2VuJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUljb25zO1xuXG4vLyBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgaWNvbnMgbmVlZCB0byBiZSBsb2FkZWQuXG5mdW5jdGlvbiByZXNvbHZlSWNvbnMoZmVhdHVyZXMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB2YXIgaWNvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ2ljb24taW1hZ2UnXSk7XG4gICAgICAgIGlmICghdGV4dCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGljb25zLmluZGV4T2YodGV4dCkgPCAwKSB7XG4gICAgICAgICAgICBpY29ucy5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb25zO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVzb2x2ZVRva2VucyA9IHJlcXVpcmUoJy4uL3V0aWwvdG9rZW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlVGV4dDtcblxuLyoqXG4gKiBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgZ2x5cGggcmFuZ2VzIG5lZWQgdG8gYmUgbG9hZGVkXG4gKiBhbmQgYXBwbHkgYW55IHRleHQgcHJlcHJvY2Vzc2luZy4gVGhlIHJlbWFpbmluZyB1c2VycyBvZiB0ZXh0IHNob3VsZFxuICogdXNlIHRoZSBgdGV4dEZlYXR1cmVzYCBrZXkgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmdcbiAqIGZlYXR1cmUgdGV4dCBkaXJlY3RseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUZXh0KGZlYXR1cmVzLCBsYXlvdXRQcm9wZXJ0aWVzLCBnbHlwaHMpIHtcbiAgICB2YXIgdGV4dEZlYXR1cmVzID0gW107XG4gICAgdmFyIGNvZGVwb2ludHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ3RleHQtZmllbGQnXSk7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgdGV4dEZlYXR1cmVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IGxheW91dFByb3BlcnRpZXNbJ3RleHQtdHJhbnNmb3JtJ107XG4gICAgICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSB0ZXh0Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgIGNvZGVwb2ludHMucHVzaCh0ZXh0LmNoYXJDb2RlQXQoaikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgaW5kZXhlcyBvZiBmZWF0dXJlcyB3aXRoIHRleHQuXG4gICAgICAgIHRleHRGZWF0dXJlc1tpXSA9IHRleHQ7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGEgbGlzdCBvZiB1bmlxdWUgY29kZXBvaW50cyB3ZSBhcmUgbWlzc2luZ1xuICAgIGNvZGVwb2ludHMgPSB1bmlxKGNvZGVwb2ludHMsIGdseXBocyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0RmVhdHVyZXM6IHRleHRGZWF0dXJlcyxcbiAgICAgICAgY29kZXBvaW50czogY29kZXBvaW50c1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHVuaXEoaWRzLCBhbHJlYWR5SGF2ZSkge1xuICAgIHZhciB1ID0gW107XG4gICAgdmFyIGxhc3Q7XG4gICAgaWRzLnNvcnQoc29ydE51bWJlcnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpZHNbaV0gIT09IGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoIWFscmVhZHlIYXZlW2xhc3RdKSB1LnB1c2goaWRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdTtcbn1cblxuZnVuY3Rpb24gc29ydE51bWJlcnMoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgc2hhcGVUZXh0OiBzaGFwZVRleHQsXG4gICAgc2hhcGVJY29uOiBzaGFwZUljb25cbn07XG5cblxuLy8gVGhlIHBvc2l0aW9uIG9mIGEgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHRleHQncyBhbmNob3IgcG9pbnQuXG5mdW5jdGlvbiBQb3NpdGlvbmVkR2x5cGgoY29kZVBvaW50LCB4LCB5LCBnbHlwaCkge1xuICAgIHRoaXMuY29kZVBvaW50ID0gY29kZVBvaW50O1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmdseXBoID0gZ2x5cGg7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBwb3NpdGlvbmVkIGdseXBocyBhbmQgc29tZSBtZXRhZGF0YVxuZnVuY3Rpb24gU2hhcGluZyhwb3NpdGlvbmVkR2x5cGhzLCB0ZXh0LCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQpIHtcbiAgICB0aGlzLnBvc2l0aW9uZWRHbHlwaHMgPSBwb3NpdGlvbmVkR2x5cGhzO1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy50b3AgPSB0b3A7XG4gICAgdGhpcy5ib3R0b20gPSBib3R0b207XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG59XG5cbmZ1bmN0aW9uIHNoYXBlVGV4dCh0ZXh0LCBnbHlwaHMsIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnksIHNwYWNpbmcsIHRyYW5zbGF0ZSkge1xuXG4gICAgdmFyIHBvc2l0aW9uZWRHbHlwaHMgPSBbXTtcbiAgICB2YXIgc2hhcGluZyA9IG5ldyBTaGFwaW5nKHBvc2l0aW9uZWRHbHlwaHMsIHRleHQsIHRyYW5zbGF0ZVsxXSwgdHJhbnNsYXRlWzFdLCB0cmFuc2xhdGVbMF0sIHRyYW5zbGF0ZVswXSk7XG5cbiAgICAvLyB0aGUgeSBvZmZzZXQgKnNob3VsZCogYmUgcGFydCBvZiB0aGUgZm9udCBtZXRhZGF0YVxuICAgIHZhciB5T2Zmc2V0ID0gLTE3O1xuXG4gICAgdmFyIHggPSB0cmFuc2xhdGVbMF07XG4gICAgdmFyIHkgPSB0cmFuc2xhdGVbMV0gKyB5T2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGNvZGVQb2ludCwgeCwgeSwgZ2x5cGgpKTtcbiAgICAgICAgeCArPSBnbHlwaC5hZHZhbmNlICsgc3BhY2luZztcbiAgICB9XG5cbiAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBsaW5ld3JhcChzaGFwaW5nLCBnbHlwaHMsIGxpbmVIZWlnaHQsIG1heFdpZHRoLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnkpO1xuXG4gICAgcmV0dXJuIHNoYXBpbmc7XG59XG5cbnZhciBicmVha2FibGUgPSB7IDMyOiB0cnVlIH07IC8vIEN1cnJlbnRseSBvbmx5IGJyZWFrcyBhdCByZWd1bGFyIHNwYWNlc1xuXG5mdW5jdGlvbiBsaW5ld3JhcChzaGFwaW5nLCBnbHlwaHMsIGxpbmVIZWlnaHQsIG1heFdpZHRoLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnkpIHtcbiAgICB2YXIgbGFzdFNhZmVCcmVhayA9IG51bGw7XG5cbiAgICB2YXIgbGVuZ3RoQmVmb3JlQ3VycmVudExpbmUgPSAwO1xuICAgIHZhciBsaW5lU3RhcnRJbmRleCA9IDA7XG4gICAgdmFyIGxpbmUgPSAwO1xuXG4gICAgdmFyIG1heExpbmVMZW5ndGggPSAwO1xuXG4gICAgdmFyIHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG5cbiAgICBpZiAobWF4V2lkdGgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1tpXTtcblxuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoLnggLT0gbGVuZ3RoQmVmb3JlQ3VycmVudExpbmU7XG4gICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGgueSArPSBsaW5lSGVpZ2h0ICogbGluZTtcblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaC54ID4gbWF4V2lkdGggJiYgbGFzdFNhZmVCcmVhayAhPT0gbnVsbCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVMZW5ndGggPSBwb3NpdGlvbmVkR2x5cGhzW2xhc3RTYWZlQnJlYWsgKyAxXS54O1xuICAgICAgICAgICAgICAgIG1heExpbmVMZW5ndGggPSBNYXRoLm1heChsaW5lTGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSBsYXN0U2FmZUJyZWFrICsgMTsgayA8PSBpOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoc1trXS55ICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHNba10ueCAtPSBsaW5lTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqdXN0aWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgbGluZVN0YXJ0SW5kZXgsIGxhc3RTYWZlQnJlYWsgLSAxLCBqdXN0aWZ5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleCA9IGxhc3RTYWZlQnJlYWsgKyAxO1xuICAgICAgICAgICAgICAgIGxhc3RTYWZlQnJlYWsgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxlbmd0aEJlZm9yZUN1cnJlbnRMaW5lICs9IGxpbmVMZW5ndGg7XG4gICAgICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYnJlYWthYmxlW3Bvc2l0aW9uZWRHbHlwaC5jb2RlUG9pbnRdKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNhZmVCcmVhayA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFzdFBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNbcG9zaXRpb25lZEdseXBocy5sZW5ndGggLSAxXTtcbiAgICB2YXIgbGFzdExpbmVMZW5ndGggPSBsYXN0UG9zaXRpb25lZEdseXBoLnggKyBnbHlwaHNbbGFzdFBvc2l0aW9uZWRHbHlwaC5jb2RlUG9pbnRdLmFkdmFuY2U7XG4gICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KG1heExpbmVMZW5ndGgsIGxhc3RMaW5lTGVuZ3RoKTtcblxuICAgIHZhciBoZWlnaHQgPSAobGluZSArIDEpICogbGluZUhlaWdodDtcblxuICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgbGluZVN0YXJ0SW5kZXgsIHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoIC0gMSwganVzdGlmeSk7XG4gICAgYWxpZ24ocG9zaXRpb25lZEdseXBocywganVzdGlmeSwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBtYXhMaW5lTGVuZ3RoLCBsaW5lSGVpZ2h0LCBsaW5lKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRpbmcgYm94XG4gICAgc2hhcGluZy50b3AgKz0gLXZlcnRpY2FsQWxpZ24gKiBoZWlnaHQ7XG4gICAgc2hhcGluZy5ib3R0b20gPSBzaGFwaW5nLnRvcCArIGhlaWdodDtcbiAgICBzaGFwaW5nLmxlZnQgKz0gLWhvcml6b250YWxBbGlnbiAqIG1heExpbmVMZW5ndGg7XG4gICAgc2hhcGluZy5yaWdodCA9IHNoYXBpbmcubGVmdCArIG1heExpbmVMZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgc3RhcnQsIGVuZCwganVzdGlmeSkge1xuICAgIHZhciBsYXN0QWR2YW5jZSA9IGdseXBoc1twb3NpdGlvbmVkR2x5cGhzW2VuZF0uY29kZVBvaW50XS5hZHZhbmNlO1xuICAgIHZhciBsaW5lSW5kZW50ID0gKHBvc2l0aW9uZWRHbHlwaHNbZW5kXS54ICsgbGFzdEFkdmFuY2UpICoganVzdGlmeTtcblxuICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8PSBlbmQ7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggLT0gbGluZUluZGVudDtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gYWxpZ24ocG9zaXRpb25lZEdseXBocywganVzdGlmeSwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBtYXhMaW5lTGVuZ3RoLCBsaW5lSGVpZ2h0LCBsaW5lKSB7XG4gICAgdmFyIHNoaWZ0WCA9IChqdXN0aWZ5IC0gaG9yaXpvbnRhbEFsaWduKSAqIG1heExpbmVMZW5ndGg7XG4gICAgdmFyIHNoaWZ0WSA9ICgtdmVydGljYWxBbGlnbiAqIChsaW5lICsgMSkgKyAwLjUpICogbGluZUhlaWdodDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggKz0gc2hpZnRYO1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gc2hpZnRZO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBzaGFwZUljb24oaW1hZ2UsIGxheW91dCkge1xuICAgIGlmICghaW1hZ2UgfHwgIWltYWdlLnJlY3QpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGR4ID0gbGF5b3V0WydpY29uLW9mZnNldCddWzBdO1xuICAgIHZhciBkeSA9IGxheW91dFsnaWNvbi1vZmZzZXQnXVsxXTtcbiAgICB2YXIgeDEgPSBkeCAtIGltYWdlLndpZHRoIC8gMjtcbiAgICB2YXIgeDIgPSB4MSArIGltYWdlLndpZHRoO1xuICAgIHZhciB5MSA9IGR5IC0gaW1hZ2UuaGVpZ2h0IC8gMjtcbiAgICB2YXIgeTIgPSB5MSArIGltYWdlLmhlaWdodDtcblxuICAgIHJldHVybiBuZXcgUG9zaXRpb25lZEljb24oaW1hZ2UsIHkxLCB5MiwgeDEsIHgyKTtcbn1cblxuZnVuY3Rpb24gUG9zaXRpb25lZEljb24oaW1hZ2UsIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCkge1xuICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgIHRoaXMucmlnaHQgPSByaWdodDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJpblBhY2sgPSByZXF1aXJlKCcuL2Jpbl9wYWNrJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ByaXRlQXRsYXM7XG5mdW5jdGlvbiBTcHJpdGVBdGxhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgdGhpcy5iaW4gPSBuZXcgQmluUGFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgIHRoaXMuZGF0YSA9IGZhbHNlO1xuICAgIHRoaXMudGV4dHVyZSA9IDA7IC8vIFdlYkdMIElEXG4gICAgdGhpcy5maWx0ZXIgPSAwOyAvLyBXZWJHTCBJRFxuICAgIHRoaXMucGl4ZWxSYXRpbyA9IDE7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG59XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZSA9IHtcbiAgICBnZXQgZGVidWcoKSB7XG4gICAgICAgIHJldHVybiAnY2FudmFzJyBpbiB0aGlzO1xuICAgIH0sXG4gICAgc2V0IGRlYnVnKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW87XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbztcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyAncHgnO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbihuZXdSYXRpbykge1xuICAgIGlmICh0aGlzLnBpeGVsUmF0aW8gPT09IG5ld1JhdGlvKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgb2xkUmF0aW8gPSB0aGlzLnBpeGVsUmF0aW87XG4gICAgdGhpcy5waXhlbFJhdGlvID0gbmV3UmF0aW87XG5cbiAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBvbGREYXRhID0gdGhpcy5kYXRhO1xuXG4gICAgICAgIHRoaXMuZGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFsbG9jYXRlKCk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBvbGRXaWR0aCA9IHRoaXMud2lkdGggKiBvbGRSYXRpbztcbiAgICAgICAgdmFyIG9sZEhlaWdodCA9IHRoaXMuaGVpZ2h0ICogb2xkUmF0aW87XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGggKiBuZXdSYXRpbztcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IHRoaXMuaGVpZ2h0ICogbmV3UmF0aW87XG5cbiAgICAgICAgLy8gQmFzaWMgaW1hZ2Ugc2NhbGluZy4gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggYmV0dGVyIGltYWdlIHNjYWxpbmcuXG4gICAgICAgIHZhciBuZXdJbWFnZSA9IHRoaXMuZGF0YTtcbiAgICAgICAgdmFyIG9sZEltYWdlID0gb2xkRGF0YTtcblxuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IG5ld0hlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgb2xkWU9mZnNldCA9IE1hdGguZmxvb3IoKHkgKiBvbGRIZWlnaHQpIC8gbmV3SGVpZ2h0KSAqIG9sZFdpZHRoO1xuICAgICAgICAgICAgdmFyIG5ld1lPZmZzZXQgPSB5ICogbmV3V2lkdGg7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG5ld1dpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkWCA9IE1hdGguZmxvb3IoKHggKiBvbGRXaWR0aCkgLyBuZXdXaWR0aCk7XG4gICAgICAgICAgICAgICAgbmV3SW1hZ2VbbmV3WU9mZnNldCArIHhdID0gb2xkSW1hZ2Vbb2xkWU9mZnNldCArIG9sZFhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2xkRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpcnR5O1xufTtcblxuZnVuY3Rpb24gY29weUJpdG1hcChzcmMsIHNyY1N0cmlkZSwgc3JjWCwgc3JjWSwgZHN0LCBkc3RTdHJpZGUsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIHdyYXApIHtcbiAgICB2YXIgc3JjSSA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYO1xuICAgIHZhciBkc3RJID0gZHN0WSAqIGRzdFN0cmlkZSArIGRzdFg7XG4gICAgdmFyIHgsIHk7XG5cbiAgICBpZiAod3JhcCkge1xuICAgICAgICAvLyBhZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZVxuICAgICAgICBkc3RJIC09IGRzdFN0cmlkZTtcbiAgICAgICAgZm9yICh5ID0gLTE7IHkgPD0gaGVpZ2h0OyB5KyssIHNyY0kgPSAoKHkgKyBoZWlnaHQpICUgaGVpZ2h0ICsgc3JjWSkgKiBzcmNTdHJpZGUgKyBzcmNYLCBkc3RJICs9IGRzdFN0cmlkZSkge1xuICAgICAgICAgICAgZm9yICh4ID0gLTE7IHggPD0gd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArICgoeCArIHdpZHRoKSAlIHdpZHRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKywgc3JjSSArPSBzcmNTdHJpZGUsIGRzdEkgKz0gZHN0U3RyaWRlKSB7XG4gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArIHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGVJbWFnZSA9IGZ1bmN0aW9uKHBpeGVsV2lkdGgsIHBpeGVsSGVpZ2h0KSB7XG5cbiAgICAvLyBJbmNyZWFzZSB0byBuZXh0IG51bWJlciBkaXZpc2libGUgYnkgNCwgYnV0IGF0IGxlYXN0IDEuXG4gICAgLy8gVGhpcyBpcyBzbyB3ZSBjYW4gc2NhbGUgZG93biB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgcGFjayB0aGVtXG4gICAgLy8gaW50byAyIGJ5dGVzIHJhdGhlciB0aGFuIDQgYnl0ZXMuXG4gICAgLy8gUGFkIGljb25zIHRvIHByZXZlbnQgdGhlbSBmcm9tIHBvbGx1dGluZyBuZWlnaGJvdXJzIGR1cmluZyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIHZhciBwYWRkaW5nID0gMjtcbiAgICB2YXIgcGFja1dpZHRoID0gcGl4ZWxXaWR0aCArIHBhZGRpbmcgKyAoNCAtIChwaXhlbFdpZHRoICsgcGFkZGluZykgJSA0KTtcbiAgICB2YXIgcGFja0hlaWdodCA9IHBpeGVsSGVpZ2h0ICsgcGFkZGluZyArICg0IC0gKHBpeGVsSGVpZ2h0ICsgcGFkZGluZykgJSA0KTsvLyArIDQ7XG5cbiAgICAvLyBXZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IGFyZWEgaW4gdGhlIGJpbiwgYW5kIHN0b3JlIGFuIGVtcHR5IGltYWdlIGluIGl0LlxuICAgIC8vIEFkZCBhIDFweCBib3JkZXIgYXJvdW5kIGV2ZXJ5IGltYWdlLlxuICAgIHZhciByZWN0ID0gdGhpcy5iaW4uYWxsb2NhdGUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICBpZiAocmVjdC53ID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cblxuICAgIHJlY3Qub3JpZ2luYWxXaWR0aCA9IHBpeGVsV2lkdGg7XG4gICAgcmVjdC5vcmlnaW5hbEhlaWdodCA9IHBpeGVsSGVpZ2h0O1xuXG4gICAgcmV0dXJuIHJlY3Q7XG59O1xuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0SW1hZ2UgPSBmdW5jdGlvbihuYW1lLCB3cmFwKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VzW25hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3ByaXRlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBwb3MgPSB0aGlzLnNwcml0ZS5nZXRTcHJpdGVQb3NpdGlvbihuYW1lKTtcbiAgICBpZiAoIXBvcy53aWR0aCB8fCAhcG9zLmhlaWdodCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSBwb3Mud2lkdGggLyBwb3MucGl4ZWxSYXRpbztcbiAgICB2YXIgaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHBvcy5waXhlbFJhdGlvO1xuICAgIHZhciByZWN0ID0gdGhpcy5hbGxvY2F0ZUltYWdlKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChyZWN0LncgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuXG4gICAgdmFyIGltYWdlID0gbmV3IEF0bGFzSW1hZ2UocmVjdCwgd2lkdGgsIGhlaWdodCwgcG9zLnNkZik7XG4gICAgdGhpcy5pbWFnZXNbbmFtZV0gPSBpbWFnZTtcblxuICAgIHRoaXMuY29weShyZWN0LCBwb3MsIHdyYXApO1xuXG4gICAgcmV0dXJuIGltYWdlO1xufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbihuYW1lLCByZXBlYXRpbmcpIHtcbiAgICB2YXIgaW1hZ2UgPSB0aGlzLmdldEltYWdlKG5hbWUsIHJlcGVhdGluZyk7XG4gICAgdmFyIHJlY3QgPSBpbWFnZSAmJiBpbWFnZS5yZWN0O1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdoZW4gdGhlIGltYWdlIGlzIHJlcGVhdGluZywgZ2V0IHRoZSBjb3JyZWN0IHBvc2l0aW9uIG9mIHRoZSBpbWFnZSwgcmF0aGVyIHRoYW4gdGhlXG4gICAgLy8gb25lIHJvdW5kZWQgdXAgdG8gNCBwaXhlbHMuXG4gICAgdmFyIHdpZHRoID0gcmVwZWF0aW5nID8gaW1hZ2Uud2lkdGggOiByZWN0Lnc7XG4gICAgdmFyIGhlaWdodCA9IHJlcGVhdGluZyA/IGltYWdlLmhlaWdodCA6IHJlY3QuaDtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzaXplOiBbd2lkdGgsIGhlaWdodF0sXG4gICAgICAgIHRsOiBbKHJlY3QueCArIHBhZGRpbmcpICAgICAgICAgLyB0aGlzLndpZHRoLCAocmVjdC55ICsgcGFkZGluZykgICAgICAgICAgLyB0aGlzLmhlaWdodF0sXG4gICAgICAgIGJyOiBbKHJlY3QueCArIHBhZGRpbmcgKyB3aWR0aCkgLyB0aGlzLndpZHRoLCAocmVjdC55ICsgcGFkZGluZyArIGhlaWdodCkgLyB0aGlzLmhlaWdodF1cbiAgICB9O1xufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3IodGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgIHZhciBoID0gTWF0aC5mbG9vcih0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheSh3ICogaCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRzdCwgc3JjLCB3cmFwKSB7XG4gICAgLy8gaWYgKCFzcHJpdGUtPnJhc3RlcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zcHJpdGUuaW1nLmRhdGEpIHJldHVybjtcbiAgICB2YXIgc3JjSW1nID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuc3ByaXRlLmltZy5kYXRhLmJ1ZmZlcik7XG5cbiAgICB0aGlzLmFsbG9jYXRlKCk7XG4gICAgdmFyIGRzdEltZyA9IHRoaXMuZGF0YTtcblxuICAgIHZhciBwYWRkaW5nID0gMTtcblxuICAgIGNvcHlCaXRtYXAoXG4gICAgICAgIC8qIHNvdXJjZSBidWZmZXIgKi8gIHNyY0ltZyxcbiAgICAgICAgLyogc291cmNlIHN0cmlkZSAqLyAgdGhpcy5zcHJpdGUuaW1nLndpZHRoLFxuICAgICAgICAvKiBzb3VyY2UgeCAqLyAgICAgICBzcmMueCxcbiAgICAgICAgLyogc291cmNlIHkgKi8gICAgICAgc3JjLnksXG4gICAgICAgIC8qIGRlc3QgYnVmZmVyICovICAgIGRzdEltZyxcbiAgICAgICAgLyogZGVzdCBzdHJpZGUgKi8gICAgdGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgLyogZGVzdCB4ICovICAgICAgICAgKGRzdC54ICsgcGFkZGluZykgKiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgIC8qIGRlc3QgeSAqLyAgICAgICAgIChkc3QueSArIHBhZGRpbmcpICogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAvKiBpY29uIGRpbWVuc2lvbiAqLyBzcmMud2lkdGgsXG4gICAgICAgIC8qIGljb24gZGltZW5zaW9uICovIHNyYy5oZWlnaHQsXG4gICAgICAgIC8qIHdyYXAgKi8gd3JhcFxuICAgICk7XG5cbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGUgPSBmdW5jdGlvbihzcHJpdGUpIHtcbiAgICB0aGlzLnNwcml0ZSA9IHNwcml0ZTtcbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5hZGRJY29ucyA9IGZ1bmN0aW9uKGljb25zLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nZXRJbWFnZShpY29uc1tpXSk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwgdGhpcy5pbWFnZXMpO1xufTtcblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCwgbGluZWFyKSB7XG4gICAgdmFyIGZpcnN0ID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXJWYWwgPSBsaW5lYXIgPyBnbC5MSU5FQVIgOiBnbC5ORUFSRVNUO1xuICAgIGlmIChmaWx0ZXJWYWwgIT09IHRoaXMuZmlsdGVyKSB7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJWYWwpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyVmFsKTtcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJWYWw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgpO1xuXG4gICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAvLyBlbnVtIHRhcmdldFxuICAgICAgICAgICAgICAgIDAsIC8vIGluZCBsZXZlbFxuICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGluZCBpbnRlcm5hbGZvcm1hdFxuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIC8vIEdMc2l6ZWkgd2lkdGhcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbywgLy8gR0xzaXplaSBoZWlnaHRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbmQgYm9yZGVyXG4gICAgICAgICAgICAgICAgZ2wuUkdCQSwgLy8gZW51bSBmb3JtYXRcbiAgICAgICAgICAgICAgICBnbC5VTlNJR05FRF9CWVRFLCAvLyBlbnVtIHR5cGVcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSAvLyBPYmplY3QgZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgLy8gZW51bSB0YXJnZXRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbnQgbGV2ZWxcbiAgICAgICAgICAgICAgICAwLCAvLyBpbnQgeG9mZnNldFxuICAgICAgICAgICAgICAgIDAsIC8vIGludCB5b2Zmc2V0XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbywgLy8gbG9uZyB3aWR0aFxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvLCAvLyBsb25nIGhlaWdodFxuICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGVudW0gZm9ybWF0XG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSwgLy8gZW51bSB0eXBlXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikgLy8gT2JqZWN0IHBpeGVsc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAvLyBERUJVR1xuICAgICAgICBpZiAodGhpcy5jdHgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvKTtcbiAgICAgICAgICAgIGRhdGEuZGF0YS5zZXQobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRoaXMuZGF0YS5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnB1dEltYWdlRGF0YShkYXRhLCAwLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5iaW4uZnJlZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHZhciBmcmVlID0gdGhpcy5iaW4uZnJlZVtrXTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VSZWN0KGZyZWUueCAqIHRoaXMucGl4ZWxSYXRpbywgZnJlZS55ICogdGhpcy5waXhlbFJhdGlvLCBmcmVlLncgKiB0aGlzLnBpeGVsUmF0aW8sIGZyZWUuaCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRU5EIERFQlVHXG4gICAgfVxufTtcblxuZnVuY3Rpb24gQXRsYXNJbWFnZShyZWN0LCB3aWR0aCwgaGVpZ2h0LCBzZGYpIHtcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnNkZiA9IHNkZjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcbnZhciBMYXRMbmdCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZ19ib3VuZHMnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbi8qKlxuICogT3B0aW9ucyBjb21tb24gdG8gTWFwI2p1bXBUbywgTWFwI2Vhc2VUbywgYW5kIE1hcCNmbHlUbywgY29udHJvbGxpbmcgdGhlIGRlc3RpbmF0aW9uXG4gKiBsb2NhdGlvbiwgem9vbSBsZXZlbCwgYmVhcmluZyBhbmQgcGl0Y2guIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25zOyB1bnNwZWNpZmllZFxuICogb3B0aW9ucyB3aWxsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoYXQgcHJvcGVydHkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FtZXJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtBcnJheX0gY2VudGVyIExhdGl0dWRlIGFuZCBsb25naXR1ZGUgKHBhc3NlZCBhcyBgW2xhdCwgbG5nXWApXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBNYXAgem9vbSBsZXZlbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgTWFwIHJvdGF0aW9uIGJlYXJpbmcgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGl0Y2ggVGhlIGFuZ2xlIGF0IHdoaWNoIHRoZSBjYW1lcmEgaXMgbG9va2luZyBhdCB0aGUgZ3JvdW5kXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byBtYXAgbW92ZW1lbnQgbWV0aG9kcyB0aGF0IGludm9sdmUgYW5pbWF0aW9uLCBzdWNoIGFzIE1hcCNwYW5CeSBhbmRcbiAqIE1hcCNlYXNlVG8sIGNvbnRyb2xsaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uIEFsbCBwcm9wZXJ0aWVzXG4gKiBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5pbWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIE51bWJlciBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVhc2luZ1xuICogQHByb3BlcnR5IHtBcnJheX0gb2Zmc2V0IHBvaW50LCBvcmlnaW4gb2YgbW92ZW1lbnQgcmVsYXRpdmUgdG8gbWFwIGNlbnRlclxuICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRlIFdoZW4gc2V0IHRvIGZhbHNlLCBubyBhbmltYXRpb24gaGFwcGVuc1xuICovXG5cbnZhciBDYW1lcmEgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge307XG5cbnV0aWwuZXh0ZW5kKENhbWVyYS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgTWFwLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdmlldyBnZW9ncmFwaGljYWwgcG9pbnQuXG4gICAgICogQHJldHVybnMge0xhdExuZ31cbiAgICAgKi9cbiAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uY2VudGVyOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCBsb2NhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGNlbnRlciBMYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIChwYXNzZWQgYXMgYFtsYXQsIGxuZ11gKVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldENlbnRlcihbLTc0LCAzOF0pO1xuICAgICAqL1xuICAgIHNldENlbnRlcjogZnVuY3Rpb24oY2VudGVyKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFuIGJ5IGEgY2VydGFpbiBudW1iZXIgb2YgcGl4ZWxzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvZmZzZXQgW3gsIHldXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBwYW5CeTogZnVuY3Rpb24ob2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLCB1dGlsLmV4dGVuZCh7b2Zmc2V0OiBQb2ludC5jb252ZXJ0KG9mZnNldCkubXVsdCgtMSl9LCBvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYW4gdG8gYSBjZXJ0YWluIGxvY2F0aW9uIHdpdGggZWFzaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGF0bG5nIGEgYExhdExuZ2Agb2JqZWN0XG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBwYW5UbzogZnVuY3Rpb24obGF0bG5nLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGxhdGxuZyA9IExhdExuZy5jb252ZXJ0KGxhdGxuZyk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IHV0aWwuZWFzZSxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkucm90YXRlKC10ci5hbmdsZSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QobGF0bG5nKS5zdWIob2Zmc2V0KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubm9Nb3ZlU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IHRyLnVucHJvamVjdChmcm9tLmFkZCh0by5zdWIoZnJvbSkubXVsdChrKSkpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB6b29tXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRab29tOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFwIHpvb20uIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tIE1hcCB6b29tIGxldmVsXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgdG8gNVxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb206IGZ1bmN0aW9uKHpvb20pIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb206IHpvb219KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRvIGEgY2VydGFpbiB6b29tIGxldmVsIHdpdGggZWFzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21UbzogZnVuY3Rpb24oem9vbSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgZHVyYXRpb246IDUwMFxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBvcHRpb25zLmVhc2luZyA9IHRoaXMuX3VwZGF0ZUVhc2luZyhvcHRpb25zLmR1cmF0aW9uLCB6b29tLCBvcHRpb25zLmVhc2luZyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBhcm91bmQgPSB0ci5jZW50ZXIsXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0ci56b29tO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuXG4gICAgICAgIGlmICghdGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgdHIuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShzdGFydFpvb20sIHpvb20sIGspLCBhcm91bmQpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJykuZmlyZSgnem9vbScpO1xuICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZWFzZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kdXJhdGlvbiA+PSAyMDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24gPCAyMDApIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9vblpvb21FbmQpO1xuICAgICAgICAgICAgdGhpcy5fb25ab29tRW5kID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMjAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIGluIGJ5IDEgbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbUluOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIG91dCBieSAxIGxldmVsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21PdXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgLSAxLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGJlYXJpbmcgaW4gZGVncmVlc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QmVhcmluZzogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCByb3RhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgTWFwIHJvdGF0aW9uIGJlYXJpbmcgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByb3RhdGUgdGhlIG1hcCB0byA5MCBkZWdyZWVzXG4gICAgICogbWFwLnNldEJlYXJpbmcoOTApO1xuICAgICAqL1xuICAgIHNldEJlYXJpbmc6IGZ1bmN0aW9uKGJlYXJpbmcpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBiZWFyaW5nIGJ5IGEgY2VydGFpbiBudW1iZXIgb2YgZGVncmVlcyB3aXRoIGVhc2luZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmdcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJvdGF0ZVRvOiBmdW5jdGlvbihiZWFyaW5nLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgYXJvdW5kID0gdHIuY2VudGVyO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmVhcmluZyA9IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZywgc3RhcnQpO1xuXG4gICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpcmUoJ21vdmVzdGFydCcpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgdHIuc2V0QmVhcmluZ0Fyb3VuZChpbnRlcnBvbGF0ZShzdGFydCwgYmVhcmluZywgayksIGFyb3VuZCk7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnKS5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgbWFwIGJlYXJpbmcgdG8gMCAobm9ydGgpIHdpdGggZWFzaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGg6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5yb3RhdGVUbygwLCB1dGlsLmV4dGVuZCh7ZHVyYXRpb246IDEwMDB9LCBvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbmltYXRlcyBtYXAgYmVhcmluZyB0byAwIChub3J0aCkgaWYgaXQncyBhbHJlYWR5IGNsb3NlIHRvIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzbmFwVG9Ob3J0aDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5vcHRpb25zLmJlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNldE5vcnRoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYW5nbGUgaW4gZGVncmVlc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UGl0Y2g6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFwIGFuZ2xlLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaXRjaCBUaGUgYW5nbGUgYXQgd2hpY2ggdGhlIGNhbWVyYSBpcyBsb29raW5nIGF0IHRoZSBncm91bmRcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQaXRjaDogZnVuY3Rpb24ocGl0Y2gpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3BpdGNoOiBwaXRjaH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBab29tIHRvIGNvbnRhaW4gY2VydGFpbiBnZW9ncmFwaGljYWwgYm91bmRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBib3VuZHMgW1ttaW5MYXQsIG1pbkxuZ10sIFttYXhMYXQsIG1heExuZ11dXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc3BlZWQ9MS4yXSBIb3cgZmFzdCBhbmltYXRpb24gb2NjdXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmN1cnZlPTEuNDJdIEhvdyBtdWNoIHpvb21pbmcgb3V0IG9jY3VycyBkdXJpbmcgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5lYXNpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5wYWRkaW5nIGhvdyBtdWNoIHBhZGRpbmcgdGhlcmUgaXMgYXJvdW5kIHRoZSBnaXZlbiBib3VuZHMgb24gZWFjaCBzaWRlIGluIHBpeGVsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heFpvb21cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBmaXRCb3VuZHM6IGZ1bmN0aW9uKGJvdW5kcywgb3B0aW9ucykge1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBtYXhab29tOiBJbmZpbml0eVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBib3VuZHMgPSBMYXRMbmdCb3VuZHMuY29udmVydChib3VuZHMpO1xuXG4gICAgICAgIHZhciBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBudyA9IHRyLnByb2plY3QoYm91bmRzLmdldE5vcnRoV2VzdCgpKSxcbiAgICAgICAgICAgIHNlID0gdHIucHJvamVjdChib3VuZHMuZ2V0U291dGhFYXN0KCkpLFxuICAgICAgICAgICAgc2l6ZSA9IHNlLnN1YihudyksXG4gICAgICAgICAgICBzY2FsZVggPSAodHIud2lkdGggLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LngpICogMikgLyBzaXplLngsXG4gICAgICAgICAgICBzY2FsZVkgPSAodHIuaGVpZ2h0IC0gb3B0aW9ucy5wYWRkaW5nICogMiAtIE1hdGguYWJzKG9mZnNldC55KSAqIDIpIC8gc2l6ZS55O1xuXG4gICAgICAgIG9wdGlvbnMuY2VudGVyID0gdHIudW5wcm9qZWN0KG53LmFkZChzZSkuZGl2KDIpKTtcbiAgICAgICAgb3B0aW9ucy56b29tID0gTWF0aC5taW4odHIuc2NhbGVab29tKHRyLnNjYWxlICogTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSwgb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgb3B0aW9ucy5iZWFyaW5nID0gMDtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5saW5lYXIgP1xuICAgICAgICAgICAgdGhpcy5lYXNlVG8ob3B0aW9ucykgOlxuICAgICAgICAgICAgdGhpcy5mbHlUbyhvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgd2l0aG91dFxuICAgICAqIGEgdHJhbnNpdGlvbi4gVGhlIG1hcCB3aWxsIHJldGFpbiB0aGUgY3VycmVudCB2YWx1ZXMgZm9yIGFueSBvcHRpb25zXG4gICAgICogbm90IGluY2x1ZGVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9uc30gb3B0aW9ucyBtYXAgdmlldyBvcHRpb25zXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAganVtcFRvOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICAgIGJlYXJpbmdDaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoJ2NlbnRlcicgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgdHIuY2VudGVyID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5jZW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdiZWFyaW5nJyBpbiBvcHRpb25zICYmIHRyLmJlYXJpbmcgIT09ICtvcHRpb25zLmJlYXJpbmcpIHtcbiAgICAgICAgICAgIGJlYXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLmJlYXJpbmcgPSArb3B0aW9ucy5iZWFyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdwaXRjaCcgaW4gb3B0aW9ucyAmJiB0ci5waXRjaCAhPT0gK29wdGlvbnMucGl0Y2gpIHtcbiAgICAgICAgICAgIHBpdGNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5waXRjaCA9ICtvcHRpb25zLnBpdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnKTtcblxuICAgICAgICBpZiAoem9vbUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlYXJpbmdDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpdGNoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdwaXRjaCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZSgnbW92ZWVuZCcpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFYXNpbmcgYW5pbWF0aW9uIHRvIGEgc3BlY2lmaWVkIGxvY2F0aW9uL3pvb20vYmVhcmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zfkFuaW1hdGlvbk9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgYW5kIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgZWFzZVRvOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IHV0aWwuZWFzZVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpLnJvdGF0ZSgtdHIuYW5nbGUpLFxuICAgICAgICAgICAgZnJvbSA9IHRyLnBvaW50LFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoLFxuXG4gICAgICAgICAgICBzY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKSxcbiAgICAgICAgICAgIHRvID0gJ2NlbnRlcicgaW4gb3B0aW9ucyA/IHRyLnByb2plY3QoTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5jZW50ZXIpKS5zdWIob2Zmc2V0LmRpdihzY2FsZSkpIDogZnJvbSxcbiAgICAgICAgICAgIGFyb3VuZCA9IExhdExuZy5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcblxuICAgICAgICBpZiAoem9vbSAhPT0gc3RhcnRab29tKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuem9vbWluZyAmJiAhYXJvdW5kKSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZCh0by5zdWIoZnJvbSkuZGl2KDEgLSAxIC8gc2NhbGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ21vdmVzdGFydCcpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRab29tQXJvdW5kKGludGVycG9sYXRlKHN0YXJ0Wm9vbSwgem9vbSwgayksIGFyb3VuZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLmNlbnRlciA9IHRyLnVucHJvamVjdChmcm9tLmFkZCh0by5zdWIoZnJvbSkubXVsdChrKSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncm90YXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZseWluZyBhbmltYXRpb24gdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24vem9vbS9iZWFyaW5nIHdpdGggYXV0b21hdGljIGN1cnZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIEhvdyBmYXN0IGFuaW1hdGlvbiBvY2N1cnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY3VydmU9MS40Ml0gSG93IG11Y2ggem9vbWluZyBvdXQgb2NjdXJzIGR1cmluZyBhbmltYXRpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgIHpvb206IDksXG4gICAgICogICBzcGVlZDogMC4yLFxuICAgICAqICAgY3VydmU6IDEsXG4gICAgICogICBlYXNpbmc6IGZ1bmN0aW9uKHQpIHtcbiAgICAgKiAgICAgcmV0dXJuIHQ7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZmx5VG86IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCk7XG5cbiAgICAgICAgdmFyIGNlbnRlciA9ICdjZW50ZXInIGluIG9wdGlvbnMgPyBMYXRMbmcuY29udmVydChvcHRpb25zLmNlbnRlcikgOiB0aGlzLmdldENlbnRlcigpO1xuICAgICAgICB2YXIgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gICtvcHRpb25zLnpvb20gOiBzdGFydFpvb207XG4gICAgICAgIHZhciBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcblxuICAgICAgICB2YXIgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIob2Zmc2V0LmRpdihzY2FsZSkpO1xuXG4gICAgICAgIHZhciBzdGFydFdvcmxkU2l6ZSA9IHRyLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIHJobyA9IG9wdGlvbnMuY3VydmUsXG4gICAgICAgICAgICBWID0gb3B0aW9ucy5zcGVlZCxcblxuICAgICAgICAgICAgdzAgPSBNYXRoLm1heCh0ci53aWR0aCwgdHIuaGVpZ2h0KSxcbiAgICAgICAgICAgIHcxID0gdzAgLyBzY2FsZSxcbiAgICAgICAgICAgIHUxID0gdG8uc3ViKGZyb20pLm1hZygpLFxuICAgICAgICAgICAgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICBmdW5jdGlvbiByKGkpIHtcbiAgICAgICAgICAgIHZhciBiID0gKHcxICogdzEgLSB3MCAqIHcwICsgKGkgPyAtMSA6IDEpICogcmhvMiAqIHJobzIgKiB1MSAqIHUxKSAvICgyICogKGkgPyB3MSA6IHcwKSAqIHJobzIgKiB1MSk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGIgKiBiICsgMSkgLSBiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNpbmgobikgeyByZXR1cm4gKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gY29zaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgKyBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiB0YW5oKG4pIHsgcmV0dXJuIHNpbmgobikgLyBjb3NoKG4pOyB9XG5cbiAgICAgICAgdmFyIHIwID0gcigwKSxcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gKGNvc2gocjApIC8gY29zaChyMCArIHJobyAqIHMpKTsgfSxcbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gdzAgKiAoKGNvc2gocjApICogdGFuaChyMCArIHJobyAqIHMpIC0gc2luaChyMCkpIC8gcmhvMikgLyB1MTsgfSxcbiAgICAgICAgICAgIFMgPSAocigxKSAtIHIwKSAvIHJobztcblxuICAgICAgICBpZiAoTWF0aC5hYnModTEpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcztcblxuICAgICAgICAgICAgdmFyIGsgPSB3MSA8IHcwID8gLTEgOiAxO1xuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcblxuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMTAwMCAqIFMgLyBWO1xuXG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG5cbiAgICAgICAgdGhpcy5fZWFzZShmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgdmFyIHMgPSBrICogUyxcbiAgICAgICAgICAgICAgICB1cyA9IHUocyk7XG5cbiAgICAgICAgICAgIHRyLnpvb20gPSBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oMSAvIHcocykpO1xuICAgICAgICAgICAgdHIuY2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKHRvLnN1Yihmcm9tKS5tdWx0KHVzKSksIHN0YXJ0V29ybGRTaXplKTtcblxuICAgICAgICAgICAgaWYgKGJlYXJpbmcgIT09IHN0YXJ0QmVhcmluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnKS5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICBpZiAoYmVhcmluZyAhPT0gc3RhcnRCZWFyaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZWVuZCcpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgaXNFYXNpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hYm9ydEZuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Fib3J0Rm4pIHtcbiAgICAgICAgICAgIHRoaXMuX2Fib3J0Rm4uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaEVhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2Vhc2U6IGZ1bmN0aW9uKGZyYW1lLCBmaW5pc2gsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZmluaXNoRm4gPSBmaW5pc2g7XG4gICAgICAgIHRoaXMuX2Fib3J0Rm4gPSBicm93c2VyLnRpbWVkKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBmcmFtZS5jYWxsKHRoaXMsIG9wdGlvbnMuZWFzaW5nKHQpKTtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoRWFzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlID8gMCA6IG9wdGlvbnMuZHVyYXRpb24sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfZmluaXNoRWFzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9hYm9ydEZuO1xuICAgICAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uIG1pZ2h0IGVtaXQgZXZlbnRzIHdoaWNoIHRyaWdnZXIgbmV3IGVhc2VzLCB3aGljaFxuICAgICAgICAvLyBzZXQgYSBuZXcgX2ZpbmlzaEZuLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgdmFyIGZpbmlzaCA9IHRoaXMuX2ZpbmlzaEZuO1xuICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoRm47XG4gICAgICAgIGZpbmlzaC5jYWxsKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvLyBjb252ZXJ0IGJlYXJpbmcgc28gdGhhdCBpdCdzIG51bWVyaWNhbGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IGl0IGludGVycG9sYXRlcyBwcm9wZXJseVxuICAgIF9ub3JtYWxpemVCZWFyaW5nOiBmdW5jdGlvbihiZWFyaW5nLCBjdXJyZW50QmVhcmluZykge1xuICAgICAgICBiZWFyaW5nID0gdXRpbC53cmFwKGJlYXJpbmcsIC0xODAsIDE4MCk7XG4gICAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoYmVhcmluZyAtIGN1cnJlbnRCZWFyaW5nKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgLSAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nIC09IDM2MDtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcbiAgICAgICAgcmV0dXJuIGJlYXJpbmc7XG4gICAgfSxcblxuICAgIF91cGRhdGVFYXNpbmc6IGZ1bmN0aW9uKGR1cmF0aW9uLCB6b29tLCBiZXppZXIpIHtcbiAgICAgICAgdmFyIGVhc2luZztcblxuICAgICAgICBpZiAodGhpcy5lYXNlKSB7XG4gICAgICAgICAgICB2YXIgZWFzZSA9IHRoaXMuZWFzZSxcbiAgICAgICAgICAgICAgICB0ID0gKERhdGUubm93KCkgLSBlYXNlLnN0YXJ0KSAvIGVhc2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBlYXNlLmVhc2luZyh0ICsgMC4wMSkgLSBlYXNlLmVhc2luZyh0KSxcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbWFrZSBuZXcgYmV6aWVyIHRoYXQgaXMgY29udGludW91cyB3aXRoIGxhc3RcbiAgICAgICAgICAgICAgICB4ID0gMC4yNyAvIE1hdGguc3FydChzcGVlZCAqIHNwZWVkICsgMC4wMDAxKSAqIDAuMDEsXG4gICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCgwLjI3ICogMC4yNyAtIHggKiB4KTtcblxuICAgICAgICAgICAgZWFzaW5nID0gdXRpbC5iZXppZXIoeCwgeSwgMC4yNSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlYXNpbmcgPSBiZXppZXIgPyB1dGlsLmJlemllci5hcHBseSh1dGlsLCBiZXppZXIpIDogdXRpbC5lYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RvcmUgaW5mb3JtYXRpb24gb24gY3VycmVudCBlYXNpbmdcbiAgICAgICAgdGhpcy5lYXNlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXG4gICAgICAgICAgICB0bzogTWF0aC5wb3coMiwgem9vbSksXG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IGVhc2luZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBlYXNpbmc7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb250cm9sID0gcmVxdWlyZSgnLi9jb250cm9sJyk7XG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRpb247XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdHRyaWJ1dGlvbiBjb250cm9sXG4gKiBAY2xhc3MgQXR0cmlidXRpb25cbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuQXR0cmlidXRpb24oKSk7XG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0aW9uKCkge31cblxuQXR0cmlidXRpb24ucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KENvbnRyb2wsIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0J1xuICAgIH0sXG5cbiAgICBvbkFkZDogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybC1hdHRyaWInLFxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgY2xhc3NOYW1lLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICBtYXAub24oJ3NvdXJjZS5sb2FkJywgdGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO1xuICAgICAgICBtYXAub24oJ3NvdXJjZS5jaGFuZ2UnLCB0aGlzLl91cGRhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIG1hcC5vbignc291cmNlLnJlbW92ZScsIHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmsuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGlvbnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fbWFwLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9tYXAuc3R5bGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5hdHRyaWJ1dGlvbiAmJiBhdHRyaWJ1dGlvbnMuaW5kZXhPZihzb3VyY2UuYXR0cmlidXRpb24pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMucHVzaChzb3VyY2UuYXR0cmlidXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUwgPSBhdHRyaWJ1dGlvbnMuam9pbignIHwgJyk7XG4gICAgICAgIHRoaXMuX2VkaXRMaW5rID0gdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21hcGJveC1pbXByb3ZlLW1hcCcpWzBdO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlRWRpdExpbms6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdExpbmspIHtcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0TGluay5ocmVmID0gJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwLWZlZWRiYWNrLyMvJyArXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlci5sbmcgKyAnLycgKyBjZW50ZXIubGF0ICsgJy8nICsgTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBDb250cm9sO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgbWFwLXJlbGF0ZWQgaW50ZXJmYWNlIGVsZW1lbnRzLlxuICpcbiAqIEBjbGFzcyBDb250cm9sXG4gKi9cbmZ1bmN0aW9uIENvbnRyb2woKSB7fVxuXG5Db250cm9sLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgdGhpcyBjb250cm9sIHRvIHRoZSBtYXAsIHJldHVybmluZyB0aGUgY29udHJvbCBpdHNlbGZcbiAgICAgKiBmb3IgY2hhaW5pbmcuIFRoaXMgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBET00gZWxlbWVudCBpbnRvXG4gICAgICogdGhlIG1hcCdzIERPTSBlbGVtZW50IGlmIHRoZSBjb250cm9sIGhhcyBhIGBwb3NpdGlvbmAgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcFxuICAgICAqIEByZXR1cm5zIHtDb250cm9sfSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbzogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciA9IHRoaXMub25BZGQobWFwKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgICAgICB2YXIgY29ybmVyID0gbWFwLl9jb250cm9sQ29ybmVyc1twb3NdO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSAnIG1hcGJveGdsLWN0cmwnO1xuICAgICAgICAgICAgaWYgKHBvcy5pbmRleE9mKCdib3R0b20nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3JuZXIuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgY29ybmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3JuZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhpcyBjb250cm9sIGZyb20gdGhlIG1hcCBpdCBoYXMgYmVlbiBhZGRlZCB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtDb250cm9sfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vblJlbW92ZSkgdGhpcy5vblJlbW92ZSh0aGlzLl9tYXApO1xuICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5hdmlnYXRpb247XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hdmlnYXRpb24gY29udHJvbCB3aXRoIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzXG4gKiBAY2xhc3MgTmF2aWdhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBvc2l0aW9uPXRvcC1yaWdodF0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgY29udHJvbCdzIHBvc2l0aW9uIG9uIHRoZSBtYXAuIE9wdGlvbnMgYXJlIGB0b3AtcmlnaHRgLCBgdG9wLWxlZnRgLCBgYm90dG9tLXJpZ2h0YCwgYGJvdHRvbS1sZWZ0YFxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uKHtwb3NpdGlvbjogJ3RvcC1sZWZ0J30pKTsgLy8gcG9zaXRpb24gaXMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTmF2aWdhdGlvbihvcHRpb25zKSB7XG4gICAgdXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5OYXZpZ2F0aW9uLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChDb250cm9sLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBwb3NpdGlvbjogJ3RvcC1yaWdodCdcbiAgICB9LFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBjbGFzc05hbWUgKyAnLWdyb3VwJywgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20taW4nLCBtYXAuem9vbUluLmJpbmQobWFwKSk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20tb3V0JywgbWFwLnpvb21PdXQuYmluZChtYXApKTtcbiAgICAgICAgdGhpcy5fY29tcGFzcyA9IHRoaXMuX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWUgKyAnLWNvbXBhc3MnLCBtYXAucmVzZXROb3J0aC5iaW5kKG1hcCkpO1xuXG4gICAgICAgIHZhciBjb21wYXNzQ2FudmFzID0gdGhpcy5fY29tcGFzc0NhbnZhcyA9IERPTS5jcmVhdGUoJ2NhbnZhcycsIGNsYXNzTmFtZSArICctY29tcGFzcy1jYW52YXMnLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgY29tcGFzc0NhbnZhcy5zdHlsZS5jc3NUZXh0ID0gJ3dpZHRoOjMwcHg7IGhlaWdodDozMHB4Oyc7XG4gICAgICAgIGNvbXBhc3NDYW52YXMud2lkdGggPSAyNiAqIDI7XG4gICAgICAgIGNvbXBhc3NDYW52YXMuaGVpZ2h0ID0gMjYgKiAyO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Db21wYXNzRG93bi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzTW92ZSA9IHRoaXMuX29uQ29tcGFzc01vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzVXAgPSB0aGlzLl9vbkNvbXBhc3NVcC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3NDdHggPSBjb21wYXNzQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX2RyYXdOb3J0aCgpO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfSxcblxuICAgIF9vbkNvbXBhc3NEb3duOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uQ29tcGFzc01vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Db21wYXNzVXApO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcblxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG5cbiAgICBfb25Db21wYXNzTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgeCA9IGUuc2NyZWVuWCxcbiAgICAgICAgICAgIGQgPSB4IDwgMiA/IC01IDogLy8gbGVmdCBlZGdlIG9mIHRoZSBzY3JlZW4sIGNvbnRpbnVlIHJvdGF0aW5nXG4gICAgICAgICAgICAgICAgeCA+IHdpbmRvdy5zY3JlZW4ud2lkdGggLSAyID8gNSA6IC8vIHJpZ2h0IGVkZ2VcbiAgICAgICAgICAgICAgICAoeCAtIHRoaXMuX3ByZXZYKSAvIDQ7XG5cbiAgICAgICAgdGhpcy5fbWFwLnNldEJlYXJpbmcodGhpcy5fbWFwLmdldEJlYXJpbmcoKSAtIGQpO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcbiAgICAgICAgdGhpcy5fbW92ZWQgPSB0cnVlO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX29uQ29tcGFzc1VwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Db21wYXNzTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbkNvbXBhc3NVcCk7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21hcC5zbmFwVG9Ob3J0aCgpO1xuICAgIH0sXG5cbiAgICBfY3JlYXRlQnV0dG9uOiBmdW5jdGlvbihjbGFzc05hbWUsIGZuKSB7XG4gICAgICAgIHZhciBhID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGZuKCk7IH0pO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9LFxuXG4gICAgX2RyYXdOb3J0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByYWQgPSAyMCxcbiAgICAgICAgICAgIHdpZHRoID0gOCxcbiAgICAgICAgICAgIGNlbnRlciA9IDI2LFxuICAgICAgICAgICAgYW5nbGUgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICsgKE1hdGguUEkgLyAyKSxcbiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2NvbXBhc3NDdHg7XG5cbiAgICAgICAgdGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCA9IHRoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg7XG5cbiAgICAgICAgY3R4LnRyYW5zbGF0ZShjZW50ZXIsIGNlbnRlcik7XG4gICAgICAgIGN0eC5yb3RhdGUoYW5nbGUpO1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJztcbiAgICAgICAgY3R4LmxpbmVUbygwLCAtd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKC1yYWQsIDApO1xuICAgICAgICBjdHgubGluZVRvKDAsIHdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2JiYic7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKHJhZCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjZmZmJztcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDQ7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmxpbmVUbygwLCB3aWR0aCk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyksXG4gICAgTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi4vLi4vZ2VvL2xhdF9sbmdfYm91bmRzJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJveFpvb207XG5cblxuZnVuY3Rpb24gQm94Wm9vbShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgdGhpcy5fY29udGFpbmVyID0gbWFwLmdldENvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkJveFpvb20ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duKTtcbiAgICB9LFxuXG4gICAgX29uTW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5zaGlmdEtleSB8fCAoZS53aGljaCA9PT0gMSAmJiBlLmJ1dHRvbiA9PT0gMSkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5fYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtYm94em9vbScsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3Jvc3NoYWlyJyk7XG5cbiAgICAgICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSgnYm94em9vbXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluWCA9IE1hdGgubWluKHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKHAwLnksIHAxLnkpLFxuICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KHAwLnksIHAxLnkpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fYm94LCAndHJhbnNsYXRlKCcgKyBtaW5YICsgJ3B4LCcgKyBtaW5ZICsgJ3B4KScpO1xuXG4gICAgICAgIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IChtYXhYIC0gbWluWCkgKyAncHgnO1xuICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gKG1heFkgLSBtaW5ZKSArICdweCc7XG4gICAgfSxcblxuICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpLFxuICAgICAgICAgICAgYm91bmRzID0gbmV3IExhdExuZ0JvdW5kcyh0aGlzLl9tYXAudW5wcm9qZWN0KHAwKSwgdGhpcy5fbWFwLnVucHJvamVjdChwMSkpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuXG4gICAgICAgIHRoaXMuX21hcFxuICAgICAgICAgICAgLmZpdEJvdW5kcyhib3VuZHMsIHtsaW5lYXI6IHRydWV9KVxuICAgICAgICAgICAgLmZpcmUoJ2JveHpvb21lbmQnLCB7Ym94Wm9vbUJvdW5kczogYm91bmRzfSk7XG4gICAgfSxcblxuICAgIF9vbktleURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKCdib3h6b29tY2FuY2VsJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZpbmlzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2JveCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuXG4gICAgICAgIHRoaXMuX2JveC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JveCk7XG4gICAgICAgIHRoaXMuX2JveCA9IG51bGw7XG5cbiAgICAgICAgRE9NLmVuYWJsZURyYWcoKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvdWJsZUNsaWNrWm9vbTtcblxuZnVuY3Rpb24gRG91YmxlQ2xpY2tab29tKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl9vbkRibENsaWNrID0gdGhpcy5fb25EYmxDbGljay5iaW5kKHRoaXMpO1xufVxuXG5Eb3VibGVDbGlja1pvb20ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fb25EYmxDbGljayk7XG4gICAgfSxcblxuICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9vbkRibENsaWNrKTtcbiAgICB9LFxuXG4gICAgX29uRGJsQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX21hcC56b29tVG8oTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSArIDEsIHthcm91bmQ6IGUubGF0TG5nfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdQYW47XG5cblxudmFyIGluZXJ0aWFMaW5lYXJpdHkgPSAwLjI1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSB1dGlsLmJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAzMDAwLCAvLyBweC9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDQwMDA7IC8vIHB4L3NeMlxuXG5cbmZ1bmN0aW9uIERyYWdQYW4obWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkRyYWdQYW4ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uRG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uRG93bik7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vbkRvd24pO1xuICAgIH0sXG5cbiAgICBfb25Eb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX3BvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG5cbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtbRGF0ZS5ub3coKSwgdGhpcy5fcG9zXV07XG5cbiAgICAgICAgaWYgKCFlLnRvdWNoZXMpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25Nb3ZlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAobWFwLmJveFpvb20uYWN0aXZlIHx8IG1hcC5kcmFnUm90YXRlLmFjdGl2ZSB8fCAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGluZXJ0aWEucHVzaChbbm93LCBwb3NdKTtcbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMiAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gNTApIGluZXJ0aWEuc2hpZnQoKTtcblxuICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICBtYXAudHJhbnNmb3JtLnNldExvY2F0aW9uQXRQb2ludChtYXAudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odGhpcy5fcG9zKSwgcG9zKTtcbiAgICAgICAgbWFwLmZpcmUoJ21vdmUnKTtcblxuICAgICAgICB0aGlzLl9wb3MgPSBwb3M7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25VcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgZmxpbmdPZmZzZXQgPSBsYXN0WzFdLnN1YihmaXJzdFsxXSksXG4gICAgICAgICAgICBmbGluZ0R1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwLFxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcHgvcyB2ZWxvY2l0eSAmIGFkanVzdCBmb3IgaW5jcmVhc2VkIGluaXRpYWwgYW5pbWF0aW9uIHNwZWVkIHdoZW4gZWFzaW5nIG91dFxuICAgICAgICAgICAgdmVsb2NpdHkgPSBmbGluZ09mZnNldC5tdWx0KGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKSxcbiAgICAgICAgICAgIHNwZWVkID0gdmVsb2NpdHkubWFnKCk7IC8vIHB4L3NcblxuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChzcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHVyYXRpb24gPSBzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICBvZmZzZXQgPSB2ZWxvY2l0eS5tdWx0KC1kdXJhdGlvbiAvIDIpO1xuXG4gICAgICAgIHRoaXMuX21hcC5wYW5CeShvZmZzZXQsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX29uTW91c2VVcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9vblVwKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIF9vblRvdWNoRW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX29uVXAoKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5JyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdSb3RhdGU7XG5cblxuZnVuY3Rpb24gRHJhZ1JvdGF0ZShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICB1dGlsLmJpbmRIYW5kbGVycyh0aGlzKTtcbn1cblxuRHJhZ1JvdGF0ZS5wcm90b3R5cGUgPSB7XG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fb25Db250ZXh0TWVudSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fb25Db250ZXh0TWVudSk7XG4gICAgfSxcblxuICAgIF9vbkNvbnRleHRNZW51OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9tYXAuc3RvcCgpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgdmFyIHAwID0gdGhpcy5fc3RhcnRQb3MsXG4gICAgICAgICAgICBwMSA9IHRoaXMuX3BvcyxcbiAgICAgICAgICAgIHAyID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKSxcblxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgY2VudGVyID0gbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludCwgLy8gQ2VudGVyIG9mIHJvdGF0aW9uXG4gICAgICAgICAgICBzdGFydFRvQ2VudGVyID0gcDAuc3ViKGNlbnRlciksXG4gICAgICAgICAgICBzdGFydFRvQ2VudGVyRGlzdCA9IHN0YXJ0VG9DZW50ZXIubWFnKCk7XG5cbiAgICAgICAgaWYgKCFtYXAucm90YXRpbmcpIHtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3Zlc3RhcnQnKTtcbiAgICAgICAgICAgIG1hcC5yb3RhdGluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2xpY2sgd2FzIHRvbyBjbG9zZSB0byB0aGUgY2VudGVyLCBtb3ZlIHRoZSBjZW50ZXIgb2Ygcm90YXRpb24gYnkgMjAwIHBpeGVsc1xuICAgICAgICAvLyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjbGljay5cbiAgICAgICAgaWYgKHN0YXJ0VG9DZW50ZXJEaXN0IDwgMjAwKSB7XG4gICAgICAgICAgICBjZW50ZXIgPSBwMC5hZGQobmV3IFBvaW50KC0yMDAsIDApLl9yb3RhdGUoc3RhcnRUb0NlbnRlci5hbmdsZSgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVhcmluZ0RpZmYgPSBwMS5zdWIoY2VudGVyKS5hbmdsZVdpdGgocDIuc3ViKGNlbnRlcikpIC8gTWF0aC5QSSAqIDE4MDtcbiAgICAgICAgbWFwLnRyYW5zZm9ybS5iZWFyaW5nID0gbWFwLmdldEJlYXJpbmcoKSAtIGJlYXJpbmdEaWZmO1xuXG4gICAgICAgIG1hcC5maXJlKCdtb3ZlJykuZmlyZSgncm90YXRlJyk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fcG9zID0gcDI7XG4gICAgfSxcblxuICAgIF9vblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICBtYXAucm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgbWFwLnNuYXBUb05vcnRoKCk7XG5cbiAgICAgICAgaWYgKCFtYXAucm90YXRpbmcpIHtcbiAgICAgICAgICAgIG1hcC5fcmVyZW5kZXIoKTtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uTW91c2VVcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleWJvYXJkO1xuXG5cbnZhciBwYW5EZWx0YSA9IDgwLFxuICAgIHJvdGF0ZURlbHRhID0gMjtcblxuLyoqXG4gKiBUaGUgYEtleWJvYXJkYCBoYW5kbGVyIHJlc3BvbmRzIHRvIGtleWJvYXJkIGlucHV0IGJ5IHpvb21pbmcsIHJvdGF0aW5nLCBvciBwYW5uaW5nIHRoZVxuICogbWFwLiBUaGUgZm9sbG93aW5nIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgc3VwcG9ydGVkOlxuICogICogYD1gIC8gYCtgOiBpbmNyZWFzZSB6b29tIGxldmVsIGJ5IDFcbiAqICAqIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogaW5jcmVhc2Ugem9vbSBsZXZlbCBieSAyXG4gKiAgKiBgLWA6IGRlY3JlYXNlIHpvb20gbGV2ZWwgYnkgMVxuICogICogYFNoaWZ0LS1gOiBkZWNyZWFzZSB6b29tIGxldmVsIGJ5IDJcbiAqICAqIEFycm93IGtleXM6IHBhbiBieSA4MCBwaXhlbHNcbiAqICAqIGBTaGlmdCvih6JgOiBpbmNyZWFzZSByb3RhdGlvbiBieSAyIGRlZ3JlZXNcbiAqICAqIGBTaGlmdCvih6BgOiBkZWNyZWFzZSByb3RhdGlvbiBieSAyIGRlZ3JlZXNcbiAqIEBjbGFzcyBLZXlib2FyZFxuICogQGV4YW1wbGVcbiAqICAgLy8gRGlzYWJsZSB0aGUga2V5Ym9hcmQgaGFuZGxlclxuICogICBtYXAua2V5Ym9hcmQuZGlzYWJsZSgpO1xuICogQGV4YW1wbGVcbiAqICAgLy8gRW5hYmxlIHRoZSBrZXlib2FyZCBoYW5kbGVyXG4gKiAgIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAqL1xuZnVuY3Rpb24gS2V5Ym9hcmQobWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdGhpcy5fb25LZXlEb3duID0gdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyk7XG59XG5cbktleWJvYXJkLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuICAgIH0sXG5cbiAgICBfb25LZXlEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSA2MTpcbiAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgIGNhc2UgMTcxOlxuICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgIG1hcC56b29tVG8oTWF0aC5yb3VuZChtYXAuZ2V0Wm9vbSgpKSArIChlLnNoaWZ0S2V5ID8gMiA6IDEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICBtYXAuem9vbVRvKE1hdGgucm91bmQobWFwLmdldFpvb20oKSkgLSAoZS5zaGlmdEtleSA/IDIgOiAxKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBtYXAuc2V0QmVhcmluZyhtYXAuZ2V0QmVhcmluZygpIC0gcm90YXRlRGVsdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXAucGFuQnkoWy1wYW5EZWx0YSwgMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgbWFwLnNldEJlYXJpbmcobWFwLmdldEJlYXJpbmcoKSArIHJvdGF0ZURlbHRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwLnBhbkJ5KFtwYW5EZWx0YSwgMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIG1hcC5wYW5CeShbMCwgLXBhbkRlbHRhXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgbWFwLnBhbkJ5KFswLCBwYW5EZWx0YV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUGluY2g7XG5cblxuZnVuY3Rpb24gUGluY2gobWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cblBpbmNoLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uU3RhcnQsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25TdGFydCk7XG4gICAgfSxcblxuICAgIF9vblN0YXJ0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRTY2FsZSA9IHRoaXMuX21hcC50cmFuc2Zvcm0uc2NhbGU7XG4gICAgICAgIHRoaXMuX3N0YXJ0QmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZztcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUsIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vbkVuZCwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBfb25Nb3ZlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pLFxuICAgICAgICAgICAgcCA9IHAwLmFkZChwMSkuZGl2KDIpLFxuICAgICAgICAgICAgdmVjID0gcDAuc3ViKHAxKSxcbiAgICAgICAgICAgIHNjYWxlID0gdmVjLm1hZygpIC8gdGhpcy5fc3RhcnRWZWMubWFnKCksXG4gICAgICAgICAgICBiZWFyaW5nID0gdmVjLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykgKiAxODAgLyBNYXRoLlBJLFxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwO1xuXG4gICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgem9vbTogbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIGJlYXJpbmc6IHRoaXMuX3N0YXJ0QmVhcmluZyArIGJlYXJpbmcsXG4gICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgIGFyb3VuZDogbWFwLnVucHJvamVjdChwKVxuICAgICAgICB9KTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcblxuICAgIF9vbkVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9tYXAuc25hcFRvTm9ydGgoKTtcblxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uRW5kKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNjcm9sbFpvb207XG5cblxudmFyIHVhID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICBmaXJlZm94ID0gdWEuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMSxcbiAgICBzYWZhcmkgPSB1YS5pbmRleE9mKCdzYWZhcmknKSAhPT0gLTEgJiYgdWEuaW5kZXhPZignY2hyb20nKSA9PT0gLTE7XG5cblxuZnVuY3Rpb24gU2Nyb2xsWm9vbShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICB1dGlsLmJpbmRIYW5kbGVycyh0aGlzKTtcbn1cblxuU2Nyb2xsWm9vbS5wcm90b3R5cGUgPSB7XG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fb25XaGVlbCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgdGhpcy5fb25XaGVlbCwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fb25XaGVlbCk7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9vbldoZWVsKTtcbiAgICB9LFxuXG4gICAgX29uV2hlZWw6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciB2YWx1ZTtcblxuICAgICAgICBpZiAoZS50eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGUuZGVsdGFZO1xuICAgICAgICAgICAgLy8gRmlyZWZveCBkb3VibGVzIHRoZSB2YWx1ZXMgb24gcmV0aW5hIHNjcmVlbnMuLi5cbiAgICAgICAgICAgIGlmIChmaXJlZm94ICYmIGUuZGVsdGFNb2RlID09PSB3aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUwpIHZhbHVlIC89IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIGlmIChlLmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHZhbHVlICo9IDQwO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAnbW91c2V3aGVlbCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gLWUud2hlZWxEZWx0YVk7XG4gICAgICAgICAgICBpZiAoc2FmYXJpKSB2YWx1ZSA9IHZhbHVlIC8gMztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub3cgPSAod2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGUpLm5vdygpLFxuICAgICAgICAgICAgdGltZURlbHRhID0gbm93IC0gKHRoaXMuX3RpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fdGltZSA9IG5vdztcblxuICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgKHZhbHVlICUgNC4wMDAyNDQxNDA2MjUpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3doZWVsJztcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGlzIHZhbHVlIHRvIG1hdGNoIHRyYWNrcGFkLlxuICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlIC8gNCk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gMCAmJiBNYXRoLmFicyh2YWx1ZSkgPCA0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgdHJhY2twYWQgZXZlbnQgYmVjYXVzZSBpdCBpcyBzbyBzbWFsbC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAndHJhY2twYWQnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodGltZURlbHRhID4gNDAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIG5ldyBzY3JvbGwgYWN0aW9uLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSB0aW1lb3V0IGluIGNhc2UgdGhpcyB3YXMgYSBzaW5ndWxhciBldmVudCwgYW5kIGRlbHkgaXQgYnkgdXAgdG8gNDBtcy5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwgNDApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3R5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXRpbmcgZXZlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIGV2ZW50IGp1c3QgeWV0LlxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbHRhIHBlciB0aW1lIGlzIHNtYWxsLCB3ZSBhc3N1bWUgaXQncyBhIGZhc3QgdHJhY2twYWQ7IG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IChNYXRoLmFicyh0aW1lRGVsdGEgKiB2YWx1ZSkgPCAyMDApID8gJ3RyYWNrcGFkJyA6ICd3aGVlbCc7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgZGVsYXllZCBldmVudCBpc24ndCBmaXJlZCBhZ2FpbiwgYmVjYXVzZSB3ZSBhY2N1bXVsYXRlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZXZlbnQgKHdoaWNoIHdhcyBsZXNzIHRoYW4gNDBtcyBhZ28pIGludG8gdGhpcyBldmVudC5cbiAgICAgICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiB2YWx1ZSkgdmFsdWUgPSB2YWx1ZSAvIDQ7XG5cbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlIHRoZSB1c2VyIHVzZXMuXG4gICAgICAgIGlmICh0aGlzLl90eXBlKSB0aGlzLl96b29tKC12YWx1ZSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25UaW1lb3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuICAgICAgICB0aGlzLl96b29tKC10aGlzLl9sYXN0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBfem9vbTogZnVuY3Rpb24gKGRlbHRhKSB7XG4gICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyhkZWx0YSAvIDEwMCkpKTtcbiAgICAgICAgaWYgKGRlbHRhIDwgMCAmJiBzY2FsZSAhPT0gMCkgc2NhbGUgPSAxIC8gc2NhbGU7XG5cbiAgICAgICAgdmFyIGZyb21TY2FsZSA9IG1hcC5lYXNlID8gbWFwLmVhc2UudG8gOiBtYXAudHJhbnNmb3JtLnNjYWxlLFxuICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKGZyb21TY2FsZSAqIHNjYWxlKTtcblxuICAgICAgICBtYXAuem9vbVRvKHRhcmdldFpvb20sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgYXJvdW5kOiBtYXAudW5wcm9qZWN0KHRoaXMuX3BvcylcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLypcbiAqIEFkZHMgcG9zaXRpb25hbCBjb29yZGluYXRlcyB0byBVUkwgaGFzaGVzLiBQYXNzZWQgYXMgYW4gb3B0aW9uIHRvIHRoZSBtYXAgb2JqZWN0XG4gKlxuICogQGNsYXNzIG1hcGJveGdsLkhhc2hcbiAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5mdW5jdGlvbiBIYXNoKCkge1xuICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICdfb25IYXNoQ2hhbmdlJyxcbiAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgIF0sIHRoaXMpO1xufVxuXG5IYXNoLnByb3RvdHlwZSA9IHtcbiAgICAvKiBNYXAgZWxlbWVudCB0byBsaXN0ZW4gZm9yIGNvb3JkaW5hdGUgY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcFxuICAgICAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbzogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX29uSGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsb2MgPSBsb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1sxXSwgK2xvY1syXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiArKGxvY1szXSB8fCAwKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIF91cGRhdGVIYXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgYmVhcmluZyA9IHRoaXMuX21hcC5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoTWF0aC5sb2coem9vbSkgLyBNYXRoLkxOMikpLFxuXG4gICAgICAgICAgICBoYXNoID0gJyMnICsgKE1hdGgucm91bmQoem9vbSAqIDEwMCkgLyAxMDApICtcbiAgICAgICAgICAgICAgICAnLycgKyBjZW50ZXIubGF0LnRvRml4ZWQocHJlY2lzaW9uKSArXG4gICAgICAgICAgICAgICAgJy8nICsgY2VudGVyLmxuZy50b0ZpeGVkKHByZWNpc2lvbikgK1xuICAgICAgICAgICAgICAgIChiZWFyaW5nID8gJy8nICsgKE1hdGgucm91bmQoYmVhcmluZyAqIDEwKSAvIDEwKSA6ICcnKTtcblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoJycsICcnLCBoYXNoKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFuZGxlcnMgPSB7XG4gICAgc2Nyb2xsWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL3Njcm9sbF96b29tJyksXG4gICAgYm94Wm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2JveF96b29tJyksXG4gICAgZHJhZ1JvdGF0ZTogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcm90YXRlJyksXG4gICAgZHJhZ1BhbjogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcGFuJyksXG4gICAga2V5Ym9hcmQ6IHJlcXVpcmUoJy4vaGFuZGxlci9rZXlib2FyZCcpLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2RibGNsaWNrX3pvb20nKSxcbiAgICBwaW5jaDogcmVxdWlyZSgnLi9oYW5kbGVyL3BpbmNoJylcbn07XG5cbnZhciBET00gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpLFxuICAgIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmFjdGlvbjtcblxuLyoqXG4gKiBNb3VzZSBtb3ZlIGV2ZW50LlxuICpcbiAqIEBldmVudCBtb3VzZW1vdmVcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1BvaW50fSBwb2ludCB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge0xhdExuZ30gcG9pbnQgdGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge0V2ZW50fSBvcmlnaW5hbEV2ZW50IHRoZSBvcmlnaW5hbCBET00gZXZlbnRcbiAqL1xuXG4vKipcbiAqIENsaWNrIGV2ZW50LlxuICpcbiAqIEBldmVudCBjbGlja1xuICogQG1lbWJlcm9mIE1hcFxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IHRoZSBwaXhlbCBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7TGF0TG5nfSBwb2ludCB0aGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IG9yaWdpbmFsRXZlbnQgdGhlIG9yaWdpbmFsIERPTSBldmVudFxuICovXG5cbi8qKlxuICogRG91YmxlIGNsaWNrIGV2ZW50LlxuICpcbiAqIEBldmVudCBkYmxjbGlja1xuICogQG1lbWJlcm9mIE1hcFxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IHRoZSBwaXhlbCBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7TGF0TG5nfSBwb2ludCB0aGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IG9yaWdpbmFsRXZlbnQgdGhlIG9yaWdpbmFsIERPTSBldmVudFxuICovXG5cbmZ1bmN0aW9uIEludGVyYWN0aW9uKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbWFwW25hbWVdID0gbmV3IGhhbmRsZXJzW25hbWVdKG1hcCk7XG4gICAgfVxuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkludGVyYWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLl9tYXAub3B0aW9ucyxcbiAgICAgICAgICAgIGVsID0gdGhpcy5fZWw7XG5cbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbbmFtZV0pIHRoaXMuX21hcFtuYW1lXS5lbmFibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5fb25EYmxDbGljaywgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5fbWFwLm9wdGlvbnMsXG4gICAgICAgICAgICBlbCA9IHRoaXMuX2VsO1xuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zW25hbWVdKSB0aGlzLl9tYXBbbmFtZV0uZGlzYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24pO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Ub3VjaFN0YXJ0KTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMuX29uRGJsQ2xpY2spO1xuICAgIH0sXG5cbiAgICBfb25Nb3VzZURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICB9LFxuXG4gICAgX29uVG91Y2hTdGFydDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFlLnRvdWNoZXMgfHwgZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuX3RhcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5fdGFwcGVkID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDMwMCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90YXBwZWQpO1xuICAgICAgICAgICAgdGhpcy5fdGFwcGVkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZGJsY2xpY2snLCBlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25UaW1lb3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3RhcHBlZCA9IG51bGw7XG4gICAgfSxcblxuICAgIF9vbk1vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgIGVsID0gdGhpcy5fZWw7XG5cbiAgICAgICAgaWYgKG1hcC5kcmFnUGFuLmFjdGl2ZSB8fCBtYXAuZHJhZ1JvdGF0ZS5hY3RpdmUpIHJldHVybjtcblxuICAgICAgICB2YXIgdGFyZ2V0ID0gZS50b0VsZW1lbnQgfHwgZS50YXJnZXQ7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3VzZW1vdmUnLCBlKTtcbiAgICB9LFxuXG4gICAgX29uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmIChwb3MuZXF1YWxzKHRoaXMuX3N0YXJ0UG9zKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdjbGljaycsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9vbkRibENsaWNrOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RibGNsaWNrJywgZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX2ZpcmVFdmVudDogZnVuY3Rpb24gKHR5cGUsIGUpIHtcbiAgICAgICAgdmFyIHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG5cbiAgICAgICAgdGhpcy5fbWFwLmZpcmUodHlwZSwge1xuICAgICAgICAgICAgbGF0TG5nOiB0aGlzLl9tYXAudW5wcm9qZWN0KHBvcyksXG4gICAgICAgICAgICBwb2ludDogcG9zLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FudmFzID0gcmVxdWlyZSgnLi4vdXRpbC9jYW52YXMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBET00gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xuXG52YXIgU3R5bGUgPSByZXF1aXJlKCcuLi9zdHlsZS9zdHlsZScpO1xudmFyIEFuaW1hdGlvbkxvb3AgPSByZXF1aXJlKCcuLi9zdHlsZS9hbmltYXRpb25fbG9vcCcpO1xudmFyIFBhaW50ZXIgPSByZXF1aXJlKCcuLi9yZW5kZXIvcGFpbnRlcicpO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vZ2VvL3RyYW5zZm9ybScpO1xudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKTtcblxudmFyIEludGVyYWN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcmFjdGlvbicpO1xuXG52YXIgQ2FtZXJhID0gcmVxdWlyZSgnLi9jYW1lcmEnKTtcbnZhciBMYXRMbmcgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZycpO1xudmFyIExhdExuZ0JvdW5kcyA9IHJlcXVpcmUoJy4uL2dlby9sYXRfbG5nX2JvdW5kcycpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBBdHRyaWJ1dGlvbiA9IHJlcXVpcmUoJy4vY29udHJvbC9hdHRyaWJ1dGlvbicpO1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIE1hcCNhZGRDbGFzcywgTWFwI3JlbW92ZUNsYXNzLCBhbmQgTWFwI3NldENsYXNzZXMsIGNvbnRyb2xsaW5nXG4gKiB3aGV0aGVyIG9yIG5vdCB0byBzbW9vdGhseSB0cmFuc2l0aW9uIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IHRoZSBjbGFzcyBjaGFuZ2UuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gU3R5bGVPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRyYW5zaXRpb25cbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgaW5zdGFuY2UuXG4gKiBAY2xhc3MgTWFwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIEhUTUwgZWxlbWVudCB0byBpbml0aWFsaXplIHRoZSBtYXAgaW4gKG9yIGVsZW1lbnQgaWQgYXMgc3RyaW5nKVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblpvb209MF0gTWluaW11bSB6b29tIG9mIHRoZSBtYXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tPTIwXSBNYXhpbXVtIHpvb20gb2YgdGhlIG1hcFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuc3R5bGUgTWFwIHN0eWxlIGFuZCBkYXRhIHNvdXJjZSBkZWZpbml0aW9uIChlaXRoZXIgYSBKU09OIG9iamVjdCBvciBhIEpTT04gVVJMKSwgZGVzY3JpYmVkIGluIHRoZSBbc3R5bGUgcmVmZXJlbmNlXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNoPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAgd2lsbCB0cmFjayBhbmQgdXBkYXRlIHRoZSBwYWdlIFVSTCBhY2NvcmRpbmcgdG8gbWFwIHBvc2l0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVyYWN0aXZlPXRydWVdIElmIGBmYWxzZWAsIG5vIG1vdXNlLCB0b3VjaCwgb3Iga2V5Ym9hcmQgbGlzdGVuZXJzIGFyZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGlucHV0XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXA9N10gU25hcCB0byBub3J0aCB0aHJlc2hvbGQgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuY2xhc3NlcyBTdHlsZSBjbGFzcyBuYW1lcyB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIG1hcFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgdGhhdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGNyZWF0ZWQgV2ViR0wgY29udGV4dCB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgbG93ZXIgdGhhbiBleHBlY3RlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIFRoZSBtYXBzIGNhbnZhcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBQTkcgdXNpbmcgYG1hcC5nZXRDYW52YXMoKS50b0RhdGFVUkwoKTtgLiBUaGlzIGlzIGZhbHNlIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICogICBjb250YWluZXI6ICdtYXAnLFxuICogICBjZW50ZXI6IFszNy43NzI1MzcsIC0xMjIuNDIwNjc5XSxcbiAqICAgem9vbTogMTMsXG4gKiAgIHN0eWxlOiBzdHlsZV9vYmplY3QsXG4gKiAgIGhhc2g6IHRydWVcbiAqIH0pO1xuICovXG52YXIgTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5pbmhlcml0KHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmFuaW1hdGlvbkxvb3AgPSBuZXcgQW5pbWF0aW9uTG9vcCgpO1xuICAgIHRoaXMudHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSk7XG5cbiAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgdmFyIGIgPSBMYXRMbmdCb3VuZHMuY29udmVydChvcHRpb25zLm1heEJvdW5kcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlID0gW2IuZ2V0U291dGgoKSwgYi5nZXROb3J0aCgpXTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgPSBbYi5nZXRXZXN0KCksIGIuZ2V0RWFzdCgpXTtcbiAgICB9XG5cbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX2ZvcndhcmRTdHlsZUV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkU291cmNlRXZlbnQnLFxuICAgICAgICAnX2ZvcndhcmRMYXllckV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkVGlsZUV2ZW50JyxcbiAgICAgICAgJ19vblN0eWxlTG9hZCcsXG4gICAgICAgICdfb25TdHlsZUNoYW5nZScsXG4gICAgICAgICdfb25Tb3VyY2VBZGQnLFxuICAgICAgICAnX29uU291cmNlUmVtb3ZlJyxcbiAgICAgICAgJ19vblNvdXJjZVVwZGF0ZScsXG4gICAgICAgICd1cGRhdGUnLFxuICAgICAgICAncmVuZGVyJ1xuICAgIF0sIHRoaXMpO1xuXG4gICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcblxuICAgIHRoaXMub24oJ21vdmUnLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5vbignem9vbScsIHRoaXMudXBkYXRlLmJpbmQodGhpcywgdHJ1ZSkpO1xuICAgIHRoaXMub24oJ21vdmVlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApOyAvLyB0ZXh0IGZhZGluZ1xuICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpLnJlc2l6ZSgpLnVwZGF0ZSgpO1xuICAgICAgICB9LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyYWN0aW9uID0gbmV3IEludGVyYWN0aW9uKHRoaXMpO1xuXG4gICAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbi5lbmFibGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9oYXNoID0gb3B0aW9ucy5oYXNoICYmIChuZXcgSGFzaCgpKS5hZGRUbyh0aGlzKTtcbiAgICAvLyBkb24ndCBzZXQgcG9zaXRpb24gZnJvbSBvcHRpb25zIGlmIHNldCB0aHJvdWdoIGhhc2hcbiAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuc291cmNlcyA9IHt9O1xuICAgIHRoaXMuc3RhY2tzID0ge307XG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9O1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIGlmIChvcHRpb25zLmNsYXNzZXMpIHRoaXMuc2V0Q2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpO1xuICAgIGlmIChvcHRpb25zLnN0eWxlKSB0aGlzLnNldFN0eWxlKG9wdGlvbnMuc3R5bGUpO1xuICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCkgdGhpcy5hZGRDb250cm9sKG5ldyBBdHRyaWJ1dGlvbigpKTtcbn07XG5cbnV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUsIEV2ZW50ZWQpO1xudXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSwgQ2FtZXJhLnByb3RvdHlwZSk7XG51dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLCAvKiogQGxlbmRzIE1hcC5wcm90b3R5cGUgKi97XG5cbiAgICBvcHRpb25zOiB7XG4gICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICB6b29tOiAwLFxuICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICBwaXRjaDogMCxcblxuICAgICAgICBtaW5ab29tOiAwLFxuICAgICAgICBtYXhab29tOiAyMCxcblxuICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcblxuICAgICAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgICAgICBib3hab29tOiB0cnVlLFxuICAgICAgICBkcmFnUm90YXRlOiB0cnVlLFxuICAgICAgICBkcmFnUGFuOiB0cnVlLFxuICAgICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgICAgZG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgICAgICBwaW5jaDogdHJ1ZSxcblxuICAgICAgICBiZWFyaW5nU25hcDogNyxcblxuICAgICAgICBoYXNoOiBmYWxzZSxcblxuICAgICAgICBhdHRyaWJ1dGlvbkNvbnRyb2w6IHRydWUsXG5cbiAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2VcbiAgICB9LFxuXG4gICAgYWRkQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCkge1xuICAgICAgICBjb250cm9sLmFkZFRvKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHN0eWxlIGNsYXNzIHRvIGEgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2xhc3MgbmFtZSBvZiBzdHlsZSBjbGFzc1xuICAgICAqIEBwYXJhbSB7U3R5bGVPcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgY2hhbmdlXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKGtsYXNzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGFzc2VzW2tsYXNzXSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9jbGFzc2VzW2tsYXNzXSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc3R5bGUgY2xhc3MgZnJvbSBhIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIG5hbWUgb2Ygc3R5bGUgY2xhc3NcbiAgICAgKiBAcGFyYW0ge1N0eWxlT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQGZpcmVzIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihrbGFzcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2NsYXNzZXNba2xhc3NdKSByZXR1cm47XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2tsYXNzXTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIG1vcmUgdGhhbiBvbmUgY2xhc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzcyBuYW1lc1xuICAgICAqIEBwYXJhbSB7U3R5bGVPcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgY2hhbmdlXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0Q2xhc3NlczogZnVuY3Rpb24oa2xhc3Nlcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9jbGFzc2VzID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fY2xhc3Nlc1trbGFzc2VzW2ldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgYSBzdHlsZSBjbGFzcyBpcyBhY3RpdmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrbGFzcyBOYW1lIG9mIHN0eWxlIGNsYXNzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzQ2xhc3M6IGZ1bmN0aW9uKGtsYXNzKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2NsYXNzZXNba2xhc3NdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgYWN0aXZlIHN0eWxlIGNsYXNzZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldENsYXNzZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY2xhc3Nlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERldGVjdCB0aGUgbWFwJ3MgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJlc2l6ZSBpdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB3aWR0aCA9IDAsIGhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGggfHwgNDAwO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCB8fCAzMDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYW52YXMucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uX2NvbnN0cmFpbigpO1xuXG4gICAgICAgIHRoaXMucGFpbnRlci5yZXNpemUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5maXJlKCdtb3Zlc3RhcnQnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnKVxuICAgICAgICAgICAgLmZpcmUoJ3Jlc2l6ZScpXG4gICAgICAgICAgICAuZmlyZSgnbW92ZWVuZCcpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMYXRMbmdCb3VuZHN9XG4gICAgICovXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmdCb3VuZHMoXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSksXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMudHJhbnNmb3JtLnNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHBpeGVsIGNvb3JkaW5hdGVzIChyZWxhdGl2ZSB0byBtYXAgY29udGFpbmVyKSBnaXZlbiBhIGdlb2dyYXBoaWNhbCBsb2NhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZ1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzXG4gICAgICovXG4gICAgcHJvamVjdDogZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExhdExuZy5jb252ZXJ0KGxhdGxuZykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIGdpdmVuIHBpeGVsIGNvb3JkaW5hdGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHBvaW50IFt4LCB5XSBwaXhlbCBjb29yZGluYXRlc1xuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9XG4gICAgICovXG4gICAgdW5wcm9qZWN0OiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgZmVhdHVyZXMgYXQgYSBwb2ludCAoW3gsIHldKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBwb2ludCBbeCwgeV0gcGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMucmFkaXVzPTBdIE9wdGlvbmFsLiBSYWRpdXMgaW4gcGl4ZWxzIHRvIHNlYXJjaCBpblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubGF5ZXIgT3B0aW9uYWwuIE9ubHkgcmV0dXJuIGZlYXR1cmVzIGZyb20gYSBnaXZlbiBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudHlwZSBPcHRpb25hbC4gRWl0aGVyIGByYXN0ZXJgIG9yIGB2ZWN0b3JgXG4gICAgICogQHBhcmFtIHtmZWF0dXJlc0F0Q2FsbGJhY2t9IGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2VcbiAgICAgKlxuICAgICAqIEBjYWxsYmFjayBmZWF0dXJlc0F0Q2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBlcnIgRXJyb3IgX0lmIGFueV9cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBmZWF0dXJlcyBEaXNwbGF5cyBhIEpTT04gYXJyYXkgb2YgZmVhdHVyZXMgZ2l2ZW4gdGhlIHBhc3NlZCBwYXJhbWV0ZXJzIG9mIGBmZWF0dXJlc0F0YFxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5mZWF0dXJlc0F0KFsxMCwgMjBdLCB7IHJhZGl1czogMTAgfSwgZnVuY3Rpb24oZXJyLCBmZWF0dXJlcykge1xuICAgICAqICAgY29uc29sZS5sb2coZmVhdHVyZXMpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZlYXR1cmVzQXQ6IGZ1bmN0aW9uKHBvaW50LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb29yZCA9IHRoaXMudHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZShQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgICAgIHRoaXMuc3R5bGUuZmVhdHVyZXNBdChjb29yZCwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBtdWx0aXBsZSBzdHlsZSBtdXRhdGlvbnMgaW4gYSBiYXRjaFxuICAgICAqXG4gICAgICogbWFwLmJhdGNoKGZ1bmN0aW9uIChiYXRjaCkge1xuICAgICAqICAgICBiYXRjaC5hZGRMYXllcihsYXllcjEpO1xuICAgICAqICAgICBiYXRjaC5hZGRMYXllcihsYXllcjIpO1xuICAgICAqICAgICAuLi5cbiAgICAgKiAgICAgYmF0Y2guYWRkTGF5ZXIobGF5ZXJOKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHdvcmsgRnVuY3Rpb24gd2hpY2ggYWNjZXB0cyB0aGUgU3R5bGVCYXRjaCBpbnRlcmZhY2VcbiAgICAgKi9cbiAgICBiYXRjaDogZnVuY3Rpb24od29yaykge1xuICAgICAgICB0aGlzLnN0eWxlLmJhdGNoKHdvcmspO1xuXG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcyk7XG4gICAgICAgIHRoaXMudXBkYXRlKHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgQSBzdHlsZSBvYmplY3QgZm9ybWF0dGVkIGFzIEpTT05cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRTdHlsZTogZnVuY3Rpb24oc3R5bGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVcbiAgICAgICAgICAgICAgICAub2ZmKCdsb2FkJywgdGhpcy5fb25TdHlsZUxvYWQpXG4gICAgICAgICAgICAgICAgLm9mZignZXJyb3InLCB0aGlzLl9mb3J3YXJkU3R5bGVFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCdjaGFuZ2UnLCB0aGlzLl9vblN0eWxlQ2hhbmdlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ3NvdXJjZS5hZGQnLCB0aGlzLl9vblNvdXJjZUFkZClcbiAgICAgICAgICAgICAgICAub2ZmKCdzb3VyY2UucmVtb3ZlJywgdGhpcy5fb25Tb3VyY2VSZW1vdmUpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLmxvYWQnLCB0aGlzLl9vblNvdXJjZVVwZGF0ZSlcbiAgICAgICAgICAgICAgICAub2ZmKCdzb3VyY2UuZXJyb3InLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLmNoYW5nZScsIHRoaXMuX29uU291cmNlVXBkYXRlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ2xheWVyLmFkZCcsIHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ2xheWVyLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ3RpbGUuYWRkJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCd0aWxlLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZigndGlsZS5sb2FkJywgdGhpcy51cGRhdGUpXG4gICAgICAgICAgICAgICAgLm9mZigndGlsZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLl9yZW1vdmUoKTtcblxuICAgICAgICAgICAgdGhpcy5vZmYoJ3JvdGF0ZScsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5vZmYoJ3BpdGNoJywgdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKHN0eWxlIGluc3RhbmNlb2YgU3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUoc3R5bGUsIHRoaXMuYW5pbWF0aW9uTG9vcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0eWxlXG4gICAgICAgICAgICAub24oJ2xvYWQnLCB0aGlzLl9vblN0eWxlTG9hZClcbiAgICAgICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9mb3J3YXJkU3R5bGVFdmVudClcbiAgICAgICAgICAgIC5vbignY2hhbmdlJywgdGhpcy5fb25TdHlsZUNoYW5nZSlcbiAgICAgICAgICAgIC5vbignc291cmNlLmFkZCcsIHRoaXMuX29uU291cmNlQWRkKVxuICAgICAgICAgICAgLm9uKCdzb3VyY2UucmVtb3ZlJywgdGhpcy5fb25Tb3VyY2VSZW1vdmUpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5sb2FkJywgdGhpcy5fb25Tb3VyY2VVcGRhdGUpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbignc291cmNlLmNoYW5nZScsIHRoaXMuX29uU291cmNlVXBkYXRlKVxuICAgICAgICAgICAgLm9uKCdsYXllci5hZGQnLCB0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudClcbiAgICAgICAgICAgIC5vbignbGF5ZXIucmVtb3ZlJywgdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpXG4gICAgICAgICAgICAub24oJ3RpbGUuYWRkJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5yZW1vdmUnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9uKCd0aWxlLmxvYWQnLCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIC5vbigndGlsZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpO1xuXG4gICAgICAgIHRoaXMub24oJ3JvdGF0ZScsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICB0aGlzLm9uKCdwaXRjaCcsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzb3VyY2UgdG8gdGhlIG1hcCBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBvZiB0aGUgc291cmNlLiBNdXN0IG5vdCBiZSB1c2VkIGJ5IGFueSBleGlzdGluZyBzb3VyY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBzb3VyY2Ugc3BlY2lmaWNhdGlvbiwgZm9sbG93aW5nIHRoZVxuICAgICAqIFtNYXBib3ggR0wgU3R5bGUgUmVmZXJlbmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKVxuICAgICAqIEBmaXJlcyBzb3VyY2UuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkU291cmNlOiBmdW5jdGlvbihpZCwgc291cmNlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkU291cmNlKGlkLCBzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIHNvdXJjZSBmcm9tIHRoZSBtYXAgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgb2YgdGhlIHNvdXJjZSB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgc291cmNlLnJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdHlsZSBzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBpZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgc291cmNlIElEXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFNvdXJjZShpZCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U3R5bGVMYXllcnxPYmplY3R9IGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBiZWZvcmUgIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKiBAZmlyZXMgbGF5ZXIuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkTGF5ZXI6IGZ1bmN0aW9uKGxheWVyLCBiZWZvcmUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRMYXllcihsYXllciwgYmVmb3JlKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBmcm9tIHRoZSBtYXAuIEFueSBsYXllcnMgd2hpY2ggcmVmZXIgdG8gdGhlXG4gICAgICogc3BlY2lmaWVkIGxheWVyIHZpYSBhIGByZWZgIHByb3BlcnR5IGFyZSBhbHNvIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgbGF5ZXIgaWRcbiAgICAgKiBAZmlyZXMgbGF5ZXIucmVtb3ZlXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHJlbW92ZUxheWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZmlsdGVyIGZvciBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXIgZmlsdGVyIHNwZWNpZmljYXRpb24sIGFzIGRlZmluZWQgaW4gdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNmaWx0ZXIpXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbihsYXllciwgZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmlsdGVyKGxheWVyLCBmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB6b29tIGV4dGVudCBmb3IgYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluem9vbSBtaW5pbXVtIHpvb20gZXh0ZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heHpvb20gbWF4aW11bSB6b29tIGV4dGVudFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlOiBmdW5jdGlvbihsYXllcklkLCBtaW56b29tLCBtYXh6b29tKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpbHRlciBmb3IgYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHJldHVybnMge0FycmF5fSBmaWx0ZXIgc3BlY2lmaWNhdGlvbiwgYXMgZGVmaW5lZCBpbiB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2ZpbHRlcilcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIGEgcGFpbnQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIGZvciB0aGUgcGFpbnQgcHJvcGVyeTsgbXVzdCBoYXZlIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHkgYXMgZGVmaW5lZCBpbiB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0ga2xhc3Mgb3B0aW9uYWwgY2xhc3Mgc3BlY2lmaWVyIGZvciB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwgdmFsdWUsIGtsYXNzKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllciwgbmFtZSwgdmFsdWUsIGtsYXNzKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgcGFpbnQgcHJvcGVydHkgaW4gYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBhIHBhaW50IHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBrbGFzcyBvcHRpb25hbCBjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB2YWx1ZSBmb3IgdGhlIHBhaW50IHByb3BlcnlcbiAgICAgKi9cbiAgICBnZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwga2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0UGFpbnRQcm9wZXJ0eShsYXllciwgbmFtZSwga2xhc3MpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIGEgZ2l2ZW4gc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgSUQgb2YgYSBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgYSBsYXlvdXQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIGZvciB0aGUgbGF5b3V0IHByb3Blcnk7IG11c3QgaGF2ZSB0aGUgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLylcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBsYXlvdXQgcHJvcGVydHkgaW4gYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBhIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0ga2xhc3Mgb3B0aW9uYWwgY2xhc3Mgc3BlY2lmaWVyIGZvciB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyB7Kn0gdmFsdWUgZm9yIHRoZSBsYXlvdXQgcHJvcGVyeVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgTWFwJ3MgY29udGFpbmVyIGFzIGFuIEhUTUwgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb250YWluZXIgZm9yIHRoZSBtYXAgYGNhbnZhc2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGFkZCBub24tR0wgb3ZlcmxheXMgdG8gdGhlIG1hcCwgeW91IHNob3VsZCBhcHBlbmQgdGhlbSB0byB0aGlzIGVsZW1lbnQuIFRoaXNcbiAgICAgKiBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgc3VjaCBhcyBwYW5uaW5nIGFuZCB6b29taW5nIGFyZVxuICAgICAqIGF0dGFjaGVkLiBJdCB3aWxsIHJlY2VpdmUgYnViYmxlZCBldmVudHMgZm9yIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYXMgdGhlIGBjYW52YXNgLCBidXQgbm90IGZvclxuICAgICAqIG1hcCBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q2FudmFzQ29udGFpbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBNYXAncyBjYW52YXMgYXMgYW4gSFRNTCBjYW52YXNcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGNhbnZhc1xuICAgICAqL1xuICAgIGdldENhbnZhczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXMuZ2V0RWxlbWVudCgpO1xuICAgIH0sXG5cbiAgICBfc2V0dXBDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIgPSB0eXBlb2YgaWQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIDogaWQ7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXAnKTtcblxuICAgICAgICB2YXIgY2FudmFzQ29udGFpbmVyID0gdGhpcy5fY2FudmFzQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbnZhcy1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtaW50ZXJhY3RpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYW52YXMgPSBuZXcgQ2FudmFzKHRoaXMsIGNhbnZhc0NvbnRhaW5lcik7XG5cbiAgICAgICAgdmFyIGNvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICB2YXIgY29ybmVycyA9IHRoaXMuX2NvbnRyb2xDb3JuZXJzID0ge307XG4gICAgICAgIFsndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddLmZvckVhY2goZnVuY3Rpb24gKHBvcykge1xuICAgICAgICAgICAgY29ybmVyc1twb3NdID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwtJyArIHBvcywgY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfc2V0dXBQYWludGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5fY2FudmFzLmdldFdlYkdMQ29udGV4dCh7XG4gICAgICAgICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiB0aGlzLm9wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5vcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWludGVyID0gbmV3IFBhaW50ZXIoZ2wsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9LFxuXG4gICAgX2NvbnRleHRMb3N0OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgYnJvd3Nlci5jYW5jZWxGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfY29udGV4dFJlc3RvcmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIHRoaXMgbWFwIGZ1bGx5IGxvYWRlZD8gSWYgdGhlIHN0eWxlIGlzbid0IGxvYWRlZFxuICAgICAqIG9yIGl0IGhhcyBhIGNoYW5nZSB0byB0aGUgc291cmNlcyBvciBzdHlsZSB0aGF0IGlzbid0XG4gICAgICogcHJvcGFnYXRlZCB0byBpdHMgc3R5bGUsIHJldHVybiBmYWxzZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBtYXAgaXMgbG9hZGVkXG4gICAgICovXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fc291cmNlc0RpcnR5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5zdHlsZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIG1hcCdzIHN0eWxlIGFuZCByZS1yZW5kZXIgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVTdHlsZSBuZXcgc3R5bGVcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbih1cGRhdGVTdHlsZSkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0aGlzLl9zdHlsZURpcnR5IHx8IHVwZGF0ZVN0eWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3JlcmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGwgd2hlbiBhIChyZS0pcmVuZGVyIG9mIHRoZSBtYXAgaXMgcmVxdWlyZWQsIGUuZy4gd2hlbiB0aGVcbiAgICAgKiB1c2VyIHBhbm5lZCBvciB6b29tZWQsZiBvciBuZXcgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3N0eWxlRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlY2FsY3VsYXRlKHRoaXMudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5ICYmICF0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eVRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCA1MCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgICAgICB2ZXJ0aWNlczogdGhpcy52ZXJ0aWNlcyxcbiAgICAgICAgICAgIHJvdGF0aW5nOiB0aGlzLnJvdGF0aW5nLFxuICAgICAgICAgICAgem9vbWluZzogdGhpcy56b29taW5nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlyZSgncmVuZGVyJyk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9hZGVkKCkgJiYgIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGlvbkxvb3Auc3RvcHBlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VzRGlydHkgfHwgdGhpcy5fcmVwYWludCB8fCAhdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVyZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgbWFwJ3MgdW5kZXJseWluZyByZXNvdXJjZXMsIGluY2x1ZGluZyB3ZWIgd29ya2Vycy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2gpIHRoaXMuX2hhc2gucmVtb3ZlKCk7XG4gICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yZXJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gYnJvd3Nlci5mcmFtZSh0aGlzLnJlbmRlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTdHlsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnc3R5bGUuJyArIGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTb3VyY2VFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLmZpcmUoZS50eXBlLCB1dGlsLmV4dGVuZCh7c3R5bGU6IGUudGFyZ2V0fSwgZSkpO1xuICAgIH0sXG5cbiAgICBfZm9yd2FyZExheWVyRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRUaWxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX29uU3R5bGVMb2FkOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywge3RyYW5zaXRpb246IGZhbHNlfSk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KGUpO1xuICAgIH0sXG5cbiAgICBfb25TdHlsZUNoYW5nZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQoZSk7XG4gICAgfSxcblxuICAgIF9vblNvdXJjZUFkZDogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgc291cmNlID0gZS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2Uub25BZGQpXG4gICAgICAgICAgICBzb3VyY2Uub25BZGQodGhpcyk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudChlKTtcbiAgICB9LFxuXG4gICAgX29uU291cmNlUmVtb3ZlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBlLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZS5vblJlbW92ZSlcbiAgICAgICAgICAgIHNvdXJjZS5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KGUpO1xuICAgIH0sXG5cbiAgICBfb25Tb3VyY2VVcGRhdGU6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KGUpO1xuICAgIH1cbn0pO1xuXG51dGlsLmV4dGVuZEFsbChNYXAucHJvdG90eXBlLCAvKiogQGxlbmRzIE1hcC5wcm90b3R5cGUgKi97XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgZGVidWdnaW5nIG1vZGVcbiAgICAgKlxuICAgICAqIEBuYW1lIGRlYnVnXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgX2RlYnVnOiBmYWxzZSxcbiAgICBnZXQgZGVidWcoKSB7IHJldHVybiB0aGlzLl9kZWJ1ZzsgfSxcbiAgICBzZXQgZGVidWcodmFsdWUpIHsgdGhpcy5fZGVidWcgPSB2YWx1ZTsgdGhpcy51cGRhdGUoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFNob3cgY29sbGlzaW9uIGJveGVzOiB1c2VmdWwgZm9yIGRlYnVnZ2luZyBsYWJlbCBwbGFjZW1lbnRcbiAgICAgKiBpbiBzdHlsZXMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb2xsaXNpb25EZWJ1Z1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIF9jb2xsaXNpb25EZWJ1ZzogZmFsc2UsXG4gICAgZ2V0IGNvbGxpc2lvbkRlYnVnKCkgeyByZXR1cm4gdGhpcy5fY29sbGlzaW9uRGVidWc7IH0sXG4gICAgc2V0IGNvbGxpc2lvbkRlYnVnKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbGxpc2lvbkRlYnVnID0gdmFsdWU7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5zdHlsZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNvdXJjZXNbaV0ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnRpbnVvdXMgcmVwYWludCB0byBhbmFseXplIHBlcmZvcm1hbmNlXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXBhaW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgX3JlcGFpbnQ6IGZhbHNlLFxuICAgIGdldCByZXBhaW50KCkgeyByZXR1cm4gdGhpcy5fcmVwYWludDsgfSxcbiAgICBzZXQgcmVwYWludCh2YWx1ZSkgeyB0aGlzLl9yZXBhaW50ID0gdmFsdWU7IHRoaXMudXBkYXRlKCk7IH0sXG5cbiAgICAvLyBzaG93IHZlcnRpY2VzXG4gICAgX3ZlcnRpY2VzOiBmYWxzZSxcbiAgICBnZXQgdmVydGljZXMoKSB7IHJldHVybiB0aGlzLl92ZXJ0aWNlczsgfSxcbiAgICBzZXQgdmVydGljZXModmFsdWUpIHsgdGhpcy5fdmVydGljZXMgPSB2YWx1ZTsgdGhpcy51cGRhdGUoKTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9wdXA7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcG9wdXAgY29tcG9uZW50XG4gKiBAY2xhc3MgUG9wdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2xvc2VCdXR0b25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5jbG9zZU9uQ2xpY2tcbiAqIEBleGFtcGxlXG4gKiB2YXIgdG9vbHRpcCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gKiAgIC5zZXRMYXRMbmcobWFwLnVucHJvamVjdChlLnBvaW50KSlcbiAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgLmFkZFRvKG1hcCk7XG4gKi9cbmZ1bmN0aW9uIFBvcHVwKG9wdGlvbnMpIHtcbiAgICB1dGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgJ191cGRhdGVQb3NpdGlvbicsXG4gICAgICAgICdfb25DbGlja0Nsb3NlJ10sXG4gICAgICAgIHRoaXMpO1xufVxuXG5Qb3B1cC5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoRXZlbnRlZCwgLyoqIEBsZW5kcyBQb3B1cC5wcm90b3R5cGUgKi97XG4gICAgb3B0aW9uczoge1xuICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkNsaWNrOiB0cnVlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBwb3B1cCB0byBhIG1hcFxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXBcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGVQb3NpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHBvcHVwIGZyb20gdGhlIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCkuYWRkVG8obWFwKTtcbiAgICAgKiBwb3B1cC5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29vcmRpbmF0ZXMgb2YgcG9wdXAgZWxlbWVudCByZWxhdGl2ZSB0byBtYXBcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfVxuICAgICAqL1xuICAgIGdldExhdExuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRMbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb3B1cCBlbGVtZW50IHRvIGEgbWFwXG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZ1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TGF0TG5nOiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgdGhpcy5fbGF0TG5nID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIHRleHQgb25seSBjb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIEhUTUwgY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRIVE1MOiBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5JyksIGNoaWxkO1xuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHRlbXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cCcsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpcCAgICAgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtdGlwJywgICAgIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgdGhpcy5fd3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29udGVudCB8fCAhdGhpcy5fY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5fd3JhcHBlcjtcblxuICAgICAgICB3aGlsZSAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVBvc2l0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRMbmcgfHwgIXRoaXMuX2NvbnRhaW5lcikgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbGF0TG5nKS5yb3VuZCgpLFxuICAgICAgICAgICAgYW5jaG9yID0gdGhpcy5vcHRpb25zLmFuY2hvcjtcblxuICAgICAgICBpZiAoIWFuY2hvcikge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChwb3MueSA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFsndG9wJ107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcy55ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQgLSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBbJ2JvdHRvbSddO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcy54IDwgd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnB1c2goJ2xlZnQnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zLnggPiB0aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbmNob3IubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvci5qb2luKCctJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbmNob3IgPSBhbmNob3I7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYW5jaG9yVHJhbnNsYXRlID0ge1xuICAgICAgICAgICAgJ3RvcCc6ICd0cmFuc2xhdGUoLTUwJSwwKScsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiAndHJhbnNsYXRlKDAsMCknLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsMCknLFxuICAgICAgICAgICAgJ2JvdHRvbSc6ICd0cmFuc2xhdGUoLTUwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogJ3RyYW5zbGF0ZSgwLC0xMDAlKScsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2xlZnQnOiAndHJhbnNsYXRlKDAsLTUwJSknLFxuICAgICAgICAgICAgJ3JpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtNTAlKSdcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY2xhc3NMaXN0ID0gdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGFuY2hvclRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtcG9wdXAtYW5jaG9yLScgKyBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXBvcHVwLWFuY2hvci0nICsgYW5jaG9yKTtcblxuICAgICAgICBET00uc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lciwgYW5jaG9yVHJhbnNsYXRlW2FuY2hvcl0gKyAnIHRyYW5zbGF0ZSgnICsgcG9zLnggKyAncHgsJyArIHBvcy55ICsgJ3B4KScpO1xuICAgIH0sXG5cbiAgICBfb25DbGlja0Nsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBBY3RvcjtcblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FjdG9yIGRlc2lnbiBwYXR0ZXJuXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FjdG9yX21vZGVsKVxuICogdGhhdCBtYWludGFpbnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFzeW5jaHJvbm91cyB0YXNrcyBhbmQgdGhlIG9iamVjdHNcbiAqIHRoYXQgc3BpbiB0aGVtIG9mZiAtIGluIHRoaXMgY2FzZSwgdGFza3MgbGlrZSBwYXJzaW5nIHBhcnRzIG9mIHN0eWxlcyxcbiAqIG93bmVkIGJ5IHRoZSBzdHlsZXNcbiAqXG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gdGFyZ2V0XG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gcGFyZW50XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBBY3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge307XG4gICAgdGhpcy5jYWxsYmFja0lEID0gMDtcbiAgICB0aGlzLnJlY2VpdmUgPSB0aGlzLnJlY2VpdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG59XG5cbkFjdG9yLnByb3RvdHlwZS5yZWNlaXZlID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICAgIHZhciBkYXRhID0gbWVzc2FnZS5kYXRhLFxuICAgICAgICBjYWxsYmFjaztcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICc8cmVzcG9uc2U+Jykge1xuICAgICAgICBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZGF0YS5pZF07XG4gICAgICAgIGNhbGxiYWNrKGRhdGEuZXJyb3IgfHwgbnVsbCwgZGF0YS5kYXRhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgaWQgPSBkYXRhLmlkO1xuICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuZGF0YSwgZnVuY3Rpb24oZXJyLCBkYXRhLCBidWZmZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnPHJlc3BvbnNlPicsXG4gICAgICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA/IFN0cmluZyhlcnIpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICB9LCBidWZmZXJzKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuZGF0YSk7XG4gICAgfVxufTtcblxuQWN0b3IucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbih0eXBlLCBkYXRhLCBjYWxsYmFjaywgYnVmZmVycykge1xuICAgIHZhciBpZCA9IG51bGw7XG4gICAgaWYgKGNhbGxiYWNrKSB0aGlzLmNhbGxiYWNrc1tpZCA9IHRoaXMuY2FsbGJhY2tJRCsrXSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoeyB0eXBlOiB0eXBlLCBpZDogU3RyaW5nKGlkKSwgZGF0YTogZGF0YSB9LCBidWZmZXJzKTtcbn07XG5cbi8qKlxuICogV3JhcHBlZCBwb3N0TWVzc2FnZSBBUEkgdGhhdCBhYnN0cmFjdHMgYXJvdW5kIElFJ3MgbGFjayBvZlxuICogYHRyYW5zZmVyTGlzdGAgc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZmVyTGlzdFxuICogQHByaXZhdGVcbiAqL1xuQWN0b3IucHJvdG90eXBlLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSwgdHJhbnNmZXJMaXN0KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJMaXN0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpOyAvLyBObyBzdXBwb3J0IGZvciB0cmFuc2Zlckxpc3Qgb24gSUVcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmdldEpTT04gPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBjYWxsYmFjayhlKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgJiYgeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgICByZXR1cm4geGhyO1xufTtcblxuZXhwb3J0cy5nZXRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH07XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCAmJiB4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHhoci5yZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgICByZXR1cm4geGhyO1xufTtcblxuZnVuY3Rpb24gc2FtZU9yaWdpbih1cmwpIHtcbiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGEucHJvdG9jb2wgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbn1cblxuZXhwb3J0cy5nZXRJbWFnZSA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaWYgKCFzYW1lT3JpZ2luKHVybCkpIHtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgfVxuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgaW1nKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSB1cmw7XG4gICAgaW1nLmdldERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KS5kYXRhO1xuICAgIH07XG4gICAgcmV0dXJuIGltZztcbn07XG5cbmV4cG9ydHMuZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzLCBjYWxsYmFjaykge1xuICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ub25sb2Fkc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdmlkZW8pO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICB2aWRlby5nZXREYXRhID0gZnVuY3Rpb24oKSB7IHJldHVybiB2aWRlbzsgfTtcbiAgICByZXR1cm4gdmlkZW87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FudmFzID0gcmVxdWlyZSgnLi9jYW52YXMnKTtcblxudmFyIGZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5leHBvcnRzLmZyYW1lID0gZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gZnJhbWUoZm4pO1xufTtcblxudmFyIGNhbmNlbCA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc0NhbmNlbEFuaW1hdGlvbkZyYW1lO1xuXG5leHBvcnRzLmNhbmNlbEZyYW1lID0gZnVuY3Rpb24oaWQpIHtcbiAgICBjYW5jZWwoaWQpO1xufTtcblxuZXhwb3J0cy50aW1lZCA9IGZ1bmN0aW9uIChmbiwgZHVyLCBjdHgpIHtcbiAgICBpZiAoIWR1cikge1xuICAgICAgICBmbi5jYWxsKGN0eCwgMSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBhYm9ydCA9IGZhbHNlLFxuICAgICAgICBzdGFydCA9IHdpbmRvdy5wZXJmb3JtYW5jZSA/IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSA6IERhdGUubm93KCk7XG5cbiAgICBmdW5jdGlvbiB0aWNrKG5vdykge1xuICAgICAgICBpZiAoYWJvcnQpIHJldHVybjtcbiAgICAgICAgaWYgKCF3aW5kb3cucGVyZm9ybWFuY2UpIG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgaWYgKG5vdyA+PSBzdGFydCArIGR1cikge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIChub3cgLSBzdGFydCkgLyBkdXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5mcmFtZSh0aWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4cG9ydHMuZnJhbWUodGljayk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IGFib3J0ID0gdHJ1ZTsgfTtcbn07XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBiYXNpYyBKYXZhU2NyaXB0IGFuZCBET00gZmVhdHVyZXMgcmVxdWlyZWQgZm9yIE1hcGJveCBHTCBhcmUgcHJlc2VudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIElmIGB0cnVlYCwgbWFwIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZGV0ZXJtaW5lcyB0aGF0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY3JlYXRlZCBXZWJHTCBjb250ZXh0IHdvdWxkIGJlIGRyYW1hdGljYWxseSBsb3dlciB0aGFuIGV4cGVjdGVkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIE1hcGJveCBHTCBzaG91bGQgYmUgZXhwZWN0ZWQgdG8gd29yaywgYW5kIGZhbHNlIGlmIG5vdC5cbiAqIEBtZW1iZXJvZiBtYXBib3hnbFxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLnN1cHBvcnRlZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblxuICAgIHZhciBzdXBwb3J0cyA9IFtcblxuICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnOyB9LFxuXG4gICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJzsgfSxcblxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gISEoQXJyYXkucHJvdG90eXBlICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUubWFwICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISEoRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSAmJlxuICAgICAgICAgICAgICAgICEhKE9iamVjdC5rZXlzICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5jcmVhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5pc1NlYWxlZCAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuaXNGcm96ZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2VhbCAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTT04nIGluIHdpbmRvdyAmJiAncGFyc2UnIGluIEpTT04gJiYgJ3N0cmluZ2lmeScgaW4gSlNPTjtcbiAgICAgICAgfSxcblxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FudmFzKCkuc3VwcG9ydHNXZWJHTENvbnRleHQoKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB8fCBmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiAnV29ya2VyJyBpbiB3aW5kb3c7IH1cbiAgICBdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXN1cHBvcnRzW2ldKCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3kgPSBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA4O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2RldmljZVBpeGVsUmF0aW8nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzO1xuXG5mdW5jdGlvbiBDYW52YXMocGFyZW50LCBjb250YWluZXIpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgaWYgKHBhcmVudCAmJiBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmNhbnZhcy5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jYW52YXMnKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0bG9zdCcsIHBhcmVudC5fY29udGV4dExvc3QuYmluZChwYXJlbnQpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgcGFyZW50Ll9jb250ZXh0UmVzdG9yZWQuYmluZChwYXJlbnQpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcbiAgICB9XG59XG5cbkNhbnZhcy5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgIC8vIFJlcXVlc3QgdGhlIHJlcXVpcmVkIGNhbnZhcyBzaXplIHRha2luZyB0aGUgcGl4ZWxyYXRpbyBpbnRvIGFjY291bnQuXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBwaXhlbFJhdGlvICogd2lkdGg7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gcGl4ZWxSYXRpbyAqIGhlaWdodDtcblxuICAgIC8vIE1haW50YWluIHRoZSBzYW1lIGNhbnZhcyBzaXplLCBwb3RlbnRpYWxseSBkb3duc2NhbGluZyBpdCBmb3IgSGlEUEkgZGlzcGxheXNcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xufTtcblxudmFyIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiBmYWxzZVxufTtcblxuQ2FudmFzLnByb3RvdHlwZS5nZXRXZWJHTENvbnRleHQgPSBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG4gICAgYXR0cmlidXRlcyA9IHV0aWwuZXh0ZW5kKHt9LCBhdHRyaWJ1dGVzLCByZXF1aXJlZENvbnRleHRBdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgIHRoaXMuY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xufTtcblxuQ2FudmFzLnByb3RvdHlwZS5zdXBwb3J0c1dlYkdMQ29udGV4dCA9IGZ1bmN0aW9uKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdFxuICAgIH0sIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKCdwcm9iYWJseVN1cHBvcnRzQ29udGV4dCcgaW4gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmICgnc3VwcG9ydHNDb250ZXh0JyBpbiB0aGlzLmNhbnZhcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMuc3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiAhIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiYgISF0aGlzLmdldFdlYkdMQ29udGV4dChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KTtcbn07XG5cbkNhbnZhcy5wcm90b3R5cGUuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBY3RvciA9IHJlcXVpcmUoJy4uL2FjdG9yJyk7XG52YXIgV2ViV29ya2lmeSA9IHJlcXVpcmUoJ3dlYndvcmtpZnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyO1xuXG5mdW5jdGlvbiBEaXNwYXRjaGVyKGxlbmd0aCwgcGFyZW50KSB7XG4gICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRBY3RvciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdlYldvcmtpZnkocmVxdWlyZSgnLi4vLi4vc291cmNlL3dvcmtlcicpKTtcbiAgICAgICAgdmFyIGFjdG9yID0gbmV3IEFjdG9yKHdvcmtlciwgcGFyZW50KTtcbiAgICAgICAgYWN0b3IubmFtZSA9IFwiV29ya2VyIFwiICsgaTtcbiAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgfVxufVxuXG5EaXNwYXRjaGVyLnByb3RvdHlwZSA9IHtcbiAgICBicm9hZGNhc3Q6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hY3RvcnNbaV0uc2VuZCh0eXBlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBjYWxsYmFjaywgdGFyZ2V0SUQsIGJ1ZmZlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJRCAhPT0gJ251bWJlcicgfHwgaXNOYU4odGFyZ2V0SUQpKSB7XG4gICAgICAgICAgICAvLyBVc2Ugcm91bmQgcm9iaW4gdG8gc2VuZCByZXF1ZXN0cyB0byB3ZWIgd29ya2Vycy5cbiAgICAgICAgICAgIHRhcmdldElEID0gdGhpcy5jdXJyZW50QWN0b3IgPSAodGhpcy5jdXJyZW50QWN0b3IgKyAxKSAlIHRoaXMuYWN0b3JzLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0b3JzW3RhcmdldElEXS5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBidWZmZXJzKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldElEO1xuICAgIH0sXG5cbiAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFjdG9yc1tpXS50YXJnZXQudGVybWluYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBjbGFzc05hbWUsIGNvbnRhaW5lcikge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgaWYgKGNsYXNzTmFtZSkgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgcmV0dXJuIGVsO1xufTtcblxudmFyIGRvY1N0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG5mdW5jdGlvbiB0ZXN0UHJvcChwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHByb3BzW2ldIGluIGRvY1N0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbaV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzZWxlY3RQcm9wID0gdGVzdFByb3AoWyd1c2VyU2VsZWN0JywgJ01velVzZXJTZWxlY3QnLCAnV2Via2l0VXNlclNlbGVjdCcsICdtc1VzZXJTZWxlY3QnXSksXG4gICAgdXNlclNlbGVjdDtcbmV4cG9ydHMuZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdFByb3ApIHtcbiAgICAgICAgdXNlclNlbGVjdCA9IGRvY1N0eWxlW3NlbGVjdFByb3BdO1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9ICdub25lJztcbiAgICB9XG59O1xuZXhwb3J0cy5lbmFibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3RQcm9wKSB7XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gdXNlclNlbGVjdDtcbiAgICB9XG59O1xuXG52YXIgdHJhbnNmb3JtUHJvcCA9IHRlc3RQcm9wKFsndHJhbnNmb3JtJywgJ1dlYmtpdFRyYW5zZm9ybSddKTtcbmV4cG9ydHMuc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgZWwuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSB2YWx1ZTtcbn07XG5cbi8vIFN1cHByZXNzIHRoZSBuZXh0IGNsaWNrLCBidXQgb25seSBpZiBpdCdzIGltbWVkaWF0ZS5cbmZ1bmN0aW9uIHN1cHByZXNzQ2xpY2soZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xufVxuZXhwb3J0cy5zdXBwcmVzc0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIH0sIDApO1xufTtcblxuZXhwb3J0cy5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlbCwgZSkge1xuICAgIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZSA9IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG4gICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gZWwuY2xpZW50TGVmdCxcbiAgICAgICAgZS5jbGllbnRZIC0gcmVjdC50b3AgLSBlbC5jbGllbnRUb3ApO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgSFRUUF9VUkw6ICdodHRwOi8vYS50aWxlcy5tYXBib3guY29tJyxcbiAgICBIVFRQU19VUkw6ICdodHRwczovL2EudGlsZXMubWFwYm94LmNvbScsXG4gICAgRk9SQ0VfSFRUUFM6IHRydWUsXG4gICAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IHRydWVcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogTWV0aG9kcyBtaXhlZCBpbiB0byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKiBAbWl4aW4gRXZlbnRlZFxuICovXG52YXIgRXZlbnRlZCA9IHtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBhIHNwZWNpZmllZCBldmVudCB3aXRoIGEgbGlzdGVuZXIgZnVuY3Rpb24gdGhlIGxhdHRlciBnZXRzIHRoZSBkYXRhIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gYGZpcmVgIGFuZCBhZGRpdGlvbmFsbHkgYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKHR5cGUsIGZuKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gdGhpcy5fZXZlbnRzW3R5cGVdIHx8IFtdO1xuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChmbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGV2ZW50IGxpc3RlbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGVdIEV2ZW50IHR5cGUuIElmIG5vbmUgaXMgc3BlY2lmaWVkLCByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtsaXN0ZW5lcl0gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLiBJZiBub25lIGlzIHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGFyZSByZW1vdmVkXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbih0eXBlLCBmbikge1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBsaXN0ZW5lcnMgaWYgbm8gYXJndW1lbnRzIHNwZWNpZmllZFxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbnModHlwZSkpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5pbmRleE9mKGZuKTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBmdW5jdGlvbiBvbmNlIHdoZW4gYW4gZXZlbnQgaGFzIGZpcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24odHlwZSwgZm4pIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9mZih0eXBlLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbih0eXBlLCB3cmFwcGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpcmUgZXZlbnQgb2YgYSBnaXZlbiBzdHJpbmcgdHlwZSB3aXRoIHRoZSBnaXZlbiBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gT3B0aW9uYWwgZGF0YSBwYXNzZWQgZG93biB0byB0aGUgZXZlbnQgb2JqZWN0XG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgZmlyZTogZnVuY3Rpb24odHlwZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVucyh0eXBlKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgICAgdXRpbC5leHRlbmQoZGF0YSwge3R5cGU6IHR5cGUsIHRhcmdldDogdGhpc30pO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcvcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgaW5maW5pdGUgbG9vcFxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGV2ZW50IGlzIHJlZ2lzdGVyZWQgdG8gYSB0eXBlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIGV2ZW50cyBvZiB0eXBlIGB0eXBlYFxuICAgICAqL1xuICAgIGxpc3RlbnM6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbdHlwZV0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRlZDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaHM7XG5cbmZ1bmN0aW9uIEdseXBocyhwYmYsIGVuZCkge1xuICAgIHRoaXMuc3RhY2tzID0gcGJmLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsIFtdLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrcyh0YWcsIHN0YWNrcywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkge1xuICAgICAgICB2YXIgZm9udHN0YWNrID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIHtnbHlwaHM6IHt9fSk7XG4gICAgICAgIHN0YWNrcy5wdXNoKGZvbnRzdGFjayk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZywgZm9udHN0YWNrLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSBmb250c3RhY2submFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBmb250c3RhY2sucmFuZ2UgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgZ2x5cGggPSBwYmYucmVhZE1lc3NhZ2UocmVhZEdseXBoLCB7fSk7XG4gICAgICAgIGZvbnRzdGFjay5nbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnLCBnbHlwaCwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkgZ2x5cGguaWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgZ2x5cGguYml0bWFwID0gcGJmLnJlYWRCeXRlcygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgZ2x5cGgud2lkdGggPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgZ2x5cGguaGVpZ2h0ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGdseXBoLmxlZnQgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDYpIGdseXBoLnRvcCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNykgZ2x5cGguYWR2YW5jZSA9IHBiZi5yZWFkVmFyaW50KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJwb2xhdGU7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKGEsIGIsIHQpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmludGVycG9sYXRlLm51bWJlciA9IGludGVycG9sYXRlO1xuXG5pbnRlcnBvbGF0ZS52ZWMyID0gZnVuY3Rpb24oZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzBdLCB0b1swXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMV0sIHRvWzFdLCB0KVxuICAgIF07XG59O1xuXG4vKlxuICogSW50ZXJwb2xhdGUgYmV0d2VlbiB0d28gY29sb3JzIGdpdmVuIGFzIDQtZWxlbWVudCBhcnJheXMuXG4gKlxuICogQHBhcmFtIHtDb2xvcn0gZnJvbVxuICogQHBhcmFtIHtDb2xvcn0gdG9cbiAqIEBwYXJhbSB7bnVtYmVyfSB0IGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gMCBhbmQgMVxuICogQHJldHVybnMge0NvbG9yfSBpbnRlcnBvbGF0ZWQgY29sb3JcbiAqL1xuaW50ZXJwb2xhdGUuY29sb3IgPSBmdW5jdGlvbihmcm9tLCB0bywgdCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMF0sIHRvWzBdLCB0KSxcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVsxXSwgdG9bMV0sIHQpLFxuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzJdLCB0b1syXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bM10sIHRvWzNdLCB0KVxuICAgIF07XG59O1xuXG5pbnRlcnBvbGF0ZS5hcnJheSA9IGZ1bmN0aW9uKGZyb20sIHRvLCB0KSB7XG4gICAgcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGQsIHRvW2ldLCB0KTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuL2Jyb3dzZXInKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplVVJMKHVybCwgcGF0aFByZWZpeCwgYWNjZXNzVG9rZW4pIHtcbiAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuICYmIGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBHTC4gJyArXG4gICAgICAgICAgICAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnMnKTtcbiAgICB9XG5cbiAgICB2YXIgaHR0cHMgPSBjb25maWcuRk9SQ0VfSFRUUFMgfHxcbiAgICAgICAgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonKTtcblxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9ebWFwYm94OlxcL1xcLy8sIChodHRwcyA/IGNvbmZpZy5IVFRQU19VUkwgOiBjb25maWcuSFRUUF9VUkwpICsgcGF0aFByZWZpeCk7XG4gICAgdXJsICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gJyZhY2Nlc3NfdG9rZW49JyA6ICc/YWNjZXNzX3Rva2VuPSc7XG5cbiAgICBpZiAoY29uZmlnLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL3d3dy5tYXBib3guY29tL2RldmVsb3BlcnMvYXBpLyNhY2Nlc3MtdG9rZW5zJyk7XG4gICAgICAgIH1cblxuICAgICAgICB1cmwgKz0gYWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbn1cblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkwgPSBmdW5jdGlvbih1cmwsIGFjY2Vzc1Rva2VuKSB7XG4gICAgdmFyIHVzZXIgPSB1cmwubWF0Y2goL15tYXBib3g6XFwvXFwvKFteLl0rKS8pO1xuICAgIGlmICghdXNlcilcbiAgICAgICAgcmV0dXJuIHVybDtcblxuICAgIHJldHVybiBub3JtYWxpemVVUkwodXJsLCAnL3N0eWxlcy92MS8nICsgdXNlclsxXSArICcvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgdXJsID0gbm9ybWFsaXplVVJMKHVybCArICcuanNvbicsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xuXG4gICAgLy8gVGlsZUpTT04gcmVxdWVzdHMgbmVlZCBhIHNlY3VyZSBmbGFnIGFwcGVuZGVkIHRvIHRoZWlyIFVSTHMgc29cbiAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICBpZiAodXJsLmluZGV4T2YoJ2h0dHBzJykgPT09IDApXG4gICAgICAgIHVybCArPSAnJnNlY3VyZSc7XG5cbiAgICByZXR1cm4gdXJsO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplR2x5cGhzVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVSTCh1cmwsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTCA9IGZ1bmN0aW9uKHVybCwgc291cmNlVXJsKSB7XG4gICAgaWYgKCFzb3VyY2VVcmwgfHwgIXNvdXJjZVVybC5tYXRjaCgvXm1hcGJveDpcXC9cXC8vKSlcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1xcLigoPzpwbmd8anBnKVxcZCopKD89JHxcXD8pLywgYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID49IDIgPyAnQDJ4LiQxJyA6ICcuJDEnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBbbW9zdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlbW92ZSBjYWxsYmFjayBjYWxsZWQgd2l0aCBpdGVtcyB3aGVuIHRoZXkgZXhwaXJlXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IE1SVUNhY2hlO1xuZnVuY3Rpb24gTVJVQ2FjaGUobWF4LCBvblJlbW92ZSkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIGNhY2hlXG4gKlxuICogQHJldHVybnMge01SVUNhY2hlfSB0aGlzIGNhY2hlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgIHRoaXMub25SZW1vdmUodGhpcy5saXN0W2tleV0pO1xuICAgIH1cblxuICAgIHRoaXMubGlzdCA9IHt9O1xuICAgIHRoaXMub3JkZXIgPSBbXTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYSBrZXksIHZhbHVlIGNvbWJpbmF0aW9uIHRvIHRoZSBjYWNoZSwgdHJpbW1pbmcgaXRzIHNpemUgaWYgdGhpcyBwdXNoZXNcbiAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gKiBAcGFyYW0geyp9IGRhdGEgYW55IHZhbHVlXG4gKlxuICogQHJldHVybnMge01SVUNhY2hlfSB0aGlzIGNhY2hlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XG4gICAgdGhpcy5saXN0W2tleV0gPSBkYXRhO1xuICAgIHRoaXMub3JkZXIucHVzaChrZXkpO1xuXG4gICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgdmFyIHJlbW92ZWREYXRhID0gdGhpcy5nZXQodGhpcy5vcmRlclswXSk7XG4gICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBga2V5YCBpcyBwcmVzZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IHRvIGJlIGxvb2tlZC11cFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGNhY2hlIGhhcyB0aGlzIHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGtleSBpbiB0aGlzLmxpc3Q7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIGtleXMgaW4gdGhlIGNhY2hlXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGFuIGFycmF5IG9mIGtleXMgaW4gdGhpcyBjYWNoZS5cbiAqIEBwcml2YXRlXG4gKi9cbk1SVUNhY2hlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3JkZXI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLFxuICogcmV0dXJucyBgbnVsbGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdG8gbG9vayB1cFxuICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICB2YXIgZGF0YSA9IHRoaXMubGlzdFtrZXldO1xuXG4gICAgZGVsZXRlIHRoaXMubGlzdFtrZXldO1xuICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgIHJldHVybiBkYXRhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlVG9rZW5zO1xuXG4vKipcbiAqIFJlcGxhY2UgdG9rZW5zIGluIGEgc3RyaW5nIHRlbXBsYXRlIHdpdGggdmFsdWVzIGluIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIGEga2V5L3ZhbHVlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRva2VucyBhbmQgcmVwbGFjZW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0aGUgdGVtcGxhdGUgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdGVtcGxhdGUgd2l0aCB0b2tlbnMgcmVwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUb2tlbnMocHJvcGVydGllcywgdGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soW157fSgpXFxbXFxdPD4kPTo7LixeXSspfS9nLCBmdW5jdGlvbihtYXRjaCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gcHJvcGVydGllcyA/IHByb3BlcnRpZXNba2V5XSA6ICcnO1xuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVW5pdEJlemllciA9IHJlcXVpcmUoJ3VuaXRiZXppZXInKTtcblxuLyoqXG4gKiBHaXZlbiBhIHZhbHVlIGB0YCB0aGF0IHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEsIHJldHVyblxuICogYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB0aGF0IGVhc2VzIGJldHdlZW4gMCBhbmQgMSBpbiBhIHBsZWFzaW5nXG4gKiBjdWJpYyBpbi1vdXQgZmFzaGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdCBpbnB1dFxuICogQHJldHVybnMge251bWJlcn0gaW5wdXRcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBmdW5jdGlvbiAodCkge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIHZhciB0MiA9IHQgKiB0LFxuICAgICAgICB0MyA9IHQyICogdDtcbiAgICByZXR1cm4gNCAqICh0IDwgMC41ID8gdDMgOiAzICogKHQgLSB0MikgKyB0MyAtIDAuNzUpO1xufTtcblxuLyoqXG4gKiBHaXZlbiBnaXZlbiAoeCwgeSksICh4MSwgeTEpIGNvbnRyb2wgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSxcbiAqIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgaW50ZXJwb2xhdGVzIGFsb25nIHRoYXQgY3VydmUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHAxeCBjb250cm9sIHBvaW50IDEgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcDF5IGNvbnRyb2wgcG9pbnQgMSB5IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMnggY29udHJvbCBwb2ludCAyIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHAyeSBjb250cm9sIHBvaW50IDIgeSBjb29yZGluYXRlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGludGVycG9sYXRvcjogcmVjZWl2ZXMgbnVtYmVyIHZhbHVlLCByZXR1cm5zXG4gKiBudW1iZXIgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmJlemllciA9IGZ1bmN0aW9uKHAxeCwgcDF5LCBwMngsIHAyeSkge1xuICAgIHZhciBiZXppZXIgPSBuZXcgVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBiZXppZXIuc29sdmUodCk7XG4gICAgfTtcbn07XG5cbi8qKlxuICogQSBkZWZhdWx0IGJlemllci1jdXJ2ZSBwb3dlcmVkIGVhc2luZyBmdW5jdGlvbiB3aXRoXG4gKiBjb250cm9sIHBvaW50cyAoMC4yNSwgMC4xKSBhbmQgKDAuMjUsIDEpXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IG91dHB1dFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5lYXNlID0gZXhwb3J0cy5iZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKTtcblxuLyoqXG4gKiBHaXZlbiBhIGZvdXItZWxlbWVudCBhcnJheSBvZiBudW1iZXJzIHRoYXQgcmVwcmVzZW50cyBhIGNvbG9yIGluXG4gKiBSR0JBLCByZXR1cm4gYSB2ZXJzaW9uIGZvciB3aGljaCB0aGUgUkdCIGNvbXBvbmVudHMgYXJlIG11bHRpcGxpZWRcbiAqIGJ5IHRoZSBBIChhbHBoYSkgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjIGNvbG9yIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gcHJlbXVsdGlwbGllZCBjb2xvciBhcnJheVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5wcmVtdWx0aXBseSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgY1swXSAqPSBjWzNdO1xuICAgIGNbMV0gKj0gY1szXTtcbiAgICBjWzJdICo9IGNbM107XG4gICAgcmV0dXJuIGM7XG59O1xuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSB2aWEgbWluICsgbWF4XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG4gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjbGFtcGVkIHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNsYW1wID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBuKSk7XG59O1xuXG4vKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtb2R1bGFyIGFyaXRobWV0aWNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMud3JhcCA9IGZ1bmN0aW9uIChuLCBtaW4sIG1heCkge1xuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHJldHVybiBuID09PSBtYXggPyBuIDogKChuIC0gbWluKSAlIGQgKyBkKSAlIGQgKyBtaW47XG59O1xuXG4vKlxuICogcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCBhbmQgbm9uLXVuZGVmaW5lZCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uLlxuICogQHJldHVybnMgeyp9IGFyZ3VtZW50XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNvYWxlc2NlID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaWYgKGFyZyAhPT0gbnVsbCAmJiBhcmcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxufTtcblxuLypcbiAqIENhbGwgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGFyZ3VtZW50cyxcbiAqIGNhbGxpbmcgYGNhbGxiYWNrYCBvbmNlIGFsbCBjYWxscyBjb21wbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PCo+fSBhcnJheSBpbnB1dCB0byBlYWNoIGNhbGwgb2YgdGhlIGFzeW5jIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gYW4gYXN5bmMgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgKGRhdGEsIGNhbGxiYWNrKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50c1xuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYXN5bmNFYWNoID0gZnVuY3Rpb24gKGFycmF5LCBmbiwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVtYWluaW5nID0gYXJyYXkubGVuZ3RoO1xuICAgIGlmIChyZW1haW5pbmcgPT09IDApIHJldHVybiBjYWxsYmFjaygpO1xuICAgIGZ1bmN0aW9uIGNoZWNrKCkgeyBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKCk7IH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSBmbihhcnJheVtpXSwgY2hlY2spO1xufTtcblxuLypcbiAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUga2V5cyBpbiBvbmUgb2JqZWN0IGFuZCB0aGUga2V5c1xuICogaW4gYW5vdGhlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0ga2V5cyBkaWZmZXJlbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmtleXNEaWZmZXJlbmNlID0gZnVuY3Rpb24gKG9iaiwgb3RoZXIpIHtcbiAgICB2YXIgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghKGkgaW4gb3RoZXIpKSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZmZlcmVuY2U7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZGVzdGluYXRpb24gb2JqZWN0IGFuZCBvcHRpb25hbGx5IG1hbnkgc291cmNlIG9iamVjdHMsXG4gKiBjb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBvYmplY3RzIGludG8gdGhlIGRlc3RpbmF0aW9uLlxuICogVGhlIGxhc3Qgc291cmNlIG9iamVjdCBnaXZlbiBvdmVycmlkZXMgcHJvcGVydGllcyBmcm9tIHByZXZpb3VzXG4gKiBzb3VyY2Ugb2JqZWN0cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IGRlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgc291cmNlcyBmcm9tIHdoaWNoIHByb3BlcnRpZXMgYXJlIHB1bGxlZFxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbiAoZGVzdCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzcmMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGsgaW4gc3JjKSB7XG4gICAgICAgICAgICBkZXN0W2tdID0gc3JjW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBFeHRlbmQgYSBkZXN0aW5hdGlvbiBvYmplY3Qgd2l0aCBhbGwgcHJvcGVydGllcyBvZiB0aGUgc3JjIG9iamVjdCxcbiAqIHVzaW5nIGRlZmluZVByb3BlcnR5IGluc3RlYWQgb2Ygc2ltcGxlIGFzc2lnbm1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5leHRlbmRBbGwgPSBmdW5jdGlvbiAoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIGksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBFeHRlbmQgYSBwYXJlbnQncyBwcm90b3R5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBpbiBhIHByb3BlcnRpZXNcbiAqIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmluaGVyaXQgPSBmdW5jdGlvbiAocGFyZW50LCBwcm9wcykge1xuICAgIHZhciBwYXJlbnRQcm90byA9IHR5cGVvZiBwYXJlbnQgPT09ICdmdW5jdGlvbicgPyBwYXJlbnQucHJvdG90eXBlIDogcGFyZW50LFxuICAgICAgICBwcm90byA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdG8pO1xuICAgIGV4cG9ydHMuZXh0ZW5kQWxsKHByb3RvLCBwcm9wcyk7XG4gICAgcmV0dXJuIHByb3RvO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwcm9wZXJ0aWVzIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGNob3NlblxuICogdG8gYXBwZWFyIG9uIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggbGltaXRlZCBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBmb28gPSB7IG5hbWU6ICdDaGFybGllJywgYWdlOiAxMCB9O1xuICogdmFyIGp1c3ROYW1lID0gcGljayhmb28sIFsnbmFtZSddKTtcbiAqIC8vIGp1c3ROYW1lID0geyBuYW1lOiAnQ2hhcmxpZScgfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5waWNrID0gZnVuY3Rpb24gKHNyYywgcHJvcGVydGllcykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGlkID0gMTtcblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlxdWUgbnVtZXJpYyBpZCwgc3RhcnRpbmcgYXQgMSBhbmQgaW5jcmVtZW50aW5nIHdpdGhcbiAqIGVhY2ggY2FsbC5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWUgbnVtZXJpYyBpZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMudW5pcXVlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkKys7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHZlcnNpb24gb2YgYGZuYCB0aGF0IG9ubHkgZmlyZXMgb25jZSBldmVyeSBgdGltZWAgbWlsbHNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgbWlsbHNlY29uZHMgcmVxdWlyZWQgYmV0d2VlbiBmdW5jdGlvbiBjYWxsc1xuICogQHBhcmFtIHsqfSBjb250ZXh0IHRoZSB2YWx1ZSBvZiBgdGhpc2Agd2l0aCB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy50aHJvdHRsZSA9IGZ1bmN0aW9uIChmbiwgdGltZSwgY29udGV4dCkge1xuICAgIHZhciBsb2NrLCBhcmdzLCB3cmFwcGVyRm4sIGxhdGVyO1xuXG4gICAgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHJlc2V0IGxvY2sgYW5kIGNhbGwgaWYgcXVldWVkXG4gICAgICAgIGxvY2sgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAgIHdyYXBwZXJGbi5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIGFyZ3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB3cmFwcGVyRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICAvLyBjYWxsZWQgdG9vIHNvb24sIHF1ZXVlIHRvIGNhbGwgbGF0ZXJcbiAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhbGwgYW5kIGxvY2sgdW50aWwgbGF0ZXJcbiAgICAgICAgICAgIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIGxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyRm47XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHZlcnNpb24gb2YgYGZuYCB0aGF0IGlzIG9ubHkgY2FsbGVkIGB0aW1lYCBtaWxsaXNlY29uZHNcbiAqIGFmdGVyIGl0cyBsYXN0IGludm9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gYmUgZGVib3VuY2VkXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSBtaWxsc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZuLCB0aW1lKSB7XG4gICAgdmFyIHRpbWVyLCBhcmdzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICB9LCB0aW1lKTtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMgYXMgc3RyaW5ncywgcmVwbGFjZSBhbGwgb2YgdGhlbVxuICogd2l0aCBib3VuZCB2ZXJzaW9ucyB0aGF0IHdpbGwgYWx3YXlzIHJlZmVyIHRvIGBjb250ZXh0YCBhcyBgdGhpc2AuIFRoaXNcbiAqIGlzIHVzZWZ1bCBmb3IgY2xhc3NlcyB3aGVyZSBvdGhlcndpc2UgZXZlbnQgYmluZGluZ3Mgd291bGQgcmVhc3NpZ25cbiAqIGB0aGlzYCB0byB0aGUgZXZlbnRlZCBvYmplY3Qgb3Igc29tZSBvdGhlciB2YWx1ZTogdGhpcyBsZXRzIHlvdSBlbnN1cmVcbiAqIHRoZSBgdGhpc2AgdmFsdWUgYWx3YXlzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZm5zIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IGNoYW5nZXMgZnVuY3Rpb25zIGluLXBsYWNlXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gTXlDbGFzcygpIHtcbiAqICAgYmluZEFsbChbJ29udGltZXInXSwgdGhpcyk7XG4gKiAgIHRoaXMubmFtZSA9ICdUb20nO1xuICogfVxuICogTXlDbGFzcy5wcm90b3R5cGUub250aW1lciA9IGZ1bmN0aW9uKCkge1xuICogICBhbGVydCh0aGlzLm5hbWUpO1xuICogfTtcbiAqIHZhciBteUNsYXNzID0gbmV3IE15Q2xhc3MoKTtcbiAqIHNldFRpbWVvdXQobXlDbGFzcy5vbnRpbWVyLCAxMDApO1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5iaW5kQWxsID0gZnVuY3Rpb24oZm5zLCBjb250ZXh0KSB7XG4gICAgZm5zLmZvckVhY2goZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgY29udGV4dFtmbl0gPSBjb250ZXh0W2ZuXS5iaW5kKGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0cy5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGV4dFtpXSA9PT0gJ2Z1bmN0aW9uJyAmJiBpLmluZGV4T2YoJ19vbicpID09PSAwKSB7XG4gICAgICAgICAgICBjb250ZXh0W2ldID0gY29udGV4dFtpXS5iaW5kKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgdGhlICdvcHRpb25zJyBwcm9wZXJ0eSBvbiBgb2JqYCB3aXRoIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIGBvcHRpb25zYCBhcmd1bWVudC4gUHJvcGVydGllcyBpbiB0aGUgYG9wdGlvbnNgXG4gKiBvYmplY3Qgd2lsbCBvdmVycmlkZSBleGlzdGluZyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgb2Ygb3ZlcnJpZGUgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gZGVyaXZlZCBvcHRpb25zIG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgb3B0aW9ucykge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcbiAgICAgICAgb2JqLm9wdGlvbnMgPSBvYmoub3B0aW9ucyA/IE9iamVjdC5jcmVhdGUob2JqLm9wdGlvbnMpIDoge307XG4gICAgfVxuICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgICAgICBvYmoub3B0aW9uc1tpXSA9IG9wdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBvYmoub3B0aW9ucztcbn07XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5mdW5jdGlvbiBpbmZpeChvcGVyYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiAndCcgKyBvcGVyYXRvciArIFZlY3RvclRpbGVGZWF0dXJlVHlwZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3BbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXScgKyBvcGVyYXRvciArIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHN0cmljdEluZml4KG9wZXJhdG9yKSB7XG4gICAgdmFyIG5vbnN0cmljdEluZml4ID0gaW5maXgob3BlcmF0b3IpO1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiBub25zdHJpY3RJbmZpeChfLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAndHlwZW9mKHBbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXSkgPT09IHR5cGVvZignICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJykgJiYgJyArXG4gICAgICAgICAgICAgICAgbm9uc3RyaWN0SW5maXgoXywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG52YXIgb3BlcmF0b3JzID0ge1xuICAgICc9PSc6IGluZml4KCc9PT0nKSxcbiAgICAnIT0nOiBpbmZpeCgnIT09JyksXG4gICAgJz4nOiBzdHJpY3RJbmZpeCgnPicpLFxuICAgICc8Jzogc3RyaWN0SW5maXgoJzwnKSxcbiAgICAnPD0nOiBzdHJpY3RJbmZpeCgnPD0nKSxcbiAgICAnPj0nOiBzdHJpY3RJbmZpeCgnPj0nKSxcbiAgICAnaW4nOiBmdW5jdGlvbihfLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJygnICsgb3BlcmF0b3JzWyc9PSddKF8sIGtleSwgdmFsdWUpICsgJyknO1xuICAgICAgICB9KS5qb2luKCd8fCcpIHx8ICdmYWxzZSc7XG4gICAgfSxcbiAgICAnIWluJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnISgnICsgb3BlcmF0b3JzLmluLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyAnKSc7XG4gICAgfSxcbiAgICAnYW55JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLm1hcChmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnKCcgKyBjb21waWxlKGZpbHRlcikgKyAnKSc7XG4gICAgICAgIH0pLmpvaW4oJ3x8JykgfHwgJ2ZhbHNlJztcbiAgICB9LFxuICAgICdhbGwnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkubWFwKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuICcoJyArIGNvbXBpbGUoZmlsdGVyKSArICcpJztcbiAgICAgICAgfSkuam9pbignJiYnKSB8fCAndHJ1ZSc7XG4gICAgfSxcbiAgICAnbm9uZSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJyEoJyArIG9wZXJhdG9ycy5hbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICcpJztcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBjb21waWxlKGZpbHRlcikge1xuICAgIHJldHVybiBvcGVyYXRvcnNbZmlsdGVyWzBdXS5hcHBseShmaWx0ZXIsIGZpbHRlcik7XG59XG5cbmZ1bmN0aW9uIHRydXRoKCkge1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyIG1hcGJveCBnbCBmaWx0ZXJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gZmlsdGVyLWV2YWx1YXRpbmcgZnVuY3Rpb25cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnV0aDtcbiAgICB2YXIgZmlsdGVyU3RyID0gJ3ZhciBwID0gZi5wcm9wZXJ0aWVzIHx8IGYudGFncyB8fCB7fSwgdCA9IGYudHlwZTsgcmV0dXJuICcgKyBjb21waWxlKGZpbHRlcikgKyAnOyc7XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdmJywgZmlsdGVyU3RyKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBidWZmZXIgPSBvcHRpb25zLmJ1ZmZlcjtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgeiA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgIHggPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICB5ID0gc3RhY2suc2hpZnQoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0sXG4gICAgICAgICAgICB0aWxlVG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5tYXhab29tID8gMCA6IG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB6LCB4LCB5LCB0aWxlLm51bUZlYXR1cmVzLCB0aWxlLm51bVBvaW50cywgdGlsZS5udW1TaW1wbGlmaWVkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCdjcmVhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3onICsgejtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRzW2tleV0gPSAodGhpcy5zdGF0c1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBnZW9tZXRyeSBpbiB0aWxlIHNvIHRoYXQgd2UgY2FuIGRyaWxsIGRvd24gbGF0ZXIgaWYgd2Ugc3RvcCBub3dcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcblxuICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB0aGUgdGlsZSBpcyBkZWdlbmVyYXRlXG4gICAgICAgIGlmIChpc0NsaXBwZWRTcXVhcmUodGlsZS5mZWF0dXJlcywgZXh0ZW50LCBidWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSAmJiB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogYnVmZmVyIC8gZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBpZiAodGwpIHN0YWNrLnB1c2godGwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgaWYgKGJsKSBzdGFjay5wdXNoKGJsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBpZiAodHIpIHN0YWNrLnB1c2godHIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgaWYgKGJyKSBzdGFjay5wdXNoKGJyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAocGFyZW50LnNvdXJjZSkge1xuICAgICAgICBpZiAoaXNDbGlwcGVkU3F1YXJlKHBhcmVudC5mZWF0dXJlcywgb3B0aW9ucy5leHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUocGFyZW50LCBleHRlbnQpO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgICAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICghdGlsZSB8fCB0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIGdlb21bal0gPSB0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gZ2VvbVtqXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykgcmluZ1trXSA9IHRyYW5zZm9ybVBvaW50KHJpbmdba10sIGV4dGVudCwgejIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUoZmVhdHVyZXMsIGV4dGVudCwgYnVmZmVyKSB7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gZmVhdHVyZS5nZW9tZXRyeVswXVtpXTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goc2ltcGxpZmllZFJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ld0dlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyxcbiAgICAgICAgICAgIG1pbjogW2ZlYXR1cmUubWluWzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1pblsxXV0sXG4gICAgICAgICAgICBtYXg6IFtmZWF0dXJlLm1heFswXSArIG9mZnNldCwgZmVhdHVyZS5tYXhbMV1dXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLmFyZWEgPSBwb2ludHMuYXJlYTtcbiAgICBuZXdQb2ludHMuZGlzdCA9IHBvaW50cy5kaXN0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2goW3BvaW50c1tpXVswXSArIG9mZnNldCwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaV1bMl1dKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBnbC1tYXRyaXggLSBIaWdoIHBlcmZvcm1hbmNlIG1hdHJpeCBhbmQgdmVjdG9yIG9wZXJhdGlvbnNcbiAqIEBhdXRob3IgQnJhbmRvbiBKb25lc1xuICogQGF1dGhvciBDb2xpbiBNYWNLZW56aWUgSVZcbiAqIEB2ZXJzaW9uIDIuMy4wXG4gKi9cblxuLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cbi8vIEVORCBIRUFERVJcblxuZXhwb3J0cy5nbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIik7XG5leHBvcnRzLm1hdDIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0Mi5qc1wiKTtcbmV4cG9ydHMubWF0MmQgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIik7XG5leHBvcnRzLm1hdDMgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKTtcbmV4cG9ydHMubWF0NCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQ0LmpzXCIpO1xuZXhwb3J0cy5xdWF0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3F1YXQuanNcIik7XG5leHBvcnRzLnZlYzIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKTtcbmV4cG9ydHMudmVjMyA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWMzLmpzXCIpO1xuZXhwb3J0cy52ZWM0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIik7IiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQ29tbW9uIHV0aWxpdGllc1xuICogQG5hbWUgZ2xNYXRyaXhcbiAqL1xudmFyIGdsTWF0cml4ID0ge307XG5cbi8vIENvbnN0YW50c1xuZ2xNYXRyaXguRVBTSUxPTiA9IDAuMDAwMDAxO1xuZ2xNYXRyaXguQVJSQVlfVFlQRSA9ICh0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmdsTWF0cml4LlJBTkRPTSA9IE1hdGgucmFuZG9tO1xuXG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7VHlwZX0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgR0xNQVRfQVJSQVlfVFlQRSA9IHR5cGU7XG59XG5cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuXG4vKipcbiogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4qXG4qIEBwYXJhbSB7TnVtYmVyfSBBbmdsZSBpbiBEZWdyZWVzXG4qL1xuZ2xNYXRyaXgudG9SYWRpYW4gPSBmdW5jdGlvbihhKXtcbiAgICAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xNYXRyaXg7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xudmFyIG1hdDIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5tYXQyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGExID0gYVsxXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYTE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYVsxXTtcbiAgICAgICAgb3V0WzNdID0gYVszXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuXG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcbiAgICBcbiAgICBvdXRbMF0gPSAgYTMgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWExICogZGV0O1xuICAgIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgICBvdXRbM10gPSAgYTAgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgICB2YXIgYTAgPSBhWzBdO1xuICAgIG91dFswXSA9ICBhWzNdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9ICBhMDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0Mi5tdWwgPSBtYXQyLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbm1hdDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGM7XG4gICAgb3V0WzFdID0gcztcbiAgICBvdXRbMl0gPSAtcztcbiAgICBvdXRbM10gPSBjO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5mcm9tU2NhbGluZyA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IHZbMF07XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IHZbMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDIuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQyLmZyb2IgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikpKVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IEwgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXggXG4gKiBAcGFyYW0ge21hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBpbnB1dCBtYXRyaXggdG8gZmFjdG9yaXplXG4gKi9cblxubWF0Mi5MRFUgPSBmdW5jdGlvbiAoTCwgRCwgVSwgYSkgeyBcbiAgICBMWzJdID0gYVsyXS9hWzBdOyBcbiAgICBVWzBdID0gYVswXTsgXG4gICAgVVsxXSA9IGFbMV07IFxuICAgIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07IFxuICAgIHJldHVybiBbTCwgRCwgVV07ICAgICAgIFxufTsgXG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyAyeDMgTWF0cml4XG4gKiBAbmFtZSBtYXQyZFxuICogXG4gKiBAZGVzY3JpcHRpb24gXG4gKiBBIG1hdDJkIGNvbnRhaW5zIHNpeCBlbGVtZW50cyBkZWZpbmVkIGFzOlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eV1cbiAqIDwvcHJlPlxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eSxcbiAqICAwLCAwLCAxXVxuICogPC9wcmU+XG4gKiBUaGUgbGFzdCByb3cgaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxuICovXG52YXIgbWF0MmQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXG4gKlxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cbm1hdDJkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGFhID0gYVswXSwgYWIgPSBhWzFdLCBhYyA9IGFbMl0sIGFkID0gYVszXSxcbiAgICAgICAgYXR4ID0gYVs0XSwgYXR5ID0gYVs1XTtcblxuICAgIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcbiAgICBpZighZGV0KXtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IGFkICogZGV0O1xuICAgIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gICAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICAgIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyZC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICAgIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5tdWwgPSBtYXQyZC5tdWx0aXBseTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBhMCAqICBjICsgYTIgKiBzO1xuICAgIG91dFsxXSA9IGExICogIGMgKyBhMyAqIHM7XG4gICAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xubWF0MmQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTAgKiB2MDtcbiAgICBvdXRbMV0gPSBhMSAqIHYwO1xuICAgIG91dFsyXSA9IGEyICogdjE7XG4gICAgb3V0WzNdID0gYTMgKiB2MTtcbiAgICBvdXRbNF0gPSBhNDtcbiAgICBvdXRbNV0gPSBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xubWF0MmQudHJhbnNsYXRlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sXG4gICAgICAgIHYwID0gdlswXSwgdjEgPSB2WzFdO1xuICAgIG91dFswXSA9IGEwO1xuICAgIG91dFsxXSA9IGExO1xuICAgIG91dFsyXSA9IGEyO1xuICAgIG91dFszXSA9IGEzO1xuICAgIG91dFs0XSA9IGEwICogdjAgKyBhMiAqIHYxICsgYTQ7XG4gICAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLCBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gLXM7XG4gICAgb3V0WzNdID0gYztcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21TY2FsaW5nID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gdlswXTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gdlsxXTtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyZC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gdlswXTtcbiAgICBvdXRbNV0gPSB2WzFdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQyZC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MmQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0MmQuZnJvYiA9IGZ1bmN0aW9uIChhKSB7IFxuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgMSkpXG59OyBcblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyZDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgM3gzIE1hdHJpeFxuICogQG5hbWUgbWF0M1xuICovXG52YXIgbWF0MyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyAzeDMgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbNF07XG4gICAgb3V0WzRdID0gYVs1XTtcbiAgICBvdXRbNV0gPSBhWzZdO1xuICAgIG91dFs2XSA9IGFbOF07XG4gICAgb3V0WzddID0gYVs5XTtcbiAgICBvdXRbOF0gPSBhWzEwXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5tYXQzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQzIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMTIgPSBhWzVdO1xuICAgICAgICBvdXRbMV0gPSBhWzNdO1xuICAgICAgICBvdXRbMl0gPSBhWzZdO1xuICAgICAgICBvdXRbM10gPSBhMDE7XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGEwMjtcbiAgICAgICAgb3V0WzddID0gYTEyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGFbMV07XG4gICAgICAgIG91dFs0XSA9IGFbNF07XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGFbMl07XG4gICAgICAgIG91dFs3XSA9IGFbNV07XG4gICAgICAgIG91dFs4XSA9IGFbOF07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMSxcbiAgICAgICAgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMCxcbiAgICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gICAgaWYgKCFkZXQpIHsgXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYjAxICogZGV0O1xuICAgIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICAgIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIG91dFswXSA9IChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpO1xuICAgIG91dFsxXSA9IChhMDIgKiBhMjEgLSBhMDEgKiBhMjIpO1xuICAgIG91dFsyXSA9IChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICAgIG91dFszXSA9IChhMTIgKiBhMjAgLSBhMTAgKiBhMjIpO1xuICAgIG91dFs0XSA9IChhMDAgKiBhMjIgLSBhMDIgKiBhMjApO1xuICAgIG91dFs1XSA9IChhMDIgKiBhMTAgLSBhMDAgKiBhMTIpO1xuICAgIG91dFs2XSA9IChhMTAgKiBhMjEgLSBhMTEgKiBhMjApO1xuICAgIG91dFs3XSA9IChhMDEgKiBhMjAgLSBhMDAgKiBhMjEpO1xuICAgIG91dFs4XSA9IChhMDAgKiBhMTEgLSBhMDEgKiBhMTApO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQzLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgYjAwID0gYlswXSwgYjAxID0gYlsxXSwgYjAyID0gYlsyXSxcbiAgICAgICAgYjEwID0gYlszXSwgYjExID0gYls0XSwgYjEyID0gYls1XSxcbiAgICAgICAgYjIwID0gYls2XSwgYjIxID0gYls3XSwgYjIyID0gYls4XTtcblxuICAgIG91dFswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcbiAgICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gICAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyO1xuXG4gICAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICAgIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG5cbiAgICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7XG4gICAgb3V0WzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxO1xuICAgIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0My5tdWwgPSBtYXQzLm11bHRpcGx5O1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDMgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNsYXRlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG4gICAgICAgIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuXG4gICAgb3V0WzNdID0gYTEwO1xuICAgIG91dFs0XSA9IGExMTtcbiAgICBvdXRbNV0gPSBhMTI7XG5cbiAgICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDtcbiAgICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MyBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICAgIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICAgIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuXG4gICAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gICAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gICAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG5cbiAgICBvdXRbNl0gPSBhMjA7XG4gICAgb3V0WzddID0gYTIxO1xuICAgIG91dFs4XSA9IGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICoqL1xubWF0My5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV07XG5cbiAgICBvdXRbMF0gPSB4ICogYVswXTtcbiAgICBvdXRbMV0gPSB4ICogYVsxXTtcbiAgICBvdXRbMl0gPSB4ICogYVsyXTtcblxuICAgIG91dFszXSA9IHkgKiBhWzNdO1xuICAgIG91dFs0XSA9IHkgKiBhWzRdO1xuICAgIG91dFs1XSA9IHkgKiBhWzVdO1xuXG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tVHJhbnNsYXRpb24gPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSB2WzBdO1xuICAgIG91dFs3XSA9IHZbMV07XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYztcbiAgICBvdXRbMV0gPSBzO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSAtcztcbiAgICBvdXRbNF0gPSBjO1xuICAgIG91dFs1XSA9IDA7XG5cbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcblxuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gdlsxXTtcbiAgICBvdXRbNV0gPSAwO1xuXG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cbm1hdDMuZnJvbU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSBhWzJdO1xuICAgIG91dFs0XSA9IGFbM107XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IGFbNF07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7cXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFszXSA9IHl4IC0gd3o7XG4gICAgb3V0WzZdID0genggKyB3eTtcblxuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gICAgb3V0WzddID0genkgLSB3eDtcblxuICAgIG91dFsyXSA9IHp4IC0gd3k7XG4gICAgb3V0WzVdID0genkgKyB3eDtcbiAgICBvdXRbOF0gPSAxIC0geHggLSB5eTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5tYXQzLm5vcm1hbEZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkgeyBcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcblxuICAgIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICAgIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICAgIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuXG4gICAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBcbiAgICAgICAgICAgICAgICAgICAgYVs2XSArICcsICcgKyBhWzddICsgJywgJyArIGFbOF0gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQzLmZyb2IgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgTWF0aC5wb3coYVs2XSwgMikgKyBNYXRoLnBvdyhhWzddLCAyKSArIE1hdGgucG93KGFbOF0sIDIpKSlcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQzO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0eDQgTWF0cml4XG4gKiBAbmFtZSBtYXQ0XG4gKi9cbnZhciBtYXQ0ID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XG4gKlxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xubWF0NC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xubWF0NC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgICAgICBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGEwMTtcbiAgICAgICAgb3V0WzZdID0gYVs5XTtcbiAgICAgICAgb3V0WzddID0gYVsxM107XG4gICAgICAgIG91dFs4XSA9IGEwMjtcbiAgICAgICAgb3V0WzldID0gYTEyO1xuICAgICAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgICAgIG91dFsxMl0gPSBhMDM7XG4gICAgICAgIG91dFsxM10gPSBhMTM7XG4gICAgICAgIG91dFsxNF0gPSBhMjM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGFbMV07XG4gICAgICAgIG91dFs1XSA9IGFbNV07XG4gICAgICAgIG91dFs2XSA9IGFbOV07XG4gICAgICAgIG91dFs3XSA9IGFbMTNdO1xuICAgICAgICBvdXRbOF0gPSBhWzJdO1xuICAgICAgICBvdXRbOV0gPSBhWzZdO1xuICAgICAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzEyXSA9IGFbM107XG4gICAgICAgIG91dFsxM10gPSBhWzddO1xuICAgICAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMixcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICAgIGlmICghZGV0KSB7IFxuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICAgIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICAgIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICAgIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICAgIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICAgIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICAgIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICAgIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIG91dFswXSAgPSAgKGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gICAgb3V0WzFdICA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgICBvdXRbMl0gID0gIChhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFszXSAgPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzRdICA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbNV0gID0gIChhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFs2XSAgPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzddICA9ICAoYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbOF0gID0gIChhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkpO1xuICAgIG91dFs5XSAgPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gICAgb3V0WzEwXSA9ICAoYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gICAgb3V0WzEzXSA9ICAoYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpKTtcbiAgICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICAgIG91dFsxNV0gPSAgKGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDQuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDQubXVsID0gbWF0NC5tdWx0aXBseTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xubWF0NC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgdmFyIHggPSBheGlzWzBdLCB5ID0gYXhpc1sxXSwgeiA9IGF4aXNbMl0sXG4gICAgICAgIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopLFxuICAgICAgICBzLCBjLCB0LFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzLFxuICAgICAgICBiMDAsIGIwMSwgYjAyLFxuICAgICAgICBiMTAsIGIxMSwgYjEyLFxuICAgICAgICBiMjAsIGIyMSwgYjIyO1xuXG4gICAgaWYgKE1hdGguYWJzKGxlbikgPCBnbE1hdHJpeC5FUFNJTE9OKSB7IHJldHVybiBudWxsOyB9XG4gICAgXG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4ICo9IGxlbjtcbiAgICB5ICo9IGxlbjtcbiAgICB6ICo9IGxlbjtcblxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcblxuICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcbiAgICBiMDAgPSB4ICogeCAqIHQgKyBjOyBiMDEgPSB5ICogeCAqIHQgKyB6ICogczsgYjAyID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7IGIxMSA9IHkgKiB5ICogdCArIGM7IGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIGIyMCA9IHggKiB6ICogdCArIHkgKiBzOyBiMjEgPSB5ICogeiAqIHQgLSB4ICogczsgYjIyID0geiAqIHogKiB0ICsgYztcblxuICAgIC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICAgIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gICAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICAgIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gICAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICAgIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gICAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICAgIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gICAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlWCA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sXG4gICAgICAgIGEyMSA9IGFbOV0sXG4gICAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgICBhMjMgPSBhWzExXTtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgICAgICBvdXRbMF0gID0gYVswXTtcbiAgICAgICAgb3V0WzFdICA9IGFbMV07XG4gICAgICAgIG91dFsyXSAgPSBhWzJdO1xuICAgICAgICBvdXRbM10gID0gYVszXTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gICAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5yb3RhdGVZID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTAwID0gYVswXSxcbiAgICAgICAgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTAzID0gYVszXSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICAgIG91dFs0XSAgPSBhWzRdO1xuICAgICAgICBvdXRbNV0gID0gYVs1XTtcbiAgICAgICAgb3V0WzZdICA9IGFbNl07XG4gICAgICAgIG91dFs3XSAgPSBhWzddO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICAgIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xuICAgIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICAgIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICAgIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xuICAgIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICAgIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLFxuICAgICAgICBhMTEgPSBhWzVdLFxuICAgICAgICBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgICAgICBvdXRbOF0gID0gYVs4XTtcbiAgICAgICAgb3V0WzldICA9IGFbOV07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTFdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xuICAgIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICAgIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICAgIG91dFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xuICAgIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gdlsxXTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSB2WzJdO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGUgYXJvdW5kIGEgZ2l2ZW4gYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkLCBheGlzKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdLFxuICAgICAgICBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KSxcbiAgICAgICAgcywgYywgdDtcbiAgICBcbiAgICBpZiAoTWF0aC5hYnMobGVuKSA8IGdsTWF0cml4LkVQU0lMT04pIHsgcmV0dXJuIG51bGw7IH1cbiAgICBcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHggKj0gbGVuO1xuICAgIHkgKj0gbGVuO1xuICAgIHogKj0gbGVuO1xuICAgIFxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcbiAgICBcbiAgICAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gICAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gICAgb3V0WzJdID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgICBvdXRbNV0gPSB5ICogeSAqIHQgKyBjO1xuICAgIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geCAqIHogKiB0ICsgeSAqIHM7XG4gICAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gICAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21YUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSAgPSAxO1xuICAgIG91dFsxXSAgPSAwO1xuICAgIG91dFsyXSAgPSAwO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gYztcbiAgICBvdXRbNl0gPSBzO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAtcztcbiAgICBvdXRbMTBdID0gYztcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVlSb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBcbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdICA9IGM7XG4gICAgb3V0WzFdICA9IDA7XG4gICAgb3V0WzJdICA9IC1zO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gcztcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSBjO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVaKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tWlJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIFxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gID0gYztcbiAgICBvdXRbMV0gID0gcztcbiAgICBvdXRbMl0gID0gMDtcbiAgICBvdXRbM10gID0gMDtcbiAgICBvdXRbNF0gPSAtcztcbiAgICBvdXRbNV0gPSBjO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIGFuZCB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgdmFyIHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uID0gZnVuY3Rpb24gKG91dCwgcSwgdikge1xuICAgIC8vIFF1YXRlcm5pb24gbWF0aFxuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeHkgPSB4ICogeTIsXG4gICAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgeXogPSB5ICogejIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgICBvdXRbMV0gPSB4eSArIHd6O1xuICAgIG91dFsyXSA9IHh6IC0gd3k7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4eSAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gICAgb3V0WzZdID0geXogKyB3eDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHh6ICsgd3k7XG4gICAgb3V0WzldID0geXogLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICB2YXIgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUgPSBmdW5jdGlvbiAob3V0LCBxLCB2LCBzKSB7XG4gICAgLy8gUXVhdGVybmlvbiBtYXRoXG4gICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdLFxuICAgICAgICB4MiA9IHggKyB4LFxuICAgICAgICB5MiA9IHkgKyB5LFxuICAgICAgICB6MiA9IHogKyB6LFxuXG4gICAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgICB4eSA9IHggKiB5MixcbiAgICAgICAgeHogPSB4ICogejIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB5eiA9IHkgKiB6MixcbiAgICAgICAgenogPSB6ICogejIsXG4gICAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgICB3eSA9IHcgKiB5MixcbiAgICAgICAgd3ogPSB3ICogejIsXG4gICAgICAgIHN4ID0gc1swXSxcbiAgICAgICAgc3kgPSBzWzFdLFxuICAgICAgICBzeiA9IHNbMl07XG5cbiAgICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgICBvdXRbMV0gPSAoeHkgKyB3eikgKiBzeDtcbiAgICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9ICh4eSAtIHd6KSAqIHN5O1xuICAgIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICAgIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gICAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gICAgb3V0WzEwXSA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSB2WzBdO1xuICAgIG91dFsxM10gPSB2WzFdO1xuICAgIG91dFsxNF0gPSB2WzJdO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlLCByb3RhdGluZyBhbmQgc2NhbGluZyBhcm91bmQgdGhlIGdpdmVuIG9yaWdpblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG5lZ2F0aXZlT3JpZ2luKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBvIFRoZSBvcmlnaW4gdmVjdG9yIGFyb3VuZCB3aGljaCB0byBzY2FsZSBhbmQgcm90YXRlXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbiA9IGZ1bmN0aW9uIChvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgIHgyID0geCArIHgsXG4gICAgICB5MiA9IHkgKyB5LFxuICAgICAgejIgPSB6ICsgeixcblxuICAgICAgeHggPSB4ICogeDIsXG4gICAgICB4eSA9IHggKiB5MixcbiAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgeXkgPSB5ICogeTIsXG4gICAgICB5eiA9IHkgKiB6MixcbiAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgd3ggPSB3ICogeDIsXG4gICAgICB3eSA9IHcgKiB5MixcbiAgICAgIHd6ID0gdyAqIHoyLFxuICAgICAgXG4gICAgICBzeCA9IHNbMF0sXG4gICAgICBzeSA9IHNbMV0sXG4gICAgICBzeiA9IHNbMl0sXG5cbiAgICAgIG94ID0gb1swXSxcbiAgICAgIG95ID0gb1sxXSxcbiAgICAgIG96ID0gb1syXTtcbiAgICAgIFxuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0WzBdICogb3ggKyBvdXRbNF0gKiBveSArIG91dFs4XSAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXRbMV0gKiBveCArIG91dFs1XSAqIG95ICsgb3V0WzldICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dFsyXSAqIG94ICsgb3V0WzZdICogb3kgKyBvdXRbMTBdICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgICAgICAgXG4gIHJldHVybiBvdXQ7XG59O1xuXG5tYXQ0LmZyb21RdWF0ID0gZnVuY3Rpb24gKG91dCwgcSkge1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeXggPSB5ICogeDIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB6eCA9IHogKiB4MixcbiAgICAgICAgenkgPSB6ICogeTIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gICAgb3V0WzFdID0geXggKyB3ejtcbiAgICBvdXRbMl0gPSB6eCAtIHd5O1xuICAgIG91dFszXSA9IDA7XG5cbiAgICBvdXRbNF0gPSB5eCAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSB4eCAtIHp6O1xuICAgIG91dFs2XSA9IHp5ICsgd3g7XG4gICAgb3V0WzddID0gMDtcblxuICAgIG91dFs4XSA9IHp4ICsgd3k7XG4gICAgb3V0WzldID0genkgLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtIHh4IC0geXk7XG4gICAgb3V0WzExXSA9IDA7XG5cbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZydXN0dW0gPSBmdW5jdGlvbiAob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSAobmVhciAqIDIpICogcmw7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAobmVhciAqIDIpICogdGI7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7XG4gICAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoZmFyICogbmVhciAqIDIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZSA9IGZ1bmN0aW9uIChvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBvZiB2aWV3LlxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyA9IGZ1bmN0aW9uIChvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gICAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkvMTgwLjApLFxuICAgICAgICBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJLzE4MC4wKSxcbiAgICAgICAgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pLFxuICAgICAgICB5U2NhbGUgPSAyLjAgLyAodXBUYW4gKyBkb3duVGFuKTtcblxuICAgIG91dFswXSA9IHhTY2FsZTtcbiAgICBvdXRbMV0gPSAwLjA7XG4gICAgb3V0WzJdID0gMC4wO1xuICAgIG91dFszXSA9IDAuMDtcbiAgICBvdXRbNF0gPSAwLjA7XG4gICAgb3V0WzVdID0geVNjYWxlO1xuICAgIG91dFs2XSA9IDAuMDtcbiAgICBvdXRbN10gPSAwLjA7XG4gICAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gICAgb3V0WzldID0gKCh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41KTtcbiAgICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMV0gPSAtMS4wO1xuICAgIG91dFsxMl0gPSAwLjA7XG4gICAgb3V0WzEzXSA9IDAuMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIpIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxNV0gPSAwLjA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm9ydGhvID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCksXG4gICAgICAgIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gLTIgKiBscjtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IC0yICogYnQ7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMiAqIG5mO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICAgIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICAgIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubG9va0F0ID0gZnVuY3Rpb24gKG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCBnbE1hdHJpeC5FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IGdsTWF0cml4LkVQU0lMT04gJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgICAgICByZXR1cm4gbWF0NC5pZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIGFbNl0gKyAnLCAnICsgYVs3XSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzhdICsgJywgJyArIGFbOV0gKyAnLCAnICsgYVsxMF0gKyAnLCAnICsgYVsxMV0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0NC5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSArIE1hdGgucG93KGFbOV0sIDIpICsgTWF0aC5wb3coYVsxMF0sIDIpICsgTWF0aC5wb3coYVsxMV0sIDIpICsgTWF0aC5wb3coYVsxMl0sIDIpICsgTWF0aC5wb3coYVsxM10sIDIpICsgTWF0aC5wb3coYVsxNF0sIDIpICsgTWF0aC5wb3coYVsxNV0sIDIpICkpXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWF0NDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcbnZhciBtYXQzID0gcmVxdWlyZShcIi4vbWF0My5qc1wiKTtcbnZhciB2ZWMzID0gcmVxdWlyZShcIi4vdmVjMy5qc1wiKTtcbnZhciB2ZWM0ID0gcmVxdWlyZShcIi4vdmVjNC5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgUXVhdGVybmlvblxuICogQG5hbWUgcXVhdFxuICovXG52YXIgcXVhdCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cbnF1YXQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRpb25UbyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLDAsMCk7XG4gICAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLDEsMCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcbiAgICAgICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgaWYgKHZlYzMubGVuZ3RoKHRtcHZlYzMpIDwgMC4wMDAwMDEpXG4gICAgICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICAgICAgICBxdWF0LnNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgb3V0WzBdID0gMDtcbiAgICAgICAgICAgIG91dFsxXSA9IDA7XG4gICAgICAgICAgICBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgb3V0WzNdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgICAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICAgICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNldEF4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICAgICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07XG5cbiAgICAgICAgbWF0clsxXSA9IHVwWzBdO1xuICAgICAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgICAgIG1hdHJbN10gPSB1cFsyXTtcblxuICAgICAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICAgICAgbWF0cls4XSA9IC12aWV3WzJdO1xuXG4gICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIHF1YXQuZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY2xvbmUgPSB2ZWM0LmNsb25lO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY29weSA9IHZlYzQuY29weTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zZXQgPSB2ZWM0LnNldDtcblxuLyoqXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqKi9cbnF1YXQuc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0LCBheGlzLCByYWQpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICAgIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICAgIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmFkZCA9IHZlYzQuYWRkO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm11bCA9IHF1YXQubXVsdGlwbHk7XG5cbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zY2FsZSA9IHZlYzQuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ4ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF6ICogYng7XG4gICAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ5ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF5ICogYnk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYno7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG5cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZG90ID0gdmVjNC5kb3Q7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVycCA9IHZlYzQubGVycDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zbGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICAvLyBiZW5jaG1hcmtzOlxuICAgIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICB2YXIgICAgICAgIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxO1xuXG4gICAgLy8gY2FsYyBjb3NpbmVcbiAgICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7XG4gICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG4gICAgaWYgKCBjb3NvbSA8IDAuMCApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICggKDEuMCAtIGNvc29tKSA+IDAuMDAwMDAxICkge1xuICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICAgICAgb21lZ2EgID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICAgICAgc2lub20gID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICAgICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIH0gZWxzZSB7ICAgICAgICBcbiAgICAgICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZSBcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgICAgICBzY2FsZTEgPSB0O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG4gICAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gICAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuc3FsZXJwID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlbXAxID0gcXVhdC5jcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gcXVhdC5jcmVhdGUoKTtcbiAgXG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgcXVhdC5zbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgcXVhdC5zbGVycCh0ZW1wMiwgYiwgYywgdCk7XG4gICAgcXVhdC5zbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICBcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpKTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICBkb3QgPSBhMCphMCArIGExKmExICsgYTIqYTIgKyBhMyphMyxcbiAgICAgICAgaW52RG90ID0gZG90ID8gMS4wL2RvdCA6IDA7XG4gICAgXG4gICAgLy8gVE9ETzogV291bGQgYmUgZmFzdGVyIHRvIHJldHVybiBbMCwwLDAsMF0gaW1tZWRpYXRlbHkgaWYgZG90ID09IDBcblxuICAgIG91dFswXSA9IC1hMCppbnZEb3Q7XG4gICAgb3V0WzFdID0gLWExKmludkRvdDtcbiAgICBvdXRbMl0gPSAtYTIqaW52RG90O1xuICAgIG91dFszXSA9IGEzKmludkRvdDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBxdWF0XG4gKiBJZiB0aGUgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5sZW5ndGggPSB2ZWM0Lmxlbmd0aDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVuID0gcXVhdC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNxdWFyZWRMZW5ndGggPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zcXJMZW4gPSBxdWF0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5ub3JtYWxpemUgPSB2ZWM0Lm5vcm1hbGl6ZTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge21hdDN9IG0gcm90YXRpb24gbWF0cml4XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5mcm9tTWF0MyA9IGZ1bmN0aW9uKG91dCwgbSkge1xuICAgIC8vIEFsZ29yaXRobSBpbiBLZW4gU2hvZW1ha2UncyBhcnRpY2xlIGluIDE5ODcgU0lHR1JBUEggY291cnNlIG5vdGVzXG4gICAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gICAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcbiAgICB2YXIgZlJvb3Q7XG5cbiAgICBpZiAoIGZUcmFjZSA+IDAuMCApIHtcbiAgICAgICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChmVHJhY2UgKyAxLjApOyAgLy8gMndcbiAgICAgICAgb3V0WzNdID0gMC41ICogZlJvb3Q7XG4gICAgICAgIGZSb290ID0gMC41L2ZSb290OyAgLy8gMS8oNHcpXG4gICAgICAgIG91dFswXSA9IChtWzVdLW1bN10pKmZSb290O1xuICAgICAgICBvdXRbMV0gPSAobVs2XS1tWzJdKSpmUm9vdDtcbiAgICAgICAgb3V0WzJdID0gKG1bMV0tbVszXSkqZlJvb3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gfHd8IDw9IDEvMlxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIGlmICggbVs0XSA+IG1bMF0gKVxuICAgICAgICAgIGkgPSAxO1xuICAgICAgICBpZiAoIG1bOF0gPiBtW2kqMytpXSApXG4gICAgICAgICAgaSA9IDI7XG4gICAgICAgIHZhciBqID0gKGkrMSklMztcbiAgICAgICAgdmFyIGsgPSAoaSsyKSUzO1xuICAgICAgICBcbiAgICAgICAgZlJvb3QgPSBNYXRoLnNxcnQobVtpKjMraV0tbVtqKjMral0tbVtrKjMra10gKyAxLjApO1xuICAgICAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDtcbiAgICAgICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICAgICAgb3V0WzNdID0gKG1baiozK2tdIC0gbVtrKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtqXSA9IChtW2oqMytpXSArIG1baSozK2pdKSAqIGZSb290O1xuICAgICAgICBvdXRba10gPSAobVtrKjMraV0gKyBtW2kqMytrXSkgKiBmUm9vdDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnF1YXQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3F1YXQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHF1YXQ7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMyXG4gKi9cbnZhciB2ZWMyID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxuICpcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHkpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuc3ViID0gdmVjMi5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5tdWwgPSB2ZWMyLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGl2ID0gdmVjMi5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGlzdCA9IHZlYzIuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMyLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckRpc3QgPSB2ZWMyLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMyLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5sZW4gPSB2ZWMyLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMyLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zcXJMZW4gPSB2ZWMyLnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeTtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjMi5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzIuY3Jvc3MgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gICAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWMyLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzI7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDMgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMzXG4gKi9cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmhlcm1pdGUgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDEsXG4gICAgICBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQsXG4gICAgICBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKSxcbiAgICAgIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgXG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIFxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuYmV6aWVyID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0LFxuICAgICAgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3IsXG4gICAgICBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvLFxuICAgICAgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIFxuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICBcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gICAgdmFyIHogPSAoZ2xNYXRyaXguUkFORE9NKCkgKiAyLjApIC0gMS4wO1xuICAgIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wLXoqeikgKiBzY2FsZTtcblxuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICAgIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICAgIHcgPSB3IHx8IDEuMDtcbiAgICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gdGhlIDN4MyBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG4gICAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICAgIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIC8vIGJlbmNobWFya3M6IGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3RhdGVYID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBjKXtcbiAgIHZhciBwID0gW10sIHI9W107XG5cdCAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXHQgIHBbMF0gPSBhWzBdIC0gYlswXTtcblx0ICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuXG5cdCAgLy9wZXJmb3JtIHJvdGF0aW9uXG5cdCAgclswXSA9IHBbMF07XG5cdCAgclsxXSA9IHBbMV0qTWF0aC5jb3MoYykgLSBwWzJdKk1hdGguc2luKGMpO1xuXHQgIHJbMl0gPSBwWzFdKk1hdGguc2luKGMpICsgcFsyXSpNYXRoLmNvcyhjKTtcblxuXHQgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblx0ICBvdXRbMF0gPSByWzBdICsgYlswXTtcblx0ICBvdXRbMV0gPSByWzFdICsgYlsxXTtcblx0ICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFsyXSpNYXRoLnNpbihjKSArIHBbMF0qTWF0aC5jb3MoYyk7XG4gIFx0clsxXSA9IHBbMV07XG4gIFx0clsyXSA9IHBbMl0qTWF0aC5jb3MoYykgLSBwWzBdKk1hdGguc2luKGMpO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFswXSpNYXRoLmNvcyhjKSAtIHBbMV0qTWF0aC5zaW4oYyk7XG4gIFx0clsxXSA9IHBbMF0qTWF0aC5zaW4oYykgKyBwWzFdKk1hdGguY29zKGMpO1xuICBcdHJbMl0gPSBwWzJdO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07IGFbaSsyXSA9IHZlY1syXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbnZlYzMuYW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7XG4gICBcbiAgICB2YXIgdGVtcEEgPSB2ZWMzLmZyb21WYWx1ZXMoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgdmFyIHRlbXBCID0gdmVjMy5mcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuIFxuICAgIHZlYzMubm9ybWFsaXplKHRlbXBBLCB0ZW1wQSk7XG4gICAgdmVjMy5ub3JtYWxpemUodGVtcEIsIHRlbXBCKTtcbiBcbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9ICAgICBcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJyknO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWMzO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjNFxuICovXG52YXIgdmVjNCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cbnZlYzQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnN1YiA9IHZlYzQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubXVsID0gdmVjNC5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpdiA9IHZlYzQuZGl2aWRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzQuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeiArIHcqdyk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpc3QgPSB2ZWM0LmRpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjNC5zcXVhcmVkRGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuc3FyRGlzdCA9IHZlYzQuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzQubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnogKyB3KncpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubGVuID0gdmVjNC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xudmVjNC5zcXVhcmVkTGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqeiArIHcqdztcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zcXJMZW4gPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSAtYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0geCAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0geSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0geiAqIGxlbjtcbiAgICAgICAgb3V0WzNdID0gdyAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWM0LmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5sZXJwID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgdCkge1xuICAgIHZhciBheCA9IGFbMF0sXG4gICAgICAgIGF5ID0gYVsxXSxcbiAgICAgICAgYXogPSBhWzJdLFxuICAgICAgICBhdyA9IGFbM107XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gICAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gICAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgLy9UT0RPOiBUaGlzIGlzIGEgcHJldHR5IGF3ZnVsIHdheSBvZiBkb2luZyB0aGlzLiBGaW5kIHNvbWV0aGluZyBiZXR0ZXIuXG4gICAgb3V0WzBdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzFdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzJdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzNdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgdmVjNC5ub3JtYWxpemUob3V0LCBvdXQpO1xuICAgIHZlYzQuc2NhbGUob3V0LCBvdXQsIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBtYXQ0LlxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sIHcgPSBhWzNdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gICAgb3V0WzJdID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdICogdztcbiAgICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3F1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnRyYW5zZm9ybVF1YXQgPSBmdW5jdGlvbihvdXQsIGEsIHEpIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWM0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWM0LiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjNHMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjNC5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdOyB2ZWNbM10gPSBhW2krM107XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTsgYVtpKzJdID0gdmVjWzJdOyBhW2krM10gPSB2ZWNbM107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWM0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWM0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWM0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIoYSwgYiwgdCkge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVBcnJheShhLCBiLCB0KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBpbnRlcnBvbGF0ZU51bWJlcihhW2ldLCBiW2ldLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0c1snaW50ZXJwb2xhdGVkJ10gPSBmdW5jdGlvbihmKSB7XG4gICAgaWYgKCFmLnN0b3BzKSB7XG4gICAgICAgIHJldHVybiBjb25zdGFudChmKTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcHMgPSBmLnN0b3BzLFxuICAgICAgICBiYXNlID0gZi5iYXNlIHx8IDEsXG4gICAgICAgIGludGVycG9sYXRlID0gQXJyYXkuaXNBcnJheShzdG9wc1swXVsxXSkgPyBpbnRlcnBvbGF0ZUFycmF5IDogaW50ZXJwb2xhdGVOdW1iZXI7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oeikge1xuICAgICAgICAvLyBmaW5kIHRoZSB0d28gc3RvcHMgd2hpY2ggdGhlIGN1cnJlbnQgeiBpcyBiZXR3ZWVuXG4gICAgICAgIHZhciBsb3csIGhpZ2g7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0b3AgPSBzdG9wc1tpXTtcblxuICAgICAgICAgICAgaWYgKHN0b3BbMF0gPD0geikge1xuICAgICAgICAgICAgICAgIGxvdyA9IHN0b3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wWzBdID4geikge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBzdG9wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvdyAmJiBoaWdoKSB7XG4gICAgICAgICAgICB2YXIgem9vbURpZmYgPSBoaWdoWzBdIC0gbG93WzBdLFxuICAgICAgICAgICAgICAgIHpvb21Qcm9ncmVzcyA9IHogLSBsb3dbMF0sXG5cbiAgICAgICAgICAgICAgICB0ID0gYmFzZSA9PT0gMSA/XG4gICAgICAgICAgICAgICAgem9vbVByb2dyZXNzIC8gem9vbURpZmYgOlxuICAgICAgICAgICAgICAgIChNYXRoLnBvdyhiYXNlLCB6b29tUHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgem9vbURpZmYpIC0gMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShsb3dbMV0sIGhpZ2hbMV0sIHQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobG93KSB7XG4gICAgICAgICAgICByZXR1cm4gbG93WzFdO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaGlnaCkge1xuICAgICAgICAgICAgcmV0dXJuIGhpZ2hbMV07XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuZXhwb3J0c1sncGllY2V3aXNlLWNvbnN0YW50J10gPSBmdW5jdGlvbihmKSB7XG4gICAgaWYgKCFmLnN0b3BzKSB7XG4gICAgICAgIHJldHVybiBjb25zdGFudChmKTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcHMgPSBmLnN0b3BzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHopIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0b3BzW2ldWzBdID4geikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG9wc1tpID09PSAwID8gMCA6IGkgLSAxXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVsxXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi4vLi4vcmVmZXJlbmNlL2xhdGVzdC5qcycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9wYXJzZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHlsZSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShzdHlsZSwgcmVmZXJlbmNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoJ3V0aWwnKS5mb3JtYXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3R5bGUsIHJlZmVyZW5jZSkge1xuXG4gICAgdmFyIGNvbnN0YW50cyA9IHN0eWxlLmNvbnN0YW50cyB8fCB7fSxcbiAgICAgICAgbGF5ZXJzID0ge30sXG4gICAgICAgIGVycm9ycyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gZXJyb3Ioa2V5LCB2YWwgLyosIG1lc3NhZ2UsIC4uLiovKSB7XG4gICAgICAgIHZhciBlcnIgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiAoa2V5ID8ga2V5ICsgJzogJyA6ICcnKSArXG4gICAgICAgICAgICBmb3JtYXQuYXBwbHkoZm9ybWF0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsLl9fbGluZV9fKSB7XG4gICAgICAgICAgICBlcnIubGluZSA9IHZhbC5fX2xpbmVfXztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgfVxuXG4gICAgLy8gTWFpbiByZWN1cnNpdmUgdmFsaWRhdGlvbiBmdW5jdGlvbi4gVHJhY2tzOlxuICAgIC8vXG4gICAgLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbiAgICAvLyAgIGZvciBtb3JlIGluZm9ybWF0aXZlIGVycm9yIHJlcG9ydGluZy5cbiAgICAvLyAtIHZhbDogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuICAgIC8vICAgaGlnaCBsZXZlbCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBkZXNjZW5kZWQgaW50byBkZWVwZXIgb3IgYSBzaW1wbGVcbiAgICAvLyAgIHNjYWxhciB2YWx1ZS5cbiAgICAvLyAtIHNwZWM6IGN1cnJlbnQgc3BlYyBiZWluZyBldmFsdWF0ZWQuIFRyYWNrcyB2YWwuXG4gICAgLy9cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShrZXksIHZhbCwgc3BlYykge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcblxuICAgICAgICAvLyBDb25zdGFudHNcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbFswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICBpZiAoISh2YWwgaW4gY29uc3RhbnRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ2NvbnN0YW50IFwiJXNcIiBub3QgZm91bmQnLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsID0gY29uc3RhbnRzW3ZhbF07XG4gICAgICAgICAgICB0eXBlID0gdHlwZW9mXyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRnVuY3Rpb25zXG4gICAgICAgIGlmIChzcGVjLmZ1bmN0aW9uICYmIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGUuZnVuY3Rpb24oa2V5LCB2YWwsIHNwZWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwZWMudHlwZSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9IHZhbGlkYXRlW3NwZWMudHlwZV07XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvcihrZXksIHZhbCwgc3BlYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGVjID0gcmVmZXJlbmNlW3NwZWMudHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHNwZWMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlLmNvbnN0YW50cyA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mXyh2YWwpO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ29iamVjdCBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGsgaW4gdmFsKSB7XG4gICAgICAgICAgICBpZiAoa1swXSAhPT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJy4nICsgaywgdmFsW2tdLCAnY29uc3RhbnRzIG11c3Qgc3RhcnQgd2l0aCBcIkBcIicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLnNvdXJjZSA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmICghdmFsLnR5cGUpIHtcbiAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlID0gdW5idW5kbGUodmFsLnR5cGUpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgICAgICAgICBjYXNlICdyYXN0ZXInOlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLm9iamVjdChrZXksIHZhbCwgcmVmZXJlbmNlLnNvdXJjZV90aWxlKTtcblxuICAgICAgICAgICAgICAgIGlmICgndXJsJyBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbJ3R5cGUnLCAndXJsJywgJ3RpbGVTaXplJ10uaW5kZXhPZihwcm9wKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXkgKyAnLicgKyBwcm9wLCB2YWxbcHJvcF0sICdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICAgICAgICAgICAgdmFsaWRhdGUub2JqZWN0KGtleSwgdmFsLCByZWZlcmVuY2Uuc291cmNlX2dlb2pzb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLm9iamVjdChrZXksIHZhbCwgcmVmZXJlbmNlLnNvdXJjZV92aWRlbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJy50eXBlJywgdmFsLnR5cGUsIHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdnZW9qc29uJywgJ3ZpZGVvJ119KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YWxpZGF0ZS5sYXllciA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmICghdmFsLnR5cGUgJiYgIXZhbC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlID0gdW5idW5kbGUodmFsLnR5cGUpLFxuICAgICAgICAgICAgcmVmID0gdW5idW5kbGUodmFsLnJlZik7XG5cbiAgICAgICAgaWYgKHZhbC5pZCkge1xuICAgICAgICAgICAgaWYgKGxheWVyc1t2YWwuaWRdKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwuaWQsICdkdXBsaWNhdGUgbGF5ZXIgaWQgXCIlc1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAlZCcsIHZhbC5pZCwgbGF5ZXJzW3ZhbC5pZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXllcnNbdmFsLmlkXSA9IHZhbC5pZC5fX2xpbmVfXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncmVmJyBpbiB2YWwpIHtcbiAgICAgICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHAgaW4gdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsW3BdLCAnXCIlc1wiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnMnLCBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHBhcmVudDtcblxuICAgICAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24obGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuaWQgPT0gcmVmKSBwYXJlbnQgPSBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnJlZiwgJ3JlZiBsYXllciBcIiVzXCIgbm90IGZvdW5kJywgcmVmKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnJlZikge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnJlZiwgJ3JlZiBjYW5ub3QgcmVmZXJlbmNlIGFub3RoZXIgcmVmIGxheWVyJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBwYXJlbnQudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgICAgIGlmICghdmFsLnNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzW3ZhbC5zb3VyY2VdO1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnNvdXJjZSwgJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJywgdmFsLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UudHlwZSA9PSAndmVjdG9yJyAmJiB0eXBlID09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnNvdXJjZSwgJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnLCB2YWwuaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT0gJ3Jhc3RlcicgJiYgdHlwZSAhPSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbC5zb3VyY2UsICdsYXllciBcIiVzXCIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlJywgdmFsLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHJlZmVyZW5jZS5sYXllciwge1xuICAgICAgICAgICAgZmlsdGVyOiB2YWxpZGF0ZS5maWx0ZXIsXG4gICAgICAgICAgICBsYXlvdXQ6IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwZWMgPSByZWZlcmVuY2VbJ2xheW91dF8nICsgdHlwZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgJiYgc3BlYyAmJiB2YWxpZGF0ZShrZXksIHZhbCwgc3BlYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQ6IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwZWMgPSByZWZlcmVuY2VbJ3BhaW50XycgKyB0eXBlXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSAmJiBzcGVjICYmIHZhbGlkYXRlKGtleSwgdmFsLCBzcGVjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLm9iamVjdCA9IGZ1bmN0aW9uIChrZXksIHZhbCwgc3BlYywgdmFsaWRhdG9ycykge1xuICAgICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycyB8fCB7fTtcblxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3Ioa2V5LCB2YWwsICdvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrIGluIHZhbCkge1xuICAgICAgICAgICAgdmFyIHNwZWNrZXkgPSBrLnNwbGl0KCcuJylbMF07IC8vIHRyZWF0ICdwYWludC4qJyBhcyAncGFpbnQnXG4gICAgICAgICAgICB2YXIgZGVmID0gc3BlY1tzcGVja2V5XSB8fCBzcGVjWycqJ107XG4gICAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IHNwZWNrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgICAgICAodmFsaWRhdG9yc1tzcGVja2V5XSB8fCB2YWxpZGF0ZSkoKGtleSA/IGtleSArICcuJyA6IGtleSkgKyBrLCB2YWxba10sIGRlZik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb24gJiYgc3BlY1t0cmFuc2l0aW9uWzFdXSAmJiBzcGVjW3RyYW5zaXRpb25bMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZSgoa2V5ID8ga2V5ICsgJy4nIDoga2V5KSArIGssIHZhbFtrXSwgcmVmZXJlbmNlLnRyYW5zaXRpb24pO1xuICAgICAgICAgICAgLy8gdG9sZXJhdGUgcm9vdC1sZXZlbCBleHRyYSBrZXlzICYgYXJiaXRyYXJ5IGxheWVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnJyAmJiBrZXkuc3BsaXQoJy4nKS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbFtrXSwgJ3Vua25vd24gcHJvcGVydHkgXCIlc1wiJywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBsIGluIHNwZWMpIHtcbiAgICAgICAgICAgIGlmIChzcGVjW2xdLnJlcXVpcmVkICYmIHNwZWNbbF1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIHZhbFtsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiJXNcIicsIGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmFycmF5ID0gZnVuY3Rpb24gKGtleSwgdmFsLCBzcGVjLCB2YWxpZGF0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZl8odmFsKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZW9mXyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzcGVjLmxlbmd0aCAmJiB2YWwubGVuZ3RoICE9PSBzcGVjLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmQnLCBzcGVjLmxlbmd0aCwgdmFsLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsdWUgPSB7XG4gICAgICAgICAgICBcInR5cGVcIjogc3BlYy52YWx1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdHlsZS52ZXJzaW9uIDwgNykge1xuICAgICAgICAgICAgdmFsdWUuZnVuY3Rpb24gPSBzcGVjLmZ1bmN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZl8oc3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHNwZWMudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgKHZhbGlkYXRvciB8fCB2YWxpZGF0ZSkoa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuZmlsdGVyID0gZnVuY3Rpb24oa2V5LCB2YWwpIHtcbiAgICAgICAgdmFyIHR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZl8odmFsKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZW9mXyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJ1swXScsIHZhbFswXSwgcmVmZXJlbmNlLmZpbHRlcl9vcGVyYXRvcik7XG5cbiAgICAgICAgc3dpdGNoICh1bmJ1bmRsZSh2YWxbMF0pKSB7XG4gICAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID49IDIgJiYgdmFsWzFdID09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJXNcIicsIHZhbFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnPT0nOlxuICAgICAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoICE9IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsIHZhbFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgY2FzZSAnIWluJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2ZfKHZhbFsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1sxXScsIHZhbFsxXSwgJ3N0cmluZyBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxbMV1bMF0gPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1sxXScsIHZhbFsxXSwgJ2ZpbHRlciBrZXkgY2Fubm90IGJlIGEgY29uc3RhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZW9mXyh2YWxbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsWzFdID09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCByZWZlcmVuY2UuZ2VvbWV0cnlfdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsW2ldWzBdID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSArICdbJyArIGkgKyAnXScsIHZhbFtpXSwgJ2ZpbHRlciB2YWx1ZSBjYW5ub3QgYmUgYSBjb25zdGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCAnc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2FueSc6XG4gICAgICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZS5maWx0ZXIoa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuZnVuY3Rpb24gPSBmdW5jdGlvbihrZXksIHZhbCwgc3BlYykge1xuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHJlZmVyZW5jZS5mdW5jdGlvbiwge1xuICAgICAgICAgICAgc3RvcHM6IGZ1bmN0aW9uIChrZXksIHZhbCwgYXJyYXlTcGVjKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RTdG9wID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlLmFycmF5KGtleSwgdmFsLCBhcnJheVNwZWMsIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcChrZXksIHZhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mXyh2YWwpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3Ioa2V5LCB2YWwsICdhcnJheSBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlb2ZfKHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ2FycmF5IGxlbmd0aCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kJywgMiwgdmFsLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZShrZXkgKyAnWzBdJywgdmFsWzBdLCB7dHlwZTogJ251bWJlcid9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUoa2V5ICsgJ1sxXScsIHZhbFsxXSwgc3BlYyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZl8odmFsWzBdKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjLmZ1bmN0aW9uID09PSAncGllY2V3aXNlLWNvbnN0YW50JyAmJiB2YWxbMF0gJSAxICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1swXScsIHZhbFswXSwgJ3pvb20gbGV2ZWwgZm9yIHBpZWNld2lzZS1jb25zdGFudCBmdW5jdGlvbnMgbXVzdCBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxbMF0gPCBsYXN0U3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSArICdbMF0nLCB2YWxbMF0sICdhcnJheSBzdG9wcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFN0b3AgPSB2YWxbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2ZfKHZhbCkgPT09ICdhcnJheScgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmVudW0gPSBmdW5jdGlvbiAoa2V5LCB2YWwsIHNwZWMpIHtcbiAgICAgICAgaWYgKHNwZWMudmFsdWVzLmluZGV4T2YodW5idW5kbGUodmFsKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2V4cGVjdGVkIG9uZSBvZiBbJXNdLCAlcyBmb3VuZCcsIHNwZWMudmFsdWVzLmpvaW4oJywgJyksIHZhbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29sb3IgPSBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2NvbG9yIGV4cGVjdGVkLCAlcyBmb3VuZCcsIHR5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlQ1NTQ29sb3IodmFsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdjb2xvciBleHBlY3RlZCwgXCIlc1wiIGZvdW5kJywgdmFsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0eXBlVmFsaWRhdG9yKGV4cGVjdGVkKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbCwgc3BlYykge1xuICAgICAgICAgICAgdmFyIGFjdHVhbCA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICclcyBleHBlY3RlZCwgJXMgZm91bmQnLCBleHBlY3RlZCwgYWN0dWFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCdtaW5pbXVtJyBpbiBzcGVjICYmIHZhbCA8IHNwZWMubWluaW11bSkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnJXMgaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICVzJywgdmFsLCBzcGVjLm1pbmltdW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJ21heGltdW0nIGluIHNwZWMgJiYgdmFsID4gc3BlYy5tYXhpbXVtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICclcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJXMnLCB2YWwsIHNwZWMubWF4aW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFsaWRhdGUubnVtYmVyID0gdHlwZVZhbGlkYXRvcignbnVtYmVyJyk7XG4gICAgdmFsaWRhdGUuc3RyaW5nID0gdHlwZVZhbGlkYXRvcignc3RyaW5nJyk7XG4gICAgdmFsaWRhdGUuYm9vbGVhbiA9IHR5cGVWYWxpZGF0b3IoJ2Jvb2xlYW4nKTtcblxuICAgIHZhbGlkYXRlWycqJ10gPSBmdW5jdGlvbigpIHt9O1xuXG4gICAgdmFsaWRhdGUoJycsIHN0eWxlLCByZWZlcmVuY2UuJHJvb3QpO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbn07XG5cbmZ1bmN0aW9uIHR5cGVvZl8odmFsKSB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcilcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbilcbiAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgICAgICByZXR1cm4gJ2FycmF5JztcbiAgICBpZiAodmFsID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIHJldHVybiB0eXBlb2YgdmFsO1xufVxuXG5mdW5jdGlvbiB1bmJ1bmRsZShfKSB7XG4gICAgaWYgKF8gaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgXyBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBfIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gXy52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF87XG4gICAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3Y3Lmpzb24nKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCIkdmVyc2lvblwiOiA3LFxuICBcIiRyb290XCI6IHtcbiAgICBcInZlcnNpb25cIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICA3XG4gICAgICBdLFxuICAgICAgXCJkb2NcIjogXCJTdHlsZXNoZWV0IHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIDcuXCJcbiAgICB9LFxuICAgIFwibmFtZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiQSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgc3R5bGUuXCJcbiAgICB9LFxuICAgIFwiY29uc3RhbnRzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbnN0YW50c1wiLFxuICAgICAgXCJkb2NcIjogXCJBbiBvYmplY3Qgb2YgY29uc3RhbnRzIHRvIGJlIHJlZmVyZW5jZWQgaW4gbGF5ZXJzLlwiXG4gICAgfSxcbiAgICBcInNvdXJjZXNcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwic291cmNlc1wiLFxuICAgICAgXCJkb2NcIjogXCJEYXRhIHNvdXJjZSBzcGVjaWZpY2F0aW9ucy5cIlxuICAgIH0sXG4gICAgXCJzcHJpdGVcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkEgYmFzZSBVUkwgZm9yIHJldHJpZXZpbmcgdGhlIHNwcml0ZSBpbWFnZSBhbmQgbWV0YWRhdGEuIFRoZSBleHRlbnNpb25zIGAucG5nYCwgYC5qc29uYCBhbmQgc2NhbGUgZmFjdG9yIGBAMngucG5nYCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuXCJcbiAgICB9LFxuICAgIFwiZ2x5cGhzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJkb2NcIjogXCJBIFVSTCB0ZW1wbGF0ZSBmb3IgbG9hZGluZyBzaWduZWQtZGlzdGFuY2UtZmllbGQgZ2x5cGggc2V0cyBpbiBQQkYgZm9ybWF0LiBWYWxpZCB0b2tlbnMgYXJlIHtmb250c3RhY2t9IGFuZCB7cmFuZ2V9LlwiXG4gICAgfSxcbiAgICBcInRyYW5zaXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwidHJhbnNpdGlvblwiLFxuICAgICAgXCJkb2NcIjogXCJBIGdsb2JhbCB0cmFuc2l0aW9uIGRlZmluaXRpb24gdG8gdXNlIGFzIGEgZGVmYXVsdCBhY3Jvc3MgcHJvcGVydGllcy5cIlxuICAgIH0sXG4gICAgXCJsYXllcnNcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcbiAgICAgIFwidmFsdWVcIjogXCJsYXllclwiLFxuICAgICAgXCJkb2NcIjogXCJMYXllcnMgd2lsbCBiZSBkcmF3biBpbiB0aGUgb3JkZXIgb2YgdGhpcyBhcnJheS5cIlxuICAgIH1cbiAgfSxcbiAgXCJjb25zdGFudHNcIjoge1xuICAgIFwiKlwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCIsXG4gICAgICBcImRvY1wiOiBcIkEgY29uc3RhbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIHZlcmJhdGltIGluIHRoZSByZWZlcmVuY2luZyBwbGFjZS4gVGhpcyBjYW4gYmUgYW55dGhpbmcsIGluY2x1ZGluZyBvYmplY3RzIGFuZCBhcnJheXMuIEFsbCB2YXJpYWJsZSBuYW1lcyBtdXN0IGJlIHByZWZpeGVkIHdpdGggYW4gYEBgIHN5bWJvbC5cIlxuICAgIH1cbiAgfSxcbiAgXCJzb3VyY2VzXCI6IHtcbiAgICBcIipcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic291cmNlXCIsXG4gICAgICBcImRvY1wiOiBcIlNwZWNpZmljYXRpb24gb2YgYSBkYXRhIHNvdXJjZS4gRm9yIHZlY3RvciBhbmQgcmFzdGVyIHNvdXJjZXMsIGVpdGhlciBUaWxlSlNPTiBvciBhIFVSTCB0byBhIFRpbGVKU09OIG11c3QgYmUgcHJvdmlkZWQuIEZvciBHZW9KU09OIGFuZCB2aWRlbyBzb3VyY2VzLCBhIFVSTCBtdXN0IGJlIHByb3ZpZGVkLlwiXG4gICAgfVxuICB9LFxuICBcInNvdXJjZVwiOiBbXG4gICAgXCJzb3VyY2VfdGlsZVwiLFxuICAgIFwic291cmNlX2dlb2pzb25cIixcbiAgICBcInNvdXJjZV92aWRlb1wiXG4gIF0sXG4gIFwic291cmNlX3RpbGVcIjoge1xuICAgIFwidHlwZVwiOiB7XG4gICAgICBcInJlcXVpcmVkXCI6IHRydWUsXG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmVjdG9yXCIsXG4gICAgICAgIFwicmFzdGVyXCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIHNvdXJjZS5cIlxuICAgIH0sXG4gICAgXCJ1cmxcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkEgVVJMIHRvIGEgVGlsZUpTT04gcmVzb3VyY2UuIFN1cHBvcnRlZCBwcm90b2NvbHMgYXJlIGBodHRwOmAsIGBodHRwczpgLCBhbmQgYG1hcGJveDovLzxtYXBpZD5gLlwiXG4gICAgfSxcbiAgICBcInRpbGVzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHRpbGUgc291cmNlIFVSTHMsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwiXG4gICAgfSxcbiAgICBcIm1pbnpvb21cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwiZG9jXCI6IFwiTWluaW11bSB6b29tIGxldmVsIGZvciB3aGljaCB0aWxlcyBhcmUgYXZhaWxhYmxlLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy5cIlxuICAgIH0sXG4gICAgXCJtYXh6b29tXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDIyLFxuICAgICAgXCJkb2NcIjogXCJNYXhpbXVtIHpvb20gbGV2ZWwgZm9yIHdoaWNoIHRpbGVzIGFyZSBhdmFpbGFibGUsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLiBEYXRhIGZyb20gdGlsZXMgYXQgdGhlIG1heHpvb20gYXJlIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZSBtYXAgYXQgaGlnaGVyIHpvb20gbGV2ZWxzLlwiXG4gICAgfSxcbiAgICBcInRpbGVTaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDUxMixcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1pbmltdW0gdmlzdWFsIHNpemUgdG8gZGlzcGxheSB0aWxlcyBmb3IgdGhpcyBsYXllci4gT25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBsYXllcnMuXCJcbiAgICB9LFxuICAgIFwiKlwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCIsXG4gICAgICBcImRvY1wiOiBcIk90aGVyIGtleXMgdG8gY29uZmlndXJlIHRoZSBkYXRhIHNvdXJjZS5cIlxuICAgIH1cbiAgfSxcbiAgXCJzb3VyY2VfZ2VvanNvblwiOiB7XG4gICAgXCJ0eXBlXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJnZW9qc29uXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiZGF0YVwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCJcbiAgICB9XG4gIH0sXG4gIFwic291cmNlX3ZpZGVvXCI6IHtcbiAgICBcInR5cGVcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpZGVvXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidXJsXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIlVSTHMgdG8gdmlkZW8gY29udGVudCBpbiBvcmRlciBvZiBwcmVmZXJyZWQgZm9ybWF0LlwiXG4gICAgfSxcbiAgICBcImNvb3JkaW5hdGVzXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcImxlbmd0aFwiOiA0LFxuICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICAgIFwibGVuZ3RoXCI6IDIsXG4gICAgICAgIFwidmFsdWVcIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgXCJsYXllclwiOiB7XG4gICAgXCJpZFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiVW5pcXVlIGxheWVyIG5hbWUuXCJcbiAgICB9LFxuICAgIFwidHlwZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwiZmlsbFwiLFxuICAgICAgICBcImxpbmVcIixcbiAgICAgICAgXCJzeW1ib2xcIixcbiAgICAgICAgXCJyYXN0ZXJcIixcbiAgICAgICAgXCJiYWNrZ3JvdW5kXCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIlJlbmRlcmluZyB0eXBlIG9mIHRoaXMgbGF5ZXIuXCJcbiAgICB9LFxuICAgIFwicmVmXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJkb2NcIjogXCJSZWZlcmVuY2VzIGFub3RoZXIgbGF5ZXIgdG8gY29weSBgdHlwZWAsIGBzb3VyY2VgLCBgc291cmNlLWxheWVyYCwgYG1pbnpvb21gLCBgbWF4em9vbWAsIGBmaWx0ZXJgLCBhbmQgYGxheW91dGAgcHJvcGVydGllcyBmcm9tLiBUaGlzIGFsbG93cyB0aGUgbGF5ZXJzIHRvIHNoYXJlIHByb2Nlc3NpbmcgYW5kIGJlIG1vcmUgZWZmaWNpZW50LlwiXG4gICAgfSxcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiTmFtZSBvZiBhIHNvdXJjZSBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGxheWVyLlwiXG4gICAgfSxcbiAgICBcInNvdXJjZS1sYXllclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiTGF5ZXIgdG8gdXNlIGZyb20gYSB2ZWN0b3IgdGlsZSBzb3VyY2UuIFJlcXVpcmVkIGlmIHRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGlwbGUgbGF5ZXJzLlwiXG4gICAgfSxcbiAgICBcIm1pbnpvb21cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAyMixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvbiB3aGljaCB0aGUgbGF5ZXIgZ2V0cyBwYXJzZWQgYW5kIGFwcGVhcnMgb24uXCJcbiAgICB9LFxuICAgIFwibWF4em9vbVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJtYXhpbXVtXCI6IDIyLFxuICAgICAgXCJkb2NcIjogXCJUaGUgbWF4aW11bSB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsYXllciBnZXRzIHBhcnNlZCBhbmQgYXBwZWFycyBvbi5cIlxuICAgIH0sXG4gICAgXCJpbnRlcmFjdGl2ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImRvY1wiOiBcIkVuYWJsZSBxdWVyeWluZyBvZiBmZWF0dXJlIGRhdGEgZnJvbSB0aGlzIGxheWVyIGZvciBpbnRlcmFjdGl2aXR5LlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlXG4gICAgfSxcbiAgICBcImZpbHRlclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJmaWx0ZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiQSBleHByZXNzaW9uIHNwZWNpZnlpbmcgY29uZGl0aW9ucyBvbiBzb3VyY2UgZmVhdHVyZXMuIE9ubHkgZmVhdHVyZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIGFyZSBkaXNwbGF5ZWQuXCJcbiAgICB9LFxuICAgIFwibGF5b3V0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImxheW91dFwiLFxuICAgICAgXCJkb2NcIjogXCJMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlwiXG4gICAgfSxcbiAgICBcInBhaW50XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInBhaW50XCIsXG4gICAgICBcImRvY1wiOiBcIkRlZmF1bHQgcGFpbnQgcHJvcGVydGllcyBmb3IgdGhpcyBsYXllci5cIlxuICAgIH0sXG4gICAgXCJwYWludC4qXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInBhaW50XCIsXG4gICAgICBcImRvY1wiOiBcIkNsYXNzLXNwZWNpZmljIHBhaW50IHByb3BlcnRpZXMgZm9yIHRoaXMgbGF5ZXIuIFRoZSBjbGFzcyBuYW1lIGlzIHRoZSBwYXJ0IGFmdGVyIHRoZSBmaXJzdCBkb3QuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0XCI6IFtcbiAgICBcImxheW91dF9maWxsXCIsXG4gICAgXCJsYXlvdXRfbGluZVwiLFxuICAgIFwibGF5b3V0X3N5bWJvbFwiLFxuICAgIFwibGF5b3V0X3Jhc3RlclwiLFxuICAgIFwibGF5b3V0X2JhY2tncm91bmRcIlxuICBdLFxuICBcImxheW91dF9iYWNrZ3JvdW5kXCI6IHtcbiAgICBcInZpc2liaWxpdHlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpc2libGVcIixcbiAgICAgICAgXCJub25lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aXNpYmxlXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwiXG4gICAgfVxuICB9LFxuICBcImxheW91dF9maWxsXCI6IHtcbiAgICBcInZpc2liaWxpdHlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpc2libGVcIixcbiAgICAgICAgXCJub25lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aXNpYmxlXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwiXG4gICAgfVxuICB9LFxuICBcImxheW91dF9saW5lXCI6IHtcbiAgICBcImxpbmUtY2FwXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJidXR0XCIsXG4gICAgICAgIFwicm91bmRcIixcbiAgICAgICAgXCJzcXVhcmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcImJ1dHRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgbGluZSBlbmRpbmdzLlwiXG4gICAgfSxcbiAgICBcImxpbmUtam9pblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwiYmV2ZWxcIixcbiAgICAgICAgXCJyb3VuZFwiLFxuICAgICAgICBcIm1pdGVyXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJtaXRlclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZGlzcGxheSBvZiBsaW5lcyB3aGVuIGpvaW5pbmcuXCJcbiAgICB9LFxuICAgIFwibGluZS1taXRlci1saW1pdFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAyLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJVc2VkIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydCBtaXRlciBqb2lucyB0byBiZXZlbCBqb2lucyBmb3Igc2hhcnAgYW5nbGVzLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxpbmUtam9pblwiOiBcIm1pdGVyXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlVzZWQgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IHJvdW5kIGpvaW5zIHRvIG1pdGVyIGpvaW5zIGZvciBzaGFsbG93IGFuZ2xlcy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsaW5lLWpvaW5cIjogXCJyb3VuZFwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwidmlzaWJpbGl0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmlzaWJsZVwiLFxuICAgICAgICBcIm5vbmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcInZpc2libGVcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0X3N5bWJvbFwiOiB7XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgICBcInBvaW50XCIsXG4gICAgICAgICAgXCJsaW5lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJwb2ludFwiLFxuICAgICAgXCJkb2NcIjogXCJMYWJlbCBwbGFjZW1lbnQgcmVsYXRpdmUgdG8gaXRzIGdlb21ldHJ5LiBgbGluZWAgY2FuIG9ubHkgYmUgdXNlZCBvbiBMaW5lU3RyaW5ncyBhbmQgUG9seWdvbnMuXCJcbiAgICB9LFxuICAgIFwic3ltYm9sLW1pbi1kaXN0YW5jZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAyNTAsXG4gICAgICBcIm1pbmltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiTWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzeW1ib2wgYW5jaG9ycy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFwibGluZVwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBmYWxzZSxcbiAgICAgIFwiZG9jXCI6IFwiSWYgdHJ1ZSwgdGhlIHN5bWJvbHMgd2lsbCBub3QgY3Jvc3MgdGlsZSBlZGdlcyB0byBhdm9pZCBtdXR1YWwgY29sbGlzaW9ucy4gUmVjb21tZW5kZWQgaW4gbGF5ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBlbm91Z2ggcGFkZGluZyBpbiB0aGUgdmVjdG9yIHRpbGUgdG8gcHJldmVudCBjb2xsaXNpb25zLCBvciBpZiBpdCBpcyBhIHBvaW50IHN5bWJvbCBsYXllciBwbGFjZWQgYWZ0ZXIgYSBsaW5lIHN5bWJvbCBsYXllci5cIlxuICAgIH0sXG4gICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgaWNvbiB3aWxsIGJlIHZpc2libGUgZXZlbiBpZiBpdCBjb2xsaWRlcyB3aXRoIG90aGVyIGljb25zIGFuZCB0ZXh0LlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBpY29uIHdvbid0IGFmZmVjdCBwbGFjZW1lbnQgb2Ygb3RoZXIgaWNvbnMgYW5kIHRleHQuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBzeW1ib2wgd2lsbCBhcHBlYXIgd2l0aG91dCBpdHMgaWNvbiwgaW4gc3BhY2VzIHdoZXJlIHRoZSBpY29uIHdvdWxkIG1ha2UgaXQgdG9vIGxhcmdlIHRvIGZpdC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aWV3cG9ydFwiLFxuICAgICAgXCJkb2NcIjogXCJPcmllbnRhdGlvbiBvZiBpY29uIHdoZW4gbWFwIGlzIHJvdGF0ZWQuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1tYXgtc2l6ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBtYXhpbXVtIGZhY3RvciB0byBzY2FsZSB0aGUgaWNvbi5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkb2NcIjogXCJBIHN0cmluZyB3aXRoIHt0b2tlbnN9IHJlcGxhY2VkLCByZWZlcmVuY2luZyB0aGUgZGF0YSBwcm9wZXJ0eSB0byBwdWxsIGZyb20uXCIsXG4gICAgICBcInRva2Vuc1wiOiB0cnVlXG4gICAgfSxcbiAgICBcImljb24tcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInVuaXRzXCI6IFwiZGVncmVlc1wiLFxuICAgICAgXCJkb2NcIjogXCJSb3RhdGVzIHRoZSBpY29uIGNsb2Nrd2lzZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLXBhZGRpbmdcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJQYWRkaW5nIHZhbHVlIGFyb3VuZCBpY29uIGJvdW5kaW5nIGJveCB0byBhdm9pZCBpY29uIGNvbGxpc2lvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgaWNvbiBtYXkgYmUgZmxpcHBlZCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVuZGVyZWQgdXBzaWRlLWRvd25cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAge1xuICAgICAgICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24tb2Zmc2V0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiSWNvbidzIG9mZnNldCBkaXN0YW5jZS4gVmFsdWVzIGFyZSBbeCwgeV0gd2hlcmUgbmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLCByZXNwZWN0aXZlbHkuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aWV3cG9ydFwiLFxuICAgICAgXCJkb2NcIjogXCJPcmllbnRhdGlvbiBvZiBpY29uIG9yIHRleHQgd2hlbiBtYXAgaXMgcm90YXRlZC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiXCIsXG4gICAgICBcInRva2Vuc1wiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJWYWx1ZSB0byB1c2UgZm9yIGEgdGV4dCBsYWJlbC4gRmVhdHVyZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdG9rZW5zIGxpa2Uge2ZpZWxkX25hbWV9LlwiXG4gICAgfSxcbiAgICBcInRleHQtZm9udFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIk9wZW4gU2FucyBSZWd1bGFyLCBBcmlhbCBVbmljb2RlIE1TIFJlZ3VsYXJcIixcbiAgICAgIFwiZG9jXCI6IFwiRm9udCBzdGFjayB0byB1c2UgZm9yIGRpc3BsYXlpbmcgdGV4dC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW1heC1zaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDE2LFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBtYXhpbXVtIHNpemUgdGV4dCB3aWxsIGJlIGxhaWQgb3V0LCB0byBjYWxjdWxhdGUgY29sbGlzaW9ucyB3aXRoLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDE1LFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwiZW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1heGltdW0gbGluZSB3aWR0aCBmb3IgdGV4dCB3cmFwcGluZy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEuMixcbiAgICAgIFwidW5pdHNcIjogXCJlbVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJUZXh0IGxlYWRpbmcgdmFsdWUgZm9yIG11bHRpLWxpbmUgdGV4dC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwiZW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGV4dCBrZXJuaW5nIHZhbHVlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtanVzdGlmeVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibGVmdFwiLFxuICAgICAgICBcImNlbnRlclwiLFxuICAgICAgICBcInJpZ2h0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJjZW50ZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGV4dCBqdXN0aWZpY2F0aW9uIG9wdGlvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcImNlbnRlclwiLFxuICAgICAgICBcImxlZnRcIixcbiAgICAgICAgXCJyaWdodFwiLFxuICAgICAgICBcInRvcFwiLFxuICAgICAgICBcImJvdHRvbVwiLFxuICAgICAgICBcInRvcC1sZWZ0XCIsXG4gICAgICAgIFwidG9wLXJpZ2h0XCIsXG4gICAgICAgIFwiYm90dG9tLWxlZnRcIixcbiAgICAgICAgXCJib3R0b20tcmlnaHRcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcImNlbnRlclwiLFxuICAgICAgXCJkb2NcIjogXCJXaGljaCBwYXJ0IG9mIHRoZSB0ZXh0IHRvIHBsYWNlIGNsb3Nlc3QgdG8gdGhlIGFuY2hvci5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiA0NSxcbiAgICAgIFwidW5pdHNcIjogXCJkZWdyZWVzXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIk1heGltdW0gYW5nbGUgY2hhbmdlIGJldHdlZW4gYWRqYWNlbnQgY2hhcmFjdGVycy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAge1xuICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBcImxpbmVcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcInVuaXRzXCI6IFwiZGVncmVlc1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJSb3RhdGVzIHRoZSB0ZXh0IGNsb2Nrd2lzZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LXBhZGRpbmdcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJQYWRkaW5nIHZhbHVlIGFyb3VuZCB0ZXh0IGJvdW5kaW5nIGJveCB0byBhdm9pZCBsYWJlbCBjb2xsaXNpb25zLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgdGV4dCBtYXkgYmUgZmxpcHBlZCB2ZXJ0aWNhbGx5IHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZW5kZXJlZCB1cHNpZGUtZG93bi5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAge1xuICAgICAgICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJub25lXCIsXG4gICAgICAgIFwidXBwZXJjYXNlXCIsXG4gICAgICAgIFwibG93ZXJjYXNlXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJub25lXCIsXG4gICAgICBcImRvY1wiOiBcIlNwZWNpZmllcyBob3cgdG8gY2FwaXRhbGl6ZSB0ZXh0LCBzaW1pbGFyIHRvIHRoZSBDU1MgYHRleHQtdHJhbnNmb3JtYCBwcm9wZXJ0eS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW9mZnNldFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJkb2NcIjogXCJTcGVjaWZpZXMgdGhlIGRpc3RhbmNlIHRoYXQgdGV4dCBpcyBvZmZzZXQgZnJvbSBpdHMgYW5jaG9yIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS5cIixcbiAgICAgIFwidmFsdWVcIjogXCJudW1iZXJcIixcbiAgICAgIFwidW5pdHNcIjogXCJlbXNcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwibGVuZ3RoXCI6IDIsXG4gICAgICBcImRlZmF1bHRcIjogW1xuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICBdLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgdmlzaWJsZSBldmVuIGlmIGl0IGNvbGxpZGVzIHdpdGggb3RoZXIgaWNvbnMgYW5kIGxhYmVscy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgdGV4dCB3b24ndCBhZmZlY3QgcGxhY2VtZW50IG9mIG90aGVyIGljb25zIGFuZCBsYWJlbHMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBzeW1ib2wgd2lsbCBhcHBlYXIgd2l0aG91dCBpdHMgdGV4dCwgaW4gc3BhY2VzIHdoZXJlIHRoZSB0ZXh0IHdvdWxkIG1ha2UgaXQgdG9vIGxhcmdlIHRvIGZpdC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidmlzaWJpbGl0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmlzaWJsZVwiLFxuICAgICAgICBcIm5vbmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcInZpc2libGVcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0X3Jhc3RlclwiOiB7XG4gICAgXCJ2aXNpYmlsaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJ2aXNpYmxlXCIsXG4gICAgICAgIFwibm9uZVwiXG4gICAgICBdLFxuICAgICAgXCJkZWZhdWx0XCI6IFwidmlzaWJsZVwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZGlzcGxheSBvZiB0aGlzIGxheWVyLiBgbm9uZWAgaGlkZXMgdGhpcyBsYXllci5cIlxuICAgIH1cbiAgfSxcbiAgXCJmaWx0ZXJcIjoge1xuICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgXCJ2YWx1ZVwiOiBcIipcIlxuICB9LFxuICBcImZpbHRlcl9vcGVyYXRvclwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgIFwidmFsdWVzXCI6IFtcbiAgICAgIFwiPT1cIixcbiAgICAgIFwiIT1cIixcbiAgICAgIFwiPlwiLFxuICAgICAgXCI+PVwiLFxuICAgICAgXCI8XCIsXG4gICAgICBcIjw9XCIsXG4gICAgICBcImluXCIsXG4gICAgICBcIiFpblwiLFxuICAgICAgXCJhbGxcIixcbiAgICAgIFwiYW55XCIsXG4gICAgICBcIm5vbmVcIlxuICAgIF1cbiAgfSxcbiAgXCJnZW9tZXRyeV90eXBlXCI6IHtcbiAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgXCJQb2ludFwiLFxuICAgICAgXCJMaW5lU3RyaW5nXCIsXG4gICAgICBcIlBvbHlnb25cIlxuICAgIF1cbiAgfSxcbiAgXCJmdW5jdGlvblwiOiB7XG4gICAgXCJzdG9wc1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJBbiBhcnJheSBvZiBzdG9wcy5cIixcbiAgICAgIFwidmFsdWVcIjogXCJmdW5jdGlvbl9zdG9wXCJcbiAgICB9LFxuICAgIFwiYmFzZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImRvY1wiOiBcIlRoZSBleHBvbmVudGlhbCBiYXNlIG9mIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnZlLiBJdCBjb250cm9scyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgcmVzdWx0IGluY3JlYXNlcy4gSGlnaGVyIHZhbHVlcyBtYWtlIHRoZSByZXN1bHQgaW5jcmVhc2UgbW9yZSB0b3dhcmRzIHRoZSBoaWdoIGVuZCBvZiB0aGUgcmFuZ2UuIFdpdGggYDFgIHRoZSBzdG9wcyBhcmUgaW50ZXJwb2xhdGVkIGxpbmVhcmx5LlwiXG4gICAgfVxuICB9LFxuICBcImZ1bmN0aW9uX3N0b3BcIjoge1xuICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgXCJtYXhpbXVtXCI6IDIyLFxuICAgIFwidmFsdWVcIjogW1xuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiY29sb3JcIlxuICAgIF0sXG4gICAgXCJsZW5ndGhcIjogMixcbiAgICBcImRvY1wiOiBcIlpvb20gbGV2ZWwgYW5kIHZhbHVlIHBhaXIuXCJcbiAgfSxcbiAgXCJwYWludFwiOiBbXG4gICAgXCJwYWludF9maWxsXCIsXG4gICAgXCJwYWludF9saW5lXCIsXG4gICAgXCJwYWludF9zeW1ib2xcIixcbiAgICBcInBhaW50X3Jhc3RlclwiLFxuICAgIFwicGFpbnRfYmFja2dyb3VuZFwiXG4gIF0sXG4gIFwicGFpbnRfZmlsbFwiOiB7XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiV2hldGhlciBvciBub3QgdGhlIGZpbGwgc2hvdWxkIGJlIGFudGlhbGlhc2VkLlwiXG4gICAgfSxcbiAgICBcImZpbGwtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgZ2l2ZW4gdG8gdGhlIGZpbGwgY29sb3IuXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJmaWxsLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCIjMDAwMDAwXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBjb2xvciBvZiB0aGUgZmlsbC5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJmaWxsLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG91dGxpbmUgY29sb3Igb2YgdGhlIGZpbGwuIE1hdGNoZXMgdGhlIHZhbHVlIG9mIGBmaWxsLWNvbG9yYCBpZiB1bnNwZWNpZmllZC5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJmaWxsLWltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiZmlsbC1hbnRpYWxpYXNcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcImZpbGwtdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwiXG4gICAgfSxcbiAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibWFwXCIsXG4gICAgICAgIFwidmlld3BvcnRcIlxuICAgICAgXSxcbiAgICAgIFwiZG9jXCI6IFwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbilcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIm1hcFwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiZmlsbC10cmFuc2xhdGVcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJmaWxsLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBmaWxscy5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9saW5lXCI6IHtcbiAgICBcImxpbmUtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGxpbmUgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlXG4gICAgfSxcbiAgICBcImxpbmUtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIHdpdGggd2hpY2ggdGhlIGxpbmUgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIiMwMDAwMDBcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJsaW5lLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJsZW5ndGhcIjogMixcbiAgICAgIFwiZGVmYXVsdFwiOiBbXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIF0sXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGdlb21ldHJ5J3Mgb2Zmc2V0LiBWYWx1ZXMgYXJlIFt4LCB5XSB3aGVyZSBuZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAsIHJlc3BlY3RpdmVseS5cIlxuICAgIH0sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJtYXBcIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImxpbmUtdHJhbnNsYXRlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwibGluZS13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiU3Ryb2tlIHRoaWNrbmVzcy5cIlxuICAgIH0sXG4gICAgXCJsaW5lLWdhcC13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImRvY1wiOiBcIkRyYXdzIGEgbGluZSBjYXNpbmcgb3V0c2lkZSBvZiBhIGxpbmUncyBhY3R1YWwgcGF0aC4gVmFsdWUgaW5kaWNhdGVzIHRoZSB3aWR0aCBvZiB0aGUgaW5uZXIgZ2FwLlwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCJcbiAgICB9LFxuICAgIFwibGluZS1ibHVyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJCbHVyIGFwcGxpZWQgdG8gdGhlIGxpbmUsIGluIHBpeGVscy5cIlxuICAgIH0sXG4gICAgXCJsaW5lLWRhc2hhcnJheVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJTcGVjaWZpZXMgdGhlIGxlbmd0aHMgb2YgdGhlIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgZ2FwcyB0aGF0IGZvcm0gdGhlIGRhc2ggcGF0dGVybi4gVGhlIGxlbmd0aHMgYXJlIGxhdGVyIHNjYWxlZCBieSB0aGUgbGluZSB3aWR0aC4gVG8gY29udmVydCBhIGRhc2ggbGVuZ3RoIHRvIHBpeGVscywgbXVsdGlwbHkgdGhlIGxlbmd0aCBieSB0aGUgY3VycmVudCBsaW5lIHdpZHRoLlwiLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJsaW5lIHdpZHRoc1wiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJsaW5lLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBsaW5lcy5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9zeW1ib2xcIjoge1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IHtcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGljb24gd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1zaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiU2NhbGUgZmFjdG9yIGZvciBpY29uLiAxIGlzIG9yaWdpbmFsIHNpemUsIDMgdHJpcGxlcyB0aGUgc2l6ZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCIjMDAwMDAwXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSBpY29uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSBpY29uJ3MgaGFsby4gSWNvbiBoYWxvcyBjYW4gb25seSBiZSB1c2VkIHdpdGggc2RmIGljb25zLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taGFsby13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiRGlzdGFuY2Ugb2YgaGFsbyB0byB0aGUgaWNvbiBvdXRsaW5lLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taGFsby1ibHVyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJGYWRlIG91dCB0aGUgaGFsbyB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJBbiBpY29uJ3Mgb2Zmc2V0IGRpc3RhbmNlLiBWYWx1ZXMgYXJlIFt4LCB5XSB3aGVyZSBuZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAsIHJlc3BlY3RpdmVseS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJtYXBcIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAgXCJpY29uLXRyYW5zbGF0ZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIHRleHQgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtc2l6ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxNixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImRvY1wiOiBcIkZvbnQgc2l6ZS4gSWYgdW5zcGVjaWZpZWQsIHRoZSB0ZXh0IHdpbGwgYmUgYXMgYmlnIGFzIGFsbG93ZWQgYnkgdGhlIGxheWVyIGRlZmluaXRpb24uXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1jb2xvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJjb2xvclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgY29sb3Igd2l0aCB3aGljaCB0aGUgdGV4dCB3aWxsIGJlIGRyYXduLlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiIzAwMDAwMFwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSB0ZXh0J3MgaGFsbywgd2hpY2ggaGVscHMgaXQgc3RhbmQgb3V0IGZyb20gYmFja2dyb3VuZHMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLXdpZHRoXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJEaXN0YW5jZSBvZiBoYWxvIHRvIHRoZSBmb250IG91dGxpbmUuIE1heCB0ZXh0IGhhbG8gd2lkdGggaXMgMS80IG9mIHRoZSBmb250LXNpemUuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBoYWxvJ3MgZmFkZW91dCBkaXN0YW5jZSB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJMYWJlbCBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibWFwXCIsXG4gICAgICAgIFwidmlld3BvcnRcIlxuICAgICAgXSxcbiAgICAgIFwiZG9jXCI6IFwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbilcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIm1hcFwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiLFxuICAgICAgICBcInRleHQtdHJhbnNsYXRlXCJcbiAgICAgIF1cbiAgICB9XG4gIH0sXG4gIFwicGFpbnRfcmFzdGVyXCI6IHtcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgaW1hZ2Ugd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlXG4gICAgfSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJkZWdyZWVzXCIsXG4gICAgICBcImRvY1wiOiBcIlJvdGF0ZXMgaHVlcyBhcm91bmQgdGhlIGNvbG9yIHdoZWVsLlwiXG4gICAgfSxcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtaW5pbXVtIGJyaWdodG5lc3MuXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJtYXhpbXVtXCI6IDEsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIkluY3JlYXNlIG9yIHJlZHVjZSB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgaW1hZ2UuIFRoZSB2YWx1ZSBpcyB0aGUgbWF4aW11bSBicmlnaHRuZXNzLlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9LFxuICAgIFwicmFzdGVyLXNhdHVyYXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRvY1wiOiBcIkluY3JlYXNlIG9yIHJlZHVjZSB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgaW1hZ2UuXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAtMSxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9LFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IC0xLFxuICAgICAgXCJtYXhpbXVtXCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAzMDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgXCJkb2NcIjogXCJGYWRlIGR1cmF0aW9uIHdoZW4gYSBuZXcgdGlsZSBpcyBhZGRlZC5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9iYWNrZ3JvdW5kXCI6IHtcbiAgICBcImJhY2tncm91bmQtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIiMwMDAwMDBcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIHdpdGggd2hpY2ggdGhlIGJhY2tncm91bmQgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJiYWNrZ3JvdW5kLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJiYWNrZ3JvdW5kLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk9wdGlvbmFsbHkgYW4gaW1hZ2Ugd2hpY2ggaXMgZHJhd24gYXMgdGhlIGJhY2tncm91bmQuXCJcbiAgICB9LFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJkb2NcIjogXCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIGRyYXduLlwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9XG4gIH0sXG4gIFwidHJhbnNpdGlvblwiOiB7XG4gICAgXCJkdXJhdGlvblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAzMDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwidW5pdHNcIjogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGltZSBhbGxvdHRlZCBmb3IgdHJhbnNpdGlvbnMgdG8gY29tcGxldGUuXCJcbiAgICB9LFxuICAgIFwiZGVsYXlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJ1bml0c1wiOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgXCJkb2NcIjogXCJMZW5ndGggb2YgdGltZSBiZWZvcmUgYSB0cmFuc2l0aW9uIGJlZ2lucy5cIlxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgICAgIH0sXG4gICAgc3ViOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIocCk7ICAgICB9LFxuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgICAgfSxcbiAgICBkaXY6ICAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdihrKTsgICAgIH0sXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7ICB9LFxuICAgIG1hdE11bHQ6IGZ1bmN0aW9uKG0pIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdChtKTsgfSxcbiAgICB1bml0OiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpOyB9LFxuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICBtYWc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgfSxcblxuICAgIGVxdWFsczogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBwLnggJiZcbiAgICAgICAgICAgICAgIHRoaXMueSA9PT0gcC55O1xuICAgIH0sXG5cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICBhbmdsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoYi54LCBiLnkpO1xuICAgIH0sXG5cbiAgICAvLyBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RzIFBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5XG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvKlxuIChjKSAyMDEzLCBWbGFkaW1pciBBZ2Fmb25raW5cbiBSQnVzaCwgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2gtcGVyZm9ybWFuY2UgMkQgc3BhdGlhbCBpbmRleGluZyBvZiBwb2ludHMgYW5kIHJlY3RhbmdsZXMuXG4gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcmJ1c2hcbiovXG5cbihmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gcmJ1c2gobWF4RW50cmllcywgZm9ybWF0KSB7XG5cbiAgICAvLyBqc2hpbnQgbmV3Y2FwOiBmYWxzZSwgdmFsaWR0aGlzOiB0cnVlXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHJidXNoKSkgcmV0dXJuIG5ldyByYnVzaChtYXhFbnRyaWVzLCBmb3JtYXQpO1xuXG4gICAgLy8gbWF4IGVudHJpZXMgaW4gYSBub2RlIGlzIDkgYnkgZGVmYXVsdDsgbWluIG5vZGUgZmlsbCBpcyA0MCUgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGlzLl9tYXhFbnRyaWVzID0gTWF0aC5tYXgoNCwgbWF4RW50cmllcyB8fCA5KTtcbiAgICB0aGlzLl9taW5FbnRyaWVzID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKHRoaXMuX21heEVudHJpZXMgKiAwLjQpKTtcblxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdGhpcy5faW5pdEZvcm1hdChmb3JtYXQpO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcbn1cblxucmJ1c2gucHJvdG90eXBlID0ge1xuXG4gICAgYWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLCBbXSk7XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKGJib3gpIHtcblxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgICAgdG9CQm94ID0gdGhpcy50b0JCb3g7XG5cbiAgICAgICAgaWYgKCFpbnRlcnNlY3RzKGJib3gsIG5vZGUuYmJveCkpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5vZGVzVG9TZWFyY2ggPSBbXSxcbiAgICAgICAgICAgIGksIGxlbiwgY2hpbGQsIGNoaWxkQkJveDtcblxuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGNoaWxkQkJveCA9IG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94O1xuXG4gICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdHMoYmJveCwgY2hpbGRCQm94KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWFmKSByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRhaW5zKGJib3gsIGNoaWxkQkJveCkpIHRoaXMuX2FsbChjaGlsZCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBub2Rlc1RvU2VhcmNoLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBub2Rlc1RvU2VhcmNoLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgY29sbGlkZXM6IGZ1bmN0aW9uIChiYm94KSB7XG5cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB0b0JCb3ggPSB0aGlzLnRvQkJveDtcblxuICAgICAgICBpZiAoIWludGVyc2VjdHMoYmJveCwgbm9kZS5iYm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW10sXG4gICAgICAgICAgICBpLCBsZW4sIGNoaWxkLCBjaGlsZEJCb3g7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBjaGlsZEJCb3ggPSBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQuYmJveDtcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3RzKGJib3gsIGNoaWxkQkJveCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVhZiB8fCBjb250YWlucyhiYm94LCBjaGlsZEJCb3gpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1NlYXJjaC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZXNUb1NlYXJjaC5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCEoZGF0YSAmJiBkYXRhLmxlbmd0aCkpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IHRoaXMuX21pbkVudHJpZXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoZGF0YVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGJ1aWxkIHRoZSB0cmVlIHdpdGggdGhlIGdpdmVuIGRhdGEgZnJvbSBzdHJhdGNoIHVzaW5nIE9NVCBhbGdvcml0aG1cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9idWlsZChkYXRhLnNsaWNlKCksIDAsIGRhdGEubGVuZ3RoIC0gMSwgMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBzYXZlIGFzIGlzIGlmIHRyZWUgaXMgZW1wdHlcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5vZGU7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuaGVpZ2h0ID09PSBub2RlLmhlaWdodCkge1xuICAgICAgICAgICAgLy8gc3BsaXQgcm9vdCBpZiB0cmVlcyBoYXZlIHRoZSBzYW1lIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSwgbm9kZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaGVpZ2h0IDwgbm9kZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAvLyBzd2FwIHRyZWVzIGlmIGluc2VydGVkIG9uZSBpcyBiaWdnZXJcbiAgICAgICAgICAgICAgICB2YXIgdG1wTm9kZSA9IHRoaXMuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0bXBOb2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnNlcnQgdGhlIHNtYWxsIHRyZWUgaW50byB0aGUgbGFyZ2UgdHJlZSBhdCBhcHByb3ByaWF0ZSBsZXZlbFxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0KG5vZGUsIHRoaXMuZGF0YS5oZWlnaHQgLSBub2RlLmhlaWdodCAtIDEsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGluc2VydDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuX2luc2VydChpdGVtLCB0aGlzLmRhdGEuaGVpZ2h0IC0gMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgICAgICBiYm94OiBlbXB0eSgpLFxuICAgICAgICAgICAgbGVhZjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgYmJveCA9IHRoaXMudG9CQm94KGl0ZW0pLFxuICAgICAgICAgICAgcGF0aCA9IFtdLFxuICAgICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgaSwgcGFyZW50LCBpbmRleCwgZ29pbmdVcDtcblxuICAgICAgICAvLyBkZXB0aC1maXJzdCBpdGVyYXRpdmUgdHJlZSB0cmF2ZXJzYWxcbiAgICAgICAgd2hpbGUgKG5vZGUgfHwgcGF0aC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgaWYgKCFub2RlKSB7IC8vIGdvIHVwXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhdGgucG9wKCk7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGkgPSBpbmRleGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGdvaW5nVXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmKSB7IC8vIGNoZWNrIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgICAgIGluZGV4ID0gbm9kZS5jaGlsZHJlbi5pbmRleE9mKGl0ZW0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIGZvdW5kLCByZW1vdmUgdGhlIGl0ZW0gYW5kIGNvbmRlbnNlIHRyZWUgdXB3YXJkc1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZGVuc2UocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFnb2luZ1VwICYmICFub2RlLmxlYWYgJiYgY29udGFpbnMobm9kZS5iYm94LCBiYm94KSkgeyAvLyBnbyBkb3duXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzBdO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCkgeyAvLyBnbyByaWdodFxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50LmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGdvaW5nVXAgPSBmYWxzZTtcblxuICAgICAgICAgICAgfSBlbHNlIG5vZGUgPSBudWxsOyAvLyBub3RoaW5nIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgdG9CQm94OiBmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbTsgfSxcblxuICAgIGNvbXBhcmVNaW5YOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF07IH0sXG4gICAgY29tcGFyZU1pblk6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhWzFdIC0gYlsxXTsgfSxcblxuICAgIHRvSlNPTjogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kYXRhOyB9LFxuXG4gICAgZnJvbUpTT046IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWxsOiBmdW5jdGlvbiAobm9kZSwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW107XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmKSByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZWxzZSBub2Rlc1RvU2VhcmNoLnB1c2guYXBwbHkobm9kZXNUb1NlYXJjaCwgbm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2Rlc1RvU2VhcmNoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIF9idWlsZDogZnVuY3Rpb24gKGl0ZW1zLCBsZWZ0LCByaWdodCwgaGVpZ2h0KSB7XG5cbiAgICAgICAgdmFyIE4gPSByaWdodCAtIGxlZnQgKyAxLFxuICAgICAgICAgICAgTSA9IHRoaXMuX21heEVudHJpZXMsXG4gICAgICAgICAgICBub2RlO1xuXG4gICAgICAgIGlmIChOIDw9IE0pIHtcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgbGVhZiBsZXZlbDsgcmV0dXJuIGxlYWZcbiAgICAgICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW1zLnNsaWNlKGxlZnQsIHJpZ2h0ICsgMSksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICAgICAgICAgIGJib3g6IG51bGwsXG4gICAgICAgICAgICAgICAgbGVhZjogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhbGNCQm94KG5vZGUsIHRoaXMudG9CQm94KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIHRhcmdldCBoZWlnaHQgb2YgdGhlIGJ1bGstbG9hZGVkIHRyZWVcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChNYXRoLmxvZyhOKSAvIE1hdGgubG9nKE0pKTtcblxuICAgICAgICAgICAgLy8gdGFyZ2V0IG51bWJlciBvZiByb290IGVudHJpZXMgdG8gbWF4aW1pemUgc3RvcmFnZSB1dGlsaXphdGlvblxuICAgICAgICAgICAgTSA9IE1hdGguY2VpbChOIC8gTWF0aC5wb3coTSwgaGVpZ2h0IC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBlbGltaW5hdGUgcmVjdXJzaW9uP1xuXG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIGJib3g6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzcGxpdCB0aGUgaXRlbXMgaW50byBNIG1vc3RseSBzcXVhcmUgdGlsZXNcblxuICAgICAgICB2YXIgTjIgPSBNYXRoLmNlaWwoTiAvIE0pLFxuICAgICAgICAgICAgTjEgPSBOMiAqIE1hdGguY2VpbChNYXRoLnNxcnQoTSkpLFxuICAgICAgICAgICAgaSwgaiwgcmlnaHQyLCByaWdodDM7XG5cbiAgICAgICAgbXVsdGlTZWxlY3QoaXRlbXMsIGxlZnQsIHJpZ2h0LCBOMSwgdGhpcy5jb21wYXJlTWluWCk7XG5cbiAgICAgICAgZm9yIChpID0gbGVmdDsgaSA8PSByaWdodDsgaSArPSBOMSkge1xuXG4gICAgICAgICAgICByaWdodDIgPSBNYXRoLm1pbihpICsgTjEgLSAxLCByaWdodCk7XG5cbiAgICAgICAgICAgIG11bHRpU2VsZWN0KGl0ZW1zLCBpLCByaWdodDIsIE4yLCB0aGlzLmNvbXBhcmVNaW5ZKTtcblxuICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8PSByaWdodDI7IGogKz0gTjIpIHtcblxuICAgICAgICAgICAgICAgIHJpZ2h0MyA9IE1hdGgubWluKGogKyBOMiAtIDEsIHJpZ2h0Mik7XG5cbiAgICAgICAgICAgICAgICAvLyBwYWNrIGVhY2ggZW50cnkgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQoaXRlbXMsIGosIHJpZ2h0MywgaGVpZ2h0IC0gMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsY0JCb3gobm9kZSwgdGhpcy50b0JCb3gpO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICBfY2hvb3NlU3VidHJlZTogZnVuY3Rpb24gKGJib3gsIG5vZGUsIGxldmVsLCBwYXRoKSB7XG5cbiAgICAgICAgdmFyIGksIGxlbiwgY2hpbGQsIHRhcmdldE5vZGUsIGFyZWEsIGVubGFyZ2VtZW50LCBtaW5BcmVhLCBtaW5FbmxhcmdlbWVudDtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmIHx8IHBhdGgubGVuZ3RoIC0gMSA9PT0gbGV2ZWwpIGJyZWFrO1xuXG4gICAgICAgICAgICBtaW5BcmVhID0gbWluRW5sYXJnZW1lbnQgPSBJbmZpbml0eTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBhcmVhID0gYmJveEFyZWEoY2hpbGQuYmJveCk7XG4gICAgICAgICAgICAgICAgZW5sYXJnZW1lbnQgPSBlbmxhcmdlZEFyZWEoYmJveCwgY2hpbGQuYmJveCkgLSBhcmVhO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hvb3NlIGVudHJ5IHdpdGggdGhlIGxlYXN0IGFyZWEgZW5sYXJnZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZW5sYXJnZW1lbnQgPCBtaW5FbmxhcmdlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBtaW5FbmxhcmdlbWVudCA9IGVubGFyZ2VtZW50O1xuICAgICAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmxhcmdlbWVudCA9PT0gbWluRW5sYXJnZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgYXJlYVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICBfaW5zZXJ0OiBmdW5jdGlvbiAoaXRlbSwgbGV2ZWwsIGlzTm9kZSkge1xuXG4gICAgICAgIHZhciB0b0JCb3ggPSB0aGlzLnRvQkJveCxcbiAgICAgICAgICAgIGJib3ggPSBpc05vZGUgPyBpdGVtLmJib3ggOiB0b0JCb3goaXRlbSksXG4gICAgICAgICAgICBpbnNlcnRQYXRoID0gW107XG5cbiAgICAgICAgLy8gZmluZCB0aGUgYmVzdCBub2RlIGZvciBhY2NvbW1vZGF0aW5nIHRoZSBpdGVtLCBzYXZpbmcgYWxsIG5vZGVzIGFsb25nIHRoZSBwYXRoIHRvb1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX2Nob29zZVN1YnRyZWUoYmJveCwgdGhpcy5kYXRhLCBsZXZlbCwgaW5zZXJ0UGF0aCk7XG5cbiAgICAgICAgLy8gcHV0IHRoZSBpdGVtIGludG8gdGhlIG5vZGVcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgICAgICBleHRlbmQobm9kZS5iYm94LCBiYm94KTtcblxuICAgICAgICAvLyBzcGxpdCBvbiBub2RlIG92ZXJmbG93OyBwcm9wYWdhdGUgdXB3YXJkcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgd2hpbGUgKGxldmVsID49IDApIHtcbiAgICAgICAgICAgIGlmIChpbnNlcnRQYXRoW2xldmVsXS5jaGlsZHJlbi5sZW5ndGggPiB0aGlzLl9tYXhFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3BsaXQoaW5zZXJ0UGF0aCwgbGV2ZWwpO1xuICAgICAgICAgICAgICAgIGxldmVsLS07XG4gICAgICAgICAgICB9IGVsc2UgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGp1c3QgYmJveGVzIGFsb25nIHRoZSBpbnNlcnRpb24gcGF0aFxuICAgICAgICB0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoYmJveCwgaW5zZXJ0UGF0aCwgbGV2ZWwpO1xuICAgIH0sXG5cbiAgICAvLyBzcGxpdCBvdmVyZmxvd2VkIG5vZGUgaW50byB0d29cbiAgICBfc3BsaXQ6IGZ1bmN0aW9uIChpbnNlcnRQYXRoLCBsZXZlbCkge1xuXG4gICAgICAgIHZhciBub2RlID0gaW5zZXJ0UGF0aFtsZXZlbF0sXG4gICAgICAgICAgICBNID0gbm9kZS5jaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgICAgICBtID0gdGhpcy5fbWluRW50cmllcztcblxuICAgICAgICB0aGlzLl9jaG9vc2VTcGxpdEF4aXMobm9kZSwgbSwgTSk7XG5cbiAgICAgICAgdmFyIG5ld05vZGUgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbi5zcGxpY2UodGhpcy5fY2hvb3NlU3BsaXRJbmRleChub2RlLCBtLCBNKSksXG4gICAgICAgICAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5vZGUubGVhZikgbmV3Tm9kZS5sZWFmID0gdHJ1ZTtcblxuICAgICAgICBjYWxjQkJveChub2RlLCB0aGlzLnRvQkJveCk7XG4gICAgICAgIGNhbGNCQm94KG5ld05vZGUsIHRoaXMudG9CQm94KTtcblxuICAgICAgICBpZiAobGV2ZWwpIGluc2VydFBhdGhbbGV2ZWwgLSAxXS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICBlbHNlIHRoaXMuX3NwbGl0Um9vdChub2RlLCBuZXdOb2RlKTtcbiAgICB9LFxuXG4gICAgX3NwbGl0Um9vdDogZnVuY3Rpb24gKG5vZGUsIG5ld05vZGUpIHtcbiAgICAgICAgLy8gc3BsaXQgcm9vdCBub2RlXG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbbm9kZSwgbmV3Tm9kZV0sXG4gICAgICAgICAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0ICsgMVxuICAgICAgICB9O1xuICAgICAgICBjYWxjQkJveCh0aGlzLmRhdGEsIHRoaXMudG9CQm94KTtcbiAgICB9LFxuXG4gICAgX2Nob29zZVNwbGl0SW5kZXg6IGZ1bmN0aW9uIChub2RlLCBtLCBNKSB7XG5cbiAgICAgICAgdmFyIGksIGJib3gxLCBiYm94Miwgb3ZlcmxhcCwgYXJlYSwgbWluT3ZlcmxhcCwgbWluQXJlYSwgaW5kZXg7XG5cbiAgICAgICAgbWluT3ZlcmxhcCA9IG1pbkFyZWEgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGkgPSBtOyBpIDw9IE0gLSBtOyBpKyspIHtcbiAgICAgICAgICAgIGJib3gxID0gZGlzdEJCb3gobm9kZSwgMCwgaSwgdGhpcy50b0JCb3gpO1xuICAgICAgICAgICAgYmJveDIgPSBkaXN0QkJveChub2RlLCBpLCBNLCB0aGlzLnRvQkJveCk7XG5cbiAgICAgICAgICAgIG92ZXJsYXAgPSBpbnRlcnNlY3Rpb25BcmVhKGJib3gxLCBiYm94Mik7XG4gICAgICAgICAgICBhcmVhID0gYmJveEFyZWEoYmJveDEpICsgYmJveEFyZWEoYmJveDIpO1xuXG4gICAgICAgICAgICAvLyBjaG9vc2UgZGlzdHJpYnV0aW9uIHdpdGggbWluaW11bSBvdmVybGFwXG4gICAgICAgICAgICBpZiAob3ZlcmxhcCA8IG1pbk92ZXJsYXApIHtcbiAgICAgICAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG5cbiAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChvdmVybGFwID09PSBtaW5PdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBkaXN0cmlidXRpb24gd2l0aCBtaW5pbXVtIGFyZWFcbiAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgbWluQXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfSxcblxuICAgIC8vIHNvcnRzIG5vZGUgY2hpbGRyZW4gYnkgdGhlIGJlc3QgYXhpcyBmb3Igc3BsaXRcbiAgICBfY2hvb3NlU3BsaXRBeGlzOiBmdW5jdGlvbiAobm9kZSwgbSwgTSkge1xuXG4gICAgICAgIHZhciBjb21wYXJlTWluWCA9IG5vZGUubGVhZiA/IHRoaXMuY29tcGFyZU1pblggOiBjb21wYXJlTm9kZU1pblgsXG4gICAgICAgICAgICBjb21wYXJlTWluWSA9IG5vZGUubGVhZiA/IHRoaXMuY29tcGFyZU1pblkgOiBjb21wYXJlTm9kZU1pblksXG4gICAgICAgICAgICB4TWFyZ2luID0gdGhpcy5fYWxsRGlzdE1hcmdpbihub2RlLCBtLCBNLCBjb21wYXJlTWluWCksXG4gICAgICAgICAgICB5TWFyZ2luID0gdGhpcy5fYWxsRGlzdE1hcmdpbihub2RlLCBtLCBNLCBjb21wYXJlTWluWSk7XG5cbiAgICAgICAgLy8gaWYgdG90YWwgZGlzdHJpYnV0aW9ucyBtYXJnaW4gdmFsdWUgaXMgbWluaW1hbCBmb3IgeCwgc29ydCBieSBtaW5YLFxuICAgICAgICAvLyBvdGhlcndpc2UgaXQncyBhbHJlYWR5IHNvcnRlZCBieSBtaW5ZXG4gICAgICAgIGlmICh4TWFyZ2luIDwgeU1hcmdpbikgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmVNaW5YKTtcbiAgICB9LFxuXG4gICAgLy8gdG90YWwgbWFyZ2luIG9mIGFsbCBwb3NzaWJsZSBzcGxpdCBkaXN0cmlidXRpb25zIHdoZXJlIGVhY2ggbm9kZSBpcyBhdCBsZWFzdCBtIGZ1bGxcbiAgICBfYWxsRGlzdE1hcmdpbjogZnVuY3Rpb24gKG5vZGUsIG0sIE0sIGNvbXBhcmUpIHtcblxuICAgICAgICBub2RlLmNoaWxkcmVuLnNvcnQoY29tcGFyZSk7XG5cbiAgICAgICAgdmFyIHRvQkJveCA9IHRoaXMudG9CQm94LFxuICAgICAgICAgICAgbGVmdEJCb3ggPSBkaXN0QkJveChub2RlLCAwLCBtLCB0b0JCb3gpLFxuICAgICAgICAgICAgcmlnaHRCQm94ID0gZGlzdEJCb3gobm9kZSwgTSAtIG0sIE0sIHRvQkJveCksXG4gICAgICAgICAgICBtYXJnaW4gPSBiYm94TWFyZ2luKGxlZnRCQm94KSArIGJib3hNYXJnaW4ocmlnaHRCQm94KSxcbiAgICAgICAgICAgIGksIGNoaWxkO1xuXG4gICAgICAgIGZvciAoaSA9IG07IGkgPCBNIC0gbTsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBleHRlbmQobGVmdEJCb3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKGxlZnRCQm94KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IE0gLSBtIC0gMTsgaSA+PSBtOyBpLS0pIHtcbiAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGV4dGVuZChyaWdodEJCb3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKHJpZ2h0QkJveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFyZ2luO1xuICAgIH0sXG5cbiAgICBfYWRqdXN0UGFyZW50QkJveGVzOiBmdW5jdGlvbiAoYmJveCwgcGF0aCwgbGV2ZWwpIHtcbiAgICAgICAgLy8gYWRqdXN0IGJib3hlcyBhbG9uZyB0aGUgZ2l2ZW4gdHJlZSBwYXRoXG4gICAgICAgIGZvciAodmFyIGkgPSBsZXZlbDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGV4dGVuZChwYXRoW2ldLmJib3gsIGJib3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9jb25kZW5zZTogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgcGF0aCwgcmVtb3ZpbmcgZW1wdHkgbm9kZXMgYW5kIHVwZGF0aW5nIGJib3hlc1xuICAgICAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxLCBzaWJsaW5nczsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChwYXRoW2ldLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncyA9IHBhdGhbaSAtIDFdLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncy5zcGxpY2Uoc2libGluZ3MuaW5kZXhPZihwYXRoW2ldKSwgMSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgICAgICB9IGVsc2UgY2FsY0JCb3gocGF0aFtpXSwgdGhpcy50b0JCb3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9pbml0Rm9ybWF0OiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIC8vIGRhdGEgZm9ybWF0IChtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIGFjY2Vzc29ycylcblxuICAgICAgICAvLyB1c2VzIGV2YWwtdHlwZSBmdW5jdGlvbiBjb21waWxhdGlvbiBpbnN0ZWFkIG9mIGp1c3QgYWNjZXB0aW5nIGEgdG9CQm94IGZ1bmN0aW9uXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGFsZ29yaXRobXMgYXJlIHZlcnkgc2Vuc2l0aXZlIHRvIHNvcnRpbmcgZnVuY3Rpb25zIHBlcmZvcm1hbmNlLFxuICAgICAgICAvLyBzbyB0aGV5IHNob3VsZCBiZSBkZWFkIHNpbXBsZSBhbmQgd2l0aG91dCBpbm5lciBjYWxsc1xuXG4gICAgICAgIC8vIGpzaGludCBldmlsOiB0cnVlXG5cbiAgICAgICAgdmFyIGNvbXBhcmVBcnIgPSBbJ3JldHVybiBhJywgJyAtIGInLCAnOyddO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1pblggPSBuZXcgRnVuY3Rpb24oJ2EnLCAnYicsIGNvbXBhcmVBcnIuam9pbihmb3JtYXRbMF0pKTtcbiAgICAgICAgdGhpcy5jb21wYXJlTWluWSA9IG5ldyBGdW5jdGlvbignYScsICdiJywgY29tcGFyZUFyci5qb2luKGZvcm1hdFsxXSkpO1xuXG4gICAgICAgIHRoaXMudG9CQm94ID0gbmV3IEZ1bmN0aW9uKCdhJywgJ3JldHVybiBbYScgKyBmb3JtYXQuam9pbignLCBhJykgKyAnXTsnKTtcbiAgICB9XG59O1xuXG5cbi8vIGNhbGN1bGF0ZSBub2RlJ3MgYmJveCBmcm9tIGJib3hlcyBvZiBpdHMgY2hpbGRyZW5cbmZ1bmN0aW9uIGNhbGNCQm94KG5vZGUsIHRvQkJveCkge1xuICAgIG5vZGUuYmJveCA9IGRpc3RCQm94KG5vZGUsIDAsIG5vZGUuY2hpbGRyZW4ubGVuZ3RoLCB0b0JCb3gpO1xufVxuXG4vLyBtaW4gYm91bmRpbmcgcmVjdGFuZ2xlIG9mIG5vZGUgY2hpbGRyZW4gZnJvbSBrIHRvIHAtMVxuZnVuY3Rpb24gZGlzdEJCb3gobm9kZSwgaywgcCwgdG9CQm94KSB7XG4gICAgdmFyIGJib3ggPSBlbXB0eSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IGssIGNoaWxkOyBpIDwgcDsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgZXh0ZW5kKGJib3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmJveDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoKSB7IHJldHVybiBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07IH1cblxuZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICBhWzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgYVsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIGFbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICBhWzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWChhLCBiKSB7IHJldHVybiBhLmJib3hbMF0gLSBiLmJib3hbMF07IH1cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWShhLCBiKSB7IHJldHVybiBhLmJib3hbMV0gLSBiLmJib3hbMV07IH1cblxuZnVuY3Rpb24gYmJveEFyZWEoYSkgICB7IHJldHVybiAoYVsyXSAtIGFbMF0pICogKGFbM10gLSBhWzFdKTsgfVxuZnVuY3Rpb24gYmJveE1hcmdpbihhKSB7IHJldHVybiAoYVsyXSAtIGFbMF0pICsgKGFbM10gLSBhWzFdKTsgfVxuXG5mdW5jdGlvbiBlbmxhcmdlZEFyZWEoYSwgYikge1xuICAgIHJldHVybiAoTWF0aC5tYXgoYlsyXSwgYVsyXSkgLSBNYXRoLm1pbihiWzBdLCBhWzBdKSkgKlxuICAgICAgICAgICAoTWF0aC5tYXgoYlszXSwgYVszXSkgLSBNYXRoLm1pbihiWzFdLCBhWzFdKSk7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdGlvbkFyZWEoYSwgYikge1xuICAgIHZhciBtaW5YID0gTWF0aC5tYXgoYVswXSwgYlswXSksXG4gICAgICAgIG1pblkgPSBNYXRoLm1heChhWzFdLCBiWzFdKSxcbiAgICAgICAgbWF4WCA9IE1hdGgubWluKGFbMl0sIGJbMl0pLFxuICAgICAgICBtYXhZID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgbWF4WCAtIG1pblgpICpcbiAgICAgICAgICAgTWF0aC5tYXgoMCwgbWF4WSAtIG1pblkpO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPD0gYlswXSAmJlxuICAgICAgICAgICBhWzFdIDw9IGJbMV0gJiZcbiAgICAgICAgICAgYlsyXSA8PSBhWzJdICYmXG4gICAgICAgICAgIGJbM10gPD0gYVszXTtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0cyhhLCBiKSB7XG4gICAgcmV0dXJuIGJbMF0gPD0gYVsyXSAmJlxuICAgICAgICAgICBiWzFdIDw9IGFbM10gJiZcbiAgICAgICAgICAgYlsyXSA+PSBhWzBdICYmXG4gICAgICAgICAgIGJbM10gPj0gYVsxXTtcbn1cblxuLy8gc29ydCBhbiBhcnJheSBzbyB0aGF0IGl0ZW1zIGNvbWUgaW4gZ3JvdXBzIG9mIG4gdW5zb3J0ZWQgaXRlbXMsIHdpdGggZ3JvdXBzIHNvcnRlZCBiZXR3ZWVuIGVhY2ggb3RoZXI7XG4vLyBjb21iaW5lcyBzZWxlY3Rpb24gYWxnb3JpdGhtIHdpdGggYmluYXJ5IGRpdmlkZSAmIGNvbnF1ZXIgYXBwcm9hY2hcblxuZnVuY3Rpb24gbXVsdGlTZWxlY3QoYXJyLCBsZWZ0LCByaWdodCwgbiwgY29tcGFyZSkge1xuICAgIHZhciBzdGFjayA9IFtsZWZ0LCByaWdodF0sXG4gICAgICAgIG1pZDtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbikgY29udGludWU7XG5cbiAgICAgICAgbWlkID0gbGVmdCArIE1hdGguY2VpbCgocmlnaHQgLSBsZWZ0KSAvIG4gLyAyKSAqIG47XG4gICAgICAgIHNlbGVjdChhcnIsIGxlZnQsIHJpZ2h0LCBtaWQsIGNvbXBhcmUpO1xuXG4gICAgICAgIHN0YWNrLnB1c2gobGVmdCwgbWlkLCBtaWQsIHJpZ2h0KTtcbiAgICB9XG59XG5cbi8vIEZsb3lkLVJpdmVzdCBzZWxlY3Rpb24gYWxnb3JpdGhtOlxuLy8gc29ydCBhbiBhcnJheSBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IChpbmNsdXNpdmUpIHNvIHRoYXQgdGhlIHNtYWxsZXN0IGsgZWxlbWVudHMgY29tZSBmaXJzdCAodW5vcmRlcmVkKVxuZnVuY3Rpb24gc2VsZWN0KGFyciwgbGVmdCwgcmlnaHQsIGssIGNvbXBhcmUpIHtcbiAgICB2YXIgbiwgaSwgeiwgcywgc2QsIG5ld0xlZnQsIG5ld1JpZ2h0LCB0LCBqO1xuXG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKGkgLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIGkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIGkpICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGFyciwgbmV3TGVmdCwgbmV3UmlnaHQsIGssIGNvbXBhcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdCA9IGFycltrXTtcbiAgICAgICAgaSA9IGxlZnQ7XG4gICAgICAgIGogPSByaWdodDtcblxuICAgICAgICBzd2FwKGFyciwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlKGFycltyaWdodF0sIHQpID4gMCkgc3dhcChhcnIsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXAoYXJyLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltpXSwgdCkgPCAwKSBpKys7XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbal0sIHQpID4gMCkgai0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnIsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXAoYXJyLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIHZhciB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxuXG4vLyBleHBvcnQgYXMgQU1EL0NvbW1vbkpTIG1vZHVsZSBvciBnbG9iYWwgdmFyaWFibGVcbmlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZSgncmJ1c2gnLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJidXNoOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IHJidXNoO1xuZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSBzZWxmLnJidXNoID0gcmJ1c2g7XG5lbHNlIHdpbmRvdy5yYnVzaCA9IHJidXNoO1xuXG59KSgpO1xuIiwiLy8gQ29weXJpZ2h0IDIwMTQgU2ltb24gTHlkZWxsXHJcbi8vIFgxMSAo4oCcTUlU4oCdKSBMaWNlbnNlZC4gKFNlZSBMSUNFTlNFLilcclxuXHJcbnZvaWQgKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcclxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcclxuICAgIGRlZmluZShmYWN0b3J5KVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJvb3QucmVzb2x2ZVVybCA9IGZhY3RvcnkoKVxyXG4gIH1cclxufSh0aGlzLCBmdW5jdGlvbigpIHtcclxuXHJcbiAgZnVuY3Rpb24gcmVzb2x2ZVVybCgvKiAuLi51cmxzICovKSB7XHJcbiAgICB2YXIgbnVtVXJscyA9IGFyZ3VtZW50cy5sZW5ndGhcclxuXHJcbiAgICBpZiAobnVtVXJscyA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvbHZlVXJsIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudDsgZ290IG5vbmUuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGJhc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKVxyXG4gICAgYmFzZS5ocmVmID0gYXJndW1lbnRzWzBdXHJcblxyXG4gICAgaWYgKG51bVVybHMgPT09IDEpIHtcclxuICAgICAgcmV0dXJuIGJhc2UuaHJlZlxyXG4gICAgfVxyXG5cclxuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdXHJcbiAgICBoZWFkLmluc2VydEJlZm9yZShiYXNlLCBoZWFkLmZpcnN0Q2hpbGQpXHJcblxyXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxyXG4gICAgdmFyIHJlc29sdmVkXHJcblxyXG4gICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IG51bVVybHM7IGluZGV4KyspIHtcclxuICAgICAgYS5ocmVmID0gYXJndW1lbnRzW2luZGV4XVxyXG4gICAgICByZXNvbHZlZCA9IGEuaHJlZlxyXG4gICAgICBiYXNlLmhyZWYgPSByZXNvbHZlZFxyXG4gICAgfVxyXG5cclxuICAgIGhlYWQucmVtb3ZlQ2hpbGQoYmFzZSlcclxuXHJcbiAgICByZXR1cm4gcmVzb2x2ZWRcclxuICB9XHJcblxyXG4gIHJldHVybiByZXNvbHZlVXJsXHJcblxyXG59KSk7XHJcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5faWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBjb29yZHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXVswXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgICAgICB0eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwidmFyIGJ1bmRsZUZuID0gYXJndW1lbnRzWzNdO1xudmFyIHNvdXJjZXMgPSBhcmd1bWVudHNbNF07XG52YXIgY2FjaGUgPSBhcmd1bWVudHNbNV07XG5cbnZhciBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIHZhciB3a2V5O1xuICAgIHZhciBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjYWNoZSk7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgIGlmIChjYWNoZVtrZXldLmV4cG9ydHMgPT09IGZuKSB7XG4gICAgICAgICAgICB3a2V5ID0ga2V5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJywnbW9kdWxlJywnZXhwb3J0cyddLCAnKCcgKyBmbiArICcpKHNlbGYpJyksXG4gICAgICAgICAgICB3Y2FjaGVcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIHNrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICBcbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJ10sJ3JlcXVpcmUoJyArIHN0cmluZ2lmeSh3a2V5KSArICcpKHNlbGYpJyksXG4gICAgICAgIHNjYWNoZVxuICAgIF07XG4gICAgXG4gICAgdmFyIHNyYyA9ICcoJyArIGJ1bmRsZUZuICsgJykoeydcbiAgICAgICAgKyBPYmplY3Qua2V5cyhzb3VyY2VzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShrZXkpICsgJzpbJ1xuICAgICAgICAgICAgICAgICsgc291cmNlc1trZXldWzBdXG4gICAgICAgICAgICAgICAgKyAnLCcgKyBzdHJpbmdpZnkoc291cmNlc1trZXldWzFdKSArICddJ1xuICAgICAgICAgICAgO1xuICAgICAgICB9KS5qb2luKCcsJylcbiAgICAgICAgKyAnfSx7fSxbJyArIHN0cmluZ2lmeShza2V5KSArICddKSdcbiAgICA7XG4gICAgXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcbiAgICBcbiAgICByZXR1cm4gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgICBuZXcgQmxvYihbc3JjXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KVxuICAgICkpO1xufTtcbiJdfQ== From 051fffbf1e23e6bff0c192ba3588a181310407a5 Mon Sep 17 00:00:00 2001 From: chelm Date: Fri, 17 Jul 2015 13:23:17 -0600 Subject: [PATCH 11/27] pointing to the dev js --- demo/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/index.html b/demo/index.html index 1f07f9887fa..43eb648d4aa 100644 --- a/demo/index.html +++ b/demo/index.html @@ -5,7 +5,7 @@ - + - - - -
- - - - - diff --git a/demo/mapbox-gl-dev.js b/demo/mapbox-gl-dev.js deleted file mode 100644 index d25d3624b97..00000000000 --- a/demo/mapbox-gl-dev.js +++ /dev/null @@ -1,23346 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 65535) { - this.current = new ElementGroup(this.vertexBuffer.index, - this.elementBuffer && this.elementBuffer.index, - this.secondElementBuffer && this.secondElementBuffer.index); - this.groups.push(this.current); - } -}; - -function ElementGroup(vertexStartIndex, elementStartIndex, secondElementStartIndex) { - // the offset into the vertex buffer of the first vertex in this group - this.vertexStartIndex = vertexStartIndex; - this.elementStartIndex = elementStartIndex; - this.secondElementStartIndex = secondElementStartIndex; - this.elementLength = 0; - this.vertexLength = 0; - this.secondElementLength = 0; -} - -},{}],13:[function(require,module,exports){ -'use strict'; - -var rbush = require('rbush'); -var Point = require('point-geometry'); -var vt = require('vector-tile'); -var util = require('../util/util'); - -module.exports = FeatureTree; - -function FeatureTree(coord, overscaling) { - this.x = coord.x; - this.y = coord.y; - this.z = coord.z - Math.log(overscaling) / Math.LN2; - this.rtree = rbush(9); - this.toBeInserted = []; -} - -FeatureTree.prototype.insert = function(bbox, layers, feature) { - bbox.layers = layers; - bbox.feature = feature; - this.toBeInserted.push(bbox); -}; - -// bulk insert into tree -FeatureTree.prototype._load = function() { - this.rtree.load(this.toBeInserted); - this.toBeInserted = []; -}; - -// Finds features in this tile at a particular position. -FeatureTree.prototype.query = function(args, callback) { - if (this.toBeInserted.length) this._load(); - - var params = args.params || {}, - radius = (params.radius || 0) * 4096 / args.scale, - x = args.x, - y = args.y, - result = []; - - var matching = this.rtree.search([ x - radius, y - radius, x + radius, y + radius ]); - for (var i = 0; i < matching.length; i++) { - var feature = matching[i].feature, - layers = matching[i].layers, - type = vt.VectorTileFeature.types[feature.type]; - - if (params.$type && type !== params.$type) - continue; - if (!geometryContainsPoint(feature.loadGeometry(), type, new Point(x, y), radius)) - continue; - - var geoJSON = feature.toGeoJSON(this.x, this.y, this.z); - for (var l = 0; l < layers.length; l++) { - var layer = layers[l]; - - if (params.layer && layer !== params.layer.id) - continue; - - result.push(util.extend({layer: layer}, geoJSON)); - } - } - - callback(null, result); -}; - -function geometryContainsPoint(rings, type, p, radius) { - return type === 'Point' ? pointContainsPoint(rings, p, radius) : - type === 'LineString' ? lineContainsPoint(rings, p, radius) : - type === 'Polygon' ? polyContainsPoint(rings, p) || lineContainsPoint(rings, p, radius) : false; -} - -// Code from http://stackoverflow.com/a/1501725/331379. -function distToSegmentSquared(p, v, w) { - var l2 = v.distSqr(w); - if (l2 === 0) return p.distSqr(v); - var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; - if (t < 0) return p.distSqr(v); - if (t > 1) return p.distSqr(w); - return p.distSqr(w.sub(v)._mult(t)._add(v)); -} - -function lineContainsPoint(rings, p, radius) { - var r = radius * radius; - - for (var i = 0; i < rings.length; i++) { - var ring = rings[i]; - for (var j = 1; j < ring.length; j++) { - // Find line segments that have a distance <= radius^2 to p - // In that case, we treat the line as "containing point p". - var v = ring[j - 1], w = ring[j]; - if (distToSegmentSquared(p, v, w) < r) return true; - } - } - return false; -} - -// point in polygon ray casting algorithm -function polyContainsPoint(rings, p) { - var c = false, - ring, p1, p2; - - for (var k = 0; k < rings.length; k++) { - ring = rings[k]; - for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { - p1 = ring[i]; - p2 = ring[j]; - if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { - c = !c; - } - } - } - return c; -} - -function pointContainsPoint(rings, p, radius) { - var r = radius * radius; - - for (var i = 0; i < rings.length; i++) { - var ring = rings[i]; - for (var j = 0; j < ring.length; j++) { - if (ring[j].distSqr(p) <= r) return true; - } - } - return false; -} - -},{"../util/util":103,"point-geometry":134,"rbush":135,"vector-tile":138}],14:[function(require,module,exports){ -'use strict'; - -var ElementGroups = require('./element_groups'); - -module.exports = FillBucket; - -function FillBucket(buffers) { - this.buffers = buffers; - this.elementGroups = new ElementGroups(buffers.fillVertex, buffers.fillElement, buffers.outlineElement); -} - -FillBucket.prototype.addFeatures = function() { - var features = this.features; - for (var i = 0; i < features.length; i++) { - var feature = features[i]; - this.addFeature(feature.loadGeometry()); - } -}; - -FillBucket.prototype.addFeature = function(lines) { - for (var i = 0; i < lines.length; i++) { - this.addFill(lines[i]); - } -}; - -FillBucket.prototype.addFill = function(vertices) { - if (vertices.length < 3) { - //console.warn('a fill must have at least three vertices'); - return; - } - - // Calculate the total number of vertices we're going to produce so that we - // can resize the buffer beforehand, or detect whether the current line - // won't fit into the buffer anymore. - // In order to be able to use the vertex buffer for drawing the antialiased - // outlines, we separate all polygon vertices with a degenerate (out-of- - // viewplane) vertex. - - var len = vertices.length; - - // Check whether this geometry buffer can hold all the required vertices. - this.elementGroups.makeRoomFor(len + 1); - var elementGroup = this.elementGroups.current; - - var fillVertex = this.buffers.fillVertex; - var fillElement = this.buffers.fillElement; - var outlineElement = this.buffers.outlineElement; - - // We're generating triangle fans, so we always start with the first coordinate in this polygon. - var firstIndex = fillVertex.index - elementGroup.vertexStartIndex, - prevIndex, currentIndex, currentVertex; - - for (var i = 0; i < vertices.length; i++) { - currentIndex = fillVertex.index - elementGroup.vertexStartIndex; - currentVertex = vertices[i]; - - fillVertex.add(currentVertex.x, currentVertex.y); - elementGroup.vertexLength++; - - // Only add triangles that have distinct vertices. - if (i >= 2 && (currentVertex.x !== vertices[0].x || currentVertex.y !== vertices[0].y)) { - fillElement.add(firstIndex, prevIndex, currentIndex); - elementGroup.elementLength++; - } - - if (i >= 1) { - outlineElement.add(prevIndex, currentIndex); - elementGroup.secondElementLength++; - } - - prevIndex = currentIndex; - } -}; - -},{"./element_groups":12}],15:[function(require,module,exports){ -'use strict'; - -var ElementGroups = require('./element_groups'); - -module.exports = LineBucket; - -/** - * @class LineBucket - * @private - */ -function LineBucket(buffers, layoutProperties) { - this.buffers = buffers; - this.elementGroups = new ElementGroups(buffers.lineVertex, buffers.lineElement); - this.layoutProperties = layoutProperties; -} - -LineBucket.prototype.addFeatures = function() { - var features = this.features; - for (var i = 0; i < features.length; i++) { - var feature = features[i]; - this.addFeature(feature.loadGeometry()); - } -}; - -LineBucket.prototype.addFeature = function(lines) { - var layoutProperties = this.layoutProperties; - for (var i = 0; i < lines.length; i++) { - this.addLine(lines[i], - layoutProperties['line-join'], - layoutProperties['line-cap'], - layoutProperties['line-miter-limit'], - layoutProperties['line-round-limit']); - } -}; - -LineBucket.prototype.addLine = function(vertices, join, cap, miterLimit, roundLimit) { - - var len = vertices.length; - // If the line has duplicate vertices at the end, adjust length to remove them. - while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) { - len--; - } - - if (vertices.length < 2) { - //console.warn('a line must have at least two vertices'); - return; - } - - if (join === 'bevel') miterLimit = 1.05; - - var firstVertex = vertices[0], - lastVertex = vertices[len - 1], - closed = firstVertex.equals(lastVertex); - - // we could be more precise, but it would only save a negligible amount of space - this.elementGroups.makeRoomFor(len * 10); - - if (len === 2 && closed) { - // console.warn('a line may not have coincident points'); - return; - } - - var beginCap = cap, - endCap = closed ? 'butt' : cap, - flip = 1, - distance = 0, - startOfLine = true, - currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB; - - // the last three vertices added - this.e1 = this.e2 = this.e3 = -1; - - if (closed) { - currentVertex = vertices[len - 2]; - nextNormal = firstVertex.sub(currentVertex)._unit()._perp(); - } - - for (var i = 0; i < len; i++) { - - nextVertex = closed && i === len - 1 ? - vertices[1] : // if the line is closed, we treat the last vertex like the first - vertices[i + 1]; // just the next vertex - - // if two consecutive vertices exist, skip the current one - if (nextVertex && vertices[i].equals(nextVertex)) continue; - - if (nextNormal) prevNormal = nextNormal; - if (currentVertex) prevVertex = currentVertex; - - currentVertex = vertices[i]; - - // Calculate how far along the line the currentVertex is - if (prevVertex) distance += currentVertex.dist(prevVertex); - - // Calculate the normal towards the next vertex in this line. In case - // there is no next vertex, pretend that the line is continuing straight, - // meaning that we are just using the previous normal. - nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; - - // If we still don't have a previous normal, this is the beginning of a - // non-closed line, so we're doing a straight "join". - prevNormal = prevNormal || nextNormal; - - // Determine the normal of the join extrusion. It is the angle bisector - // of the segments between the previous line and the next line. - var joinNormal = prevNormal.add(nextNormal)._unit(); - - /* joinNormal prevNormal - * ↖ ↑ - * .________. prevVertex - * | - * nextNormal ← | currentVertex - * | - * nextVertex ! - * - */ - - // Calculate the length of the miter (the ratio of the miter to the width). - // Find the cosine of the angle between the next and join normals - // using dot product. The inverse of that is the miter length. - var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; - var miterLength = 1 / cosHalfAngle; - - // The join if a middle vertex, otherwise the cap. - var middleVertex = prevVertex && nextVertex; - var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap; - - if (middleVertex && currentJoin === 'round') { - if (miterLength < roundLimit) { - currentJoin = 'miter'; - } else if (miterLength <= 2) { - currentJoin = 'fakeround'; - } - } - - if (currentJoin === 'miter' && miterLength > miterLimit) { - currentJoin = 'bevel'; - } - - if (currentJoin === 'bevel') { - // The maximum extrude length is 128 / 63 = 2 times the width of the line - // so if miterLength >= 2 we need to draw a different type of bevel where. - if (miterLength > 2) currentJoin = 'flipbevel'; - - // If the miterLength is really small and the line bevel wouldn't be visible, - // just draw a miter join to save a triangle. - if (miterLength < miterLimit) currentJoin = 'miter'; - } - - if (currentJoin === 'miter') { - joinNormal._mult(miterLength); - this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false); - - } else if (currentJoin === 'flipbevel') { - // miter is too big, flip the direction to make a beveled join - - if (miterLength > 100) { - // Almost parallel lines - joinNormal = nextNormal.clone(); - - } else { - var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1; - var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); - joinNormal._perp()._mult(bevelLength * direction); - } - this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false); - flip = -flip; - - } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { - var lineTurnsLeft = flip * (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0; - var offset = -Math.sqrt(miterLength * miterLength - 1); - if (lineTurnsLeft) { - offsetB = 0; - offsetA = offset; - } else { - offsetA = 0; - offsetB = offset; - } - - // Close previous segment with a bevel - if (!startOfLine) { - this.addCurrentVertex(currentVertex, flip, distance, prevNormal, offsetA, offsetB, false); - } - - if (currentJoin === 'fakeround') { - // The join angle is sharp enough that a round join would be visible. - // Bevel joins fill the gap between segments with a single pie slice triangle. - // Create a round join by adding multiple pie slices. The join isn't actually round, but - // it looks like it is at the sizes we render lines at. - - // Add more triangles for sharper angles. - // This math is just a good enough approximation. It isn't "correct". - var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8); - var approxFractionalJoinNormal; - - for (var m = 0; m < n; m++) { - approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit(); - this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft); - } - - this.addPieSliceVertex(currentVertex, flip, distance, joinNormal, lineTurnsLeft); - - for (var k = n - 1; k >= 0; k--) { - approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit(); - this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft); - } - } - - // Start next segment - if (nextVertex) { - this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -offsetA, -offsetB, false); - } - - } else if (currentJoin === 'butt') { - if (!startOfLine) { - // Close previous segment with a butt - this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false); - } - - // Start next segment with a butt - if (nextVertex) { - this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false); - } - - } else if (currentJoin === 'square') { - - if (!startOfLine) { - // Close previous segment with a square cap - this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, false); - - // The segment is done. Unset vertices to disconnect segments. - this.e1 = this.e2 = -1; - flip = 1; - } - - // Start next segment - if (nextVertex) { - this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, false); - } - - } else if (currentJoin === 'round') { - - if (!startOfLine) { - // Close previous segment with butt - this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false); - - // Add round cap or linejoin at end of segment - this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, true); - - // The segment is done. Unset vertices to disconnect segments. - this.e1 = this.e2 = -1; - flip = 1; - } - - - // Start next segment with a butt - if (nextVertex) { - // Add round cap before first segment - this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, true); - - this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false); - } - } - - startOfLine = false; - } - - -}; - -/** - * Add two vertices to the buffers. - * - * @param {Object} currentVertex the line vertex to add buffer vertices for - * @param {number} flip -1 if the vertices should be flipped, 1 otherwise - * @param {number} distance the distance from the beggining of the line to the vertex - * @param {number} endLeft extrude to shift the left vertex along the line - * @param {number} endRight extrude to shift the left vertex along the line - * @param {boolean} round whether this is a round cap - * @private - */ -LineBucket.prototype.addCurrentVertex = function(currentVertex, flip, distance, normal, endLeft, endRight, round) { - var tx = round ? 1 : 0; - var extrude; - - var lineVertex = this.buffers.lineVertex; - var lineElement = this.buffers.lineElement; - var elementGroup = this.elementGroups.current; - var vertexStartIndex = this.elementGroups.current.vertexStartIndex; - - extrude = normal.mult(flip); - if (endLeft) extrude._sub(normal.perp()._mult(endLeft)); - this.e3 = lineVertex.add(currentVertex, extrude, tx, 0, distance) - vertexStartIndex; - if (this.e1 >= 0 && this.e2 >= 0) { - lineElement.add(this.e1, this.e2, this.e3); - elementGroup.elementLength++; - } - this.e1 = this.e2; - this.e2 = this.e3; - - extrude = normal.mult(-flip); - if (endRight) extrude._sub(normal.perp()._mult(endRight)); - this.e3 = lineVertex.add(currentVertex, extrude, tx, 1, distance) - vertexStartIndex; - if (this.e1 >= 0 && this.e2 >= 0) { - lineElement.add(this.e1, this.e2, this.e3); - elementGroup.elementLength++; - } - this.e1 = this.e2; - this.e2 = this.e3; - - elementGroup.vertexLength += 2; -}; - -/** - * Add a single new vertex and a triangle using two previous vertices. - * This adds a pie slice triangle near a join to simulate round joins - * - * @param {Object} currentVertex the line vertex to add buffer vertices for - * @param {number} flip -1 if the vertices should be flipped, 1 otherwise - * @param {number} distance the distance from the beggining of the line to the vertex - * @param {Object} extrude the offset of the new vertex from the currentVertex - * @param {boolean} whether the line is turning left or right at this angle - * @private - */ -LineBucket.prototype.addPieSliceVertex = function(currentVertex, flip, distance, extrude, lineTurnsLeft) { - var lineVertex = this.buffers.lineVertex; - var lineElement = this.buffers.lineElement; - var elementGroup = this.elementGroups.current; - var vertexStartIndex = this.elementGroups.current.vertexStartIndex; - - var ty = lineTurnsLeft; - extrude = extrude.mult(flip * (lineTurnsLeft ? -1 : 1)); - - this.e3 = lineVertex.add(currentVertex, extrude, 0, ty, distance) - vertexStartIndex; - elementGroup.vertexLength += 1; - - if (this.e1 >= 0 && this.e2 >= 0) { - lineElement.add(this.e1, this.e2, this.e3); - elementGroup.elementLength++; - } - - - if (lineTurnsLeft) { - this.e2 = this.e3; - } else { - this.e1 = this.e3; - } -}; - -},{"./element_groups":12}],16:[function(require,module,exports){ -'use strict'; - -var ElementGroups = require('./element_groups'); -var Anchor = require('../symbol/anchor'); -var getAnchors = require('../symbol/get_anchors'); -var resolveTokens = require('../util/token'); -var Quads = require('../symbol/quads'); -var Shaping = require('../symbol/shaping'); -var resolveText = require('../symbol/resolve_text'); -var resolveIcons = require('../symbol/resolve_icons'); -var mergeLines = require('../symbol/mergelines'); -var shapeText = Shaping.shapeText; -var shapeIcon = Shaping.shapeIcon; -var getGlyphQuads = Quads.getGlyphQuads; -var getIconQuads = Quads.getIconQuads; -var clipLine = require('../symbol/clip_line'); -var Point = require('point-geometry'); - -var CollisionFeature = require('../symbol/collision_feature'); - -module.exports = SymbolBucket; - -function SymbolBucket(buffers, layoutProperties, overscaling, zoom, collisionDebug) { - this.buffers = buffers; - this.layoutProperties = layoutProperties; - this.overscaling = overscaling; - this.zoom = zoom; - this.collisionDebug = collisionDebug; - var tileSize = 512 * overscaling; - var tileExtent = 4096; - this.tilePixelRatio = tileExtent / tileSize; - this.compareText = {}; - this.symbolInstances = []; - -} - -SymbolBucket.prototype.needsPlacement = true; - -SymbolBucket.prototype.addFeatures = function(collisionTile) { - var layout = this.layoutProperties; - var features = this.features; - var textFeatures = this.textFeatures; - - var horizontalAlign = 0.5, - verticalAlign = 0.5; - - switch (layout['text-anchor']) { - case 'right': - case 'top-right': - case 'bottom-right': - horizontalAlign = 1; - break; - case 'left': - case 'top-left': - case 'bottom-left': - horizontalAlign = 0; - break; - } - - switch (layout['text-anchor']) { - case 'bottom': - case 'bottom-right': - case 'bottom-left': - verticalAlign = 1; - break; - case 'top': - case 'top-right': - case 'top-left': - verticalAlign = 0; - break; - } - - var justify = layout['text-justify'] === 'right' ? 1 : - layout['text-justify'] === 'left' ? 0 : - 0.5; - - var oneEm = 24; - var lineHeight = layout['text-line-height'] * oneEm; - var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0; - var spacing = layout['text-letter-spacing'] * oneEm; - var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm]; - var fontstack = layout['text-font']; - - var geometries = []; - for (var g = 0; g < features.length; g++) { - geometries.push(features[g].loadGeometry()); - } - - if (layout['symbol-placement'] === 'line') { - // Merge adjacent lines with the same text to improve labelling. - // It's better to place labels on one long line than on many short segments. - var merged = mergeLines(features, textFeatures, geometries); - - geometries = merged.geometries; - features = merged.features; - textFeatures = merged.textFeatures; - } - - var shapedText, shapedIcon; - - for (var k = 0; k < features.length; k++) { - if (!geometries[k]) continue; - - if (textFeatures[k]) { - shapedText = shapeText(textFeatures[k], this.stacks[fontstack], maxWidth, - lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset); - } else { - shapedText = null; - } - - if (layout['icon-image']) { - var iconName = resolveTokens(features[k].properties, layout['icon-image']); - var image = this.icons[iconName]; - shapedIcon = shapeIcon(image, layout); - - if (image) { - if (this.sdfIcons === undefined) { - this.sdfIcons = image.sdf; - } else if (this.sdfIcons !== image.sdf) { - console.warn('Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket'); - } - } - } else { - shapedIcon = null; - } - - if (shapedText || shapedIcon) { - this.addFeature(geometries[k], shapedText, shapedIcon); - } - } - - this.placeFeatures(collisionTile, this.buffers, this.collisionDebug); -}; - -SymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon) { - var layout = this.layoutProperties; - - var glyphSize = 24; - - var fontScale = layout['text-max-size'] / glyphSize, - textBoxScale = this.tilePixelRatio * fontScale, - iconBoxScale = this.tilePixelRatio * layout['icon-max-size'], - symbolMinDistance = this.tilePixelRatio * layout['symbol-min-distance'], - avoidEdges = layout['symbol-avoid-edges'], - textPadding = layout['text-padding'] * this.tilePixelRatio, - iconPadding = layout['icon-padding'] * this.tilePixelRatio, - textMaxAngle = layout['text-max-angle'] / 180 * Math.PI, - textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', - iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', - mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || - layout['text-ignore-placement'] || layout['icon-ignore-placement'], - isLine = layout['symbol-placement'] === 'line', - textRepeatDistance = symbolMinDistance / 2; - - if (isLine) { - lines = clipLine(lines, 0, 0, 4096, 4096); - } - - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - - // Calculate the anchor points around which you want to place labels - var anchors = isLine ? - getAnchors(line, symbolMinDistance, textMaxAngle, shapedText, shapedIcon, glyphSize, textBoxScale, this.overscaling) : - [ new Anchor(line[0].x, line[0].y, 0) ]; - - // For each potential label, create the placement features used to check for collisions, and the quads use for rendering. - for (var j = 0, len = anchors.length; j < len; j++) { - var anchor = anchors[j]; - - if (shapedText && isLine) { - if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) { - continue; - } - } - - var inside = !(anchor.x < 0 || anchor.x > 4096 || anchor.y < 0 || anchor.y > 4096); - - if (avoidEdges && !inside) continue; - - // Normally symbol layers are drawn across tile boundaries. Only symbols - // with their anchors within the tile boundaries are added to the buffers - // to prevent symbols from being drawn twice. - // - // Symbols in layers with overlap are sorted in the y direction so that - // symbols lower on the canvas are drawn on top of symbols near the top. - // To preserve this order across tile boundaries these symbols can't - // be drawn across tile boundaries. Instead they need to be included in - // the buffers for both tiles and clipped to tile boundaries at draw time. - var addToBuffers = inside || mayOverlap; - - this.symbolInstances.push(new SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers, - textBoxScale, textPadding, textAlongLine, - iconBoxScale, iconPadding, iconAlongLine)); - } - } -}; - -// Check if any other anchors with the same text are closer than repeatDistance -SymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) { - var compareText = this.compareText; - if (!(text in compareText)) { - compareText[text] = []; - } else { - var otherAnchors = compareText[text]; - for (var k = otherAnchors.length - 1; k >= 0; k--) { - if (anchor.dist(otherAnchors[k]) < repeatDistance) { - // If it's within repeatDistance of one anchor, stop looking - return true; - } - } - } - // If anchor is not within repeatDistance of any other anchor, add to array - compareText[text].push(anchor); - return false; -}; - -SymbolBucket.prototype.placeFeatures = function(collisionTile, buffers, collisionDebug) { - - // Calculate which labels can be shown and when they can be shown and - // create the bufers used for rendering. - - this.buffers = buffers; - - var elementGroups = this.elementGroups = { - text: new ElementGroups(buffers.glyphVertex, buffers.glyphElement), - icon: new ElementGroups(buffers.iconVertex, buffers.iconElement), - sdfIcons: this.sdfIcons - }; - - var layout = this.layoutProperties; - var maxScale = collisionTile.maxScale; - - var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; - var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; - - var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || - layout['text-ignore-placement'] || layout['icon-ignore-placement']; - - // Sort symbols by their y position on the canvas so that they lower symbols - // are drawn on top of higher symbols. - // Don't sort symbols that won't overlap because it isn't necessary and - // because it causes more labels to pop in and out when rotating. - if (mayOverlap) { - var angle = collisionTile.angle; - var sin = Math.sin(angle), - cos = Math.cos(angle); - - this.symbolInstances.sort(function(a, b) { - var aRotated = sin * a.x + cos * a.y; - var bRotated = sin * b.x + cos * b.y; - return bRotated - aRotated; - }); - } - - for (var p = 0; p < this.symbolInstances.length; p++) { - var symbolInstance = this.symbolInstances[p]; - var hasText = symbolInstance.hasText; - var hasIcon = symbolInstance.hasIcon; - - var iconWithoutText = layout['text-optional'] || !hasText, - textWithoutIcon = layout['icon-optional'] || !hasIcon; - - - // Calculate the scales at which the text and icon can be placed without collision. - - var glyphScale = hasText && !layout['text-allow-overlap'] ? - collisionTile.placeCollisionFeature(symbolInstance.textCollisionFeature) : - collisionTile.minScale; - - var iconScale = hasIcon && !layout['icon-allow-overlap'] ? - collisionTile.placeCollisionFeature(symbolInstance.iconCollisionFeature) : - collisionTile.minScale; - - - // Combine the scales for icons and text. - - if (!iconWithoutText && !textWithoutIcon) { - iconScale = glyphScale = Math.max(iconScale, glyphScale); - } else if (!textWithoutIcon && glyphScale) { - glyphScale = Math.max(iconScale, glyphScale); - } else if (!iconWithoutText && iconScale) { - iconScale = Math.max(iconScale, glyphScale); - } - - - // Insert final placement into collision tree and add glyphs/icons to buffers - - if (hasText) { - if (!layout['text-ignore-placement']) { - collisionTile.insertCollisionFeature(symbolInstance.textCollisionFeature, glyphScale); - } - if (glyphScale <= maxScale) { - this.addSymbols(buffers.glyphVertex, buffers.glyphElement, elementGroups.text, - symbolInstance.glyphQuads, glyphScale, layout['text-keep-upright'], textAlongLine, - collisionTile.angle); - } - } - - if (hasIcon) { - if (!layout['icon-ignore-placement']) { - collisionTile.insertCollisionFeature(symbolInstance.iconCollisionFeature, iconScale); - } - if (iconScale <= maxScale) { - this.addSymbols(buffers.iconVertex, buffers.iconElement, elementGroups.icon, - symbolInstance.iconQuads, iconScale, layout['icon-keep-upright'], iconAlongLine, - collisionTile.angle); - } - } - - } - - if (collisionDebug) this.addToDebugBuffers(collisionTile); -}; - -SymbolBucket.prototype.addSymbols = function(vertex, element, elementGroups, quads, scale, keepUpright, alongLine, placementAngle) { - - elementGroups.makeRoomFor(4 * quads.length); - var elementGroup = elementGroups.current; - - var zoom = this.zoom; - var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0); - - for (var k = 0; k < quads.length; k++) { - - var symbol = quads[k], - angle = symbol.angle; - - // drop upside down versions of glyphs - var a = (angle + placementAngle + Math.PI) % (Math.PI * 2); - if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue; - - var tl = symbol.tl, - tr = symbol.tr, - bl = symbol.bl, - br = symbol.br, - tex = symbol.tex, - anchorPoint = symbol.anchorPoint, - - minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom), - maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25); - - if (maxZoom <= minZoom) continue; - - // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels - if (minZoom === placementZoom) minZoom = 0; - - var triangleIndex = vertex.index - elementGroup.vertexStartIndex; - - vertex.add(anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom); - vertex.add(anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom); - vertex.add(anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom); - vertex.add(anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom); - elementGroup.vertexLength += 4; - - element.add(triangleIndex, triangleIndex + 1, triangleIndex + 2); - element.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3); - elementGroup.elementLength += 2; - } - -}; - -SymbolBucket.prototype.getDependencies = function(tile, actor, callback) { - var firstdone = false; - this.getTextDependencies(tile, actor, done); - this.getIconDependencies(tile, actor, done); - function done(err) { - if (err || firstdone) return callback(err); - firstdone = true; - } -}; - -SymbolBucket.prototype.getIconDependencies = function(tile, actor, callback) { - if (this.layoutProperties['icon-image']) { - var features = this.features; - var icons = resolveIcons(features, this.layoutProperties); - - if (icons.length) { - actor.send('get icons', { icons: icons }, setIcons.bind(this)); - } else { - callback(); - } - } else { - callback(); - } - - function setIcons(err, newicons) { - if (err) return callback(err); - this.icons = newicons; - callback(); - } -}; - -SymbolBucket.prototype.getTextDependencies = function(tile, actor, callback) { - var features = this.features; - var fontstack = this.layoutProperties['text-font']; - - var stacks = this.stacks = tile.stacks; - if (stacks[fontstack] === undefined) { - stacks[fontstack] = {}; - } - var stack = stacks[fontstack]; - - var data = resolveText(features, this.layoutProperties, stack); - this.textFeatures = data.textFeatures; - - actor.send('get glyphs', { - uid: tile.uid, - fontstack: fontstack, - codepoints: data.codepoints - }, function(err, newstack) { - if (err) return callback(err); - - for (var codepoint in newstack) { - stack[codepoint] = newstack[codepoint]; - } - - callback(); - }); -}; - -SymbolBucket.prototype.addToDebugBuffers = function(collisionTile) { - - this.elementGroups.collisionBox = new ElementGroups(this.buffers.collisionBoxVertex); - this.elementGroups.collisionBox.makeRoomFor(0); - var buffer = this.buffers.collisionBoxVertex; - var angle = -collisionTile.angle; - var yStretch = collisionTile.yStretch; - - for (var j = 0; j < this.symbolInstances.length; j++) { - for (var i = 0; i < 2; i++) { - var feature = this.symbolInstances[j][i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature']; - if (!feature) continue; - var boxes = feature.boxes; - - for (var b = 0; b < boxes.length; b++) { - var box = boxes[b]; - var anchorPoint = box.anchorPoint; - - var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle); - var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle); - var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle); - var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle); - - var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2)); - var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2)); - - buffer.add(anchorPoint, tl, maxZoom, placementZoom); - buffer.add(anchorPoint, tr, maxZoom, placementZoom); - buffer.add(anchorPoint, tr, maxZoom, placementZoom); - buffer.add(anchorPoint, br, maxZoom, placementZoom); - buffer.add(anchorPoint, br, maxZoom, placementZoom); - buffer.add(anchorPoint, bl, maxZoom, placementZoom); - buffer.add(anchorPoint, bl, maxZoom, placementZoom); - buffer.add(anchorPoint, tl, maxZoom, placementZoom); - - this.elementGroups.collisionBox.current.vertexLength += 8; - } - } - } -}; - -function SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers, - textBoxScale, textPadding, textAlongLine, - iconBoxScale, iconPadding, iconAlongLine) { - - this.x = anchor.x; - this.y = anchor.y; - this.hasText = !!shapedText; - this.hasIcon = !!shapedIcon; - - if (this.hasText) { - this.glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layout, textAlongLine) : []; - this.textCollisionFeature = new CollisionFeature(line, anchor, shapedText, textBoxScale, textPadding, textAlongLine); - } - - if (this.hasIcon) { - this.iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layout, iconAlongLine) : []; - this.iconCollisionFeature = new CollisionFeature(line, anchor, shapedIcon, iconBoxScale, iconPadding, iconAlongLine); - } -} - -},{"../symbol/anchor":59,"../symbol/clip_line":62,"../symbol/collision_feature":64,"../symbol/get_anchors":66,"../symbol/mergelines":69,"../symbol/quads":70,"../symbol/resolve_icons":71,"../symbol/resolve_text":72,"../symbol/shaping":73,"../util/token":102,"./element_groups":12,"point-geometry":134}],17:[function(require,module,exports){ -'use strict'; - -module.exports = Coordinate; - -/** - * A coordinate is a column, row, zoom combination, often used - * as the data component of a tile. - * - * @param {number} column - * @param {number} row - * @param {number} zoom - * @private - */ -function Coordinate(column, row, zoom) { - this.column = column; - this.row = row; - this.zoom = zoom; -} - -Coordinate.prototype = { - - /** - * Create a clone of this coordinate that can be mutated without - * changing the original coordinate - * - * @returns {Coordinate} clone - * @private - * var coord = new Coordinate(0, 0, 0); - * var c2 = coord.clone(); - * // since coord is cloned, modifying a property of c2 does - * // not modify it. - * c2.zoom = 2; - */ - clone: function() { - return new Coordinate(this.column, this.row, this.zoom); - }, - - /** - * Zoom this coordinate to a given zoom level. This returns a new - * coordinate object, not mutating the old one. - * - * @param {number} zoom - * @returns {Coordinate} zoomed coordinate - * @private - * @example - * var coord = new Coordinate(0, 0, 0); - * var c2 = coord.zoomTo(1); - * c2 // equals new Coordinate(0, 0, 1); - */ - zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); }, - - /** - * Subtract the column and row values of this coordinate from those - * of another coordinate. The other coordinat will be zoomed to the - * same level as `this` before the subtraction occurs - * - * @param {Coordinate} c other coordinate - * @returns {Coordinate} result - * @private - */ - sub: function(c) { return this.clone()._sub(c); }, - - _zoomTo: function(zoom) { - var scale = Math.pow(2, zoom - this.zoom); - this.column *= scale; - this.row *= scale; - this.zoom = zoom; - return this; - }, - - _sub: function(c) { - c = c.zoomTo(this.zoom); - this.column -= c.column; - this.row -= c.row; - return this; - } -}; - -},{}],18:[function(require,module,exports){ -'use strict'; - -module.exports = LatLng; - -var wrap = require('../util/util').wrap; - -/** - * Create a latitude, longitude object from a given latitude and longitude pair in degrees. - * - * @class LatLng - * @classdesc A representation of a latitude and longitude point, in degrees. - * @param {number} lat latitude - * @param {number} lng longitude - * @example - * var latlng = new mapboxgl.LatLng(37.76, -122.44); - */ -function LatLng(lat, lng) { - if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); - } - this.lat = +lat; - this.lng = +lng; -} - -/** - * Return a new `LatLng` object whose longitude is wrapped to the range (-180, 180). - * - * @returns {LatLng} wrapped LatLng object - * @example - * var point = mapboxgl.LatLng(0, 200); - * var wrapped = point.wrap(); - * wrapped.lng; // = -160 - */ -LatLng.prototype.wrap = function () { - return new LatLng(this.lat, wrap(this.lng, -180, 180)); -}; - -/** - * Convert an array to a `LatLng` object, or return an existing `LatLng` object - * unchanged. - * - * @param {Array|LatLng} input `input` to convert - * @returns {LatLng} LatLng object or original input - * @example - * var ll = mapboxgl.LatLng.convert([10, 10]); - * var ll2 = new mapboxgl.LatLng(10, 10); - * ll // = ll2 - */ -LatLng.convert = function (input) { - if (input instanceof LatLng) { - return input; - } - if (Array.isArray(input)) { - return new LatLng(input[0], input[1]); - } - return input; -}; - -},{"../util/util":103}],19:[function(require,module,exports){ -'use strict'; - -module.exports = LatLngBounds; - -var LatLng = require('./lat_lng'); - -/** - * Creates a bounding box from the given pair of points. If parameteres are omitted, a `null` bounding box is created. - * - * @class LatLngBounds - * @classdesc A representation of rectangular box on the earth, defined by its southwest and northeast points in latitude and longitude. - * @param {LatLng} sw southwest - * @param {LatLng} ne northeast - * @example - * var sw = new mapboxgl.LatLng(0, 0); - * var ne = new mapboxgl.LatLng(10, -10); - * var bounds = new mapboxgl.LatLngBounds(sw, ne); - * - */ -function LatLngBounds(sw, ne) { - if (!sw) return; - - var latlngs = ne ? [sw, ne] : sw; - - for (var i = 0, len = latlngs.length; i < len; i++) { - this.extend(latlngs[i]); - } -} - -LatLngBounds.prototype = { - - /** - * Extend the bounds to include a given LatLng or LatLngBounds. - * - * @param {LatLng|LatLngBounds} obj object to extend to - * @returns {LatLngBounds} `this` - */ - extend: function(obj) { - var sw = this._sw, - ne = this._ne, - sw2, ne2; - - if (obj instanceof LatLng) { - sw2 = obj; - ne2 = obj; - - } else if (obj instanceof LatLngBounds) { - sw2 = obj._sw; - ne2 = obj._ne; - - if (!sw2 || !ne2) return this; - - } else { - return obj ? this.extend(LatLng.convert(obj) || LatLngBounds.convert(obj)) : this; - } - - if (!sw && !ne) { - this._sw = new LatLng(sw2.lat, sw2.lng); - this._ne = new LatLng(ne2.lat, ne2.lng); - - } else { - sw.lat = Math.min(sw2.lat, sw.lat); - sw.lng = Math.min(sw2.lng, sw.lng); - ne.lat = Math.max(ne2.lat, ne.lat); - ne.lng = Math.max(ne2.lng, ne.lng); - } - - return this; - }, - - /** - * Get the point equidistant from this box's corners - * @returns {LatLng} centerpoint - * @example - * var bounds = new mapboxgl.LatLngBounds( - * new mapboxgl.LatLng(10, 10), - * new mapboxgl.LatLng(-10, -10); - * bounds.getCenter(); // equals mapboxgl.LatLng(0, 0) - */ - getCenter: function() { - return new LatLng((this._sw.lat + this._ne.lat) / 2, (this._sw.lng + this._ne.lng) / 2); - }, - - /** - * Get southwest corner - * @returns {LatLng} southwest - */ - getSouthWest: function() { return this._sw; }, - - /** - * Get northeast corner - * @returns {LatLng} northeast - */ - getNorthEast: function() { return this._ne; }, - - /** - * Get northwest corner - * @returns {LatLng} northwest - */ - getNorthWest: function() { return new LatLng(this.getNorth(), this.getWest()); }, - - /** - * Get southeast corner - * @returns {LatLng} southeast - */ - getSouthEast: function() { return new LatLng(this.getSouth(), this.getEast()); }, - - /** - * Get west edge longitude - * @returns {number} west - */ - getWest: function() { return this._sw.lng; }, - - /** - * Get south edge latitude - * @returns {number} south - */ - getSouth: function() { return this._sw.lat; }, - - /** - * Get east edge longitude - * @returns {number} east - */ - getEast: function() { return this._ne.lng; }, - - /** - * Get north edge latitude - * @returns {number} north - */ - getNorth: function() { return this._ne.lat; } -}; - -/** - * constructs LatLngBounds from an array if necessary - * @param {LatLngBounds|*} a any input - * @returns {LatLngBounds|false} - * @example - * // calls LatLng.convert internally to - * // support arrays as latlng values - * LatLngBounds.convert([[-10, -10], [10, 10]]); - */ -LatLngBounds.convert = function (a) { - if (!a || a instanceof LatLngBounds) return a; - return new LatLngBounds(a); -}; - -},{"./lat_lng":18}],20:[function(require,module,exports){ -'use strict'; - -var LatLng = require('./lat_lng'), - Point = require('point-geometry'), - Coordinate = require('./coordinate'), - wrap = require('../util/util').wrap, - interp = require('../util/interpolate'), - vec4 = require('gl-matrix').vec4, - mat4 = require('gl-matrix').mat4; - -module.exports = Transform; - -/* - * A single transform, generally used for a single tile to be - * scaled, rotated, and zoomed. - * - * @param {number} minZoom - * @param {number} maxZoom - * @private - */ -function Transform(minZoom, maxZoom) { - this.tileSize = 512; // constant - - this._minZoom = minZoom || 0; - this._maxZoom = maxZoom || 22; - - this.latRange = [-85.05113, 85.05113]; - - this.width = 0; - this.height = 0; - this.zoom = 0; - this.center = new LatLng(0, 0); - this.angle = 0; - this._altitude = 1.5; - this._pitch = 0; -} - -Transform.prototype = { - get minZoom() { return this._minZoom; }, - set minZoom(zoom) { - this._minZoom = zoom; - this.zoom = Math.max(this.zoom, zoom); - }, - - get maxZoom() { return this._maxZoom; }, - set maxZoom(zoom) { - this._maxZoom = zoom; - this.zoom = Math.min(this.zoom, zoom); - }, - - get worldSize() { - return this.tileSize * this.scale; - }, - - get centerPoint() { - return this.size._div(2); - }, - - get size() { - return new Point(this.width, this.height); - }, - - get bearing() { - return -this.angle / Math.PI * 180; - }, - set bearing(bearing) { - this.angle = -wrap(bearing, -180, 180) * Math.PI / 180; - }, - - get pitch() { - return this._pitch / Math.PI * 180; - }, - set pitch(pitch) { - this._pitch = Math.min(60, pitch) / 180 * Math.PI; - }, - - get altitude() { - return this._altitude; - }, - set altitude(altitude) { - this._altitude = Math.max(0.75, altitude); - }, - - get zoom() { return this._zoom; }, - set zoom(zoom) { - zoom = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); - this._zoom = zoom; - this.scale = this.zoomScale(zoom); - this.tileZoom = Math.floor(zoom); - this.zoomFraction = zoom - this.tileZoom; - this._constrain(); - }, - - zoomScale: function(zoom) { return Math.pow(2, zoom); }, - scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; }, - - project: function(latlng, worldSize) { - return new Point( - this.lngX(latlng.lng, worldSize), - this.latY(latlng.lat, worldSize)); - }, - - unproject: function(point, worldSize) { - return new LatLng( - this.yLat(point.y, worldSize), - this.xLng(point.x, worldSize)); - }, - - get x() { return this.lngX(this.center.lng); }, - get y() { return this.latY(this.center.lat); }, - - get point() { return new Point(this.x, this.y); }, - - /** - * lat/lon <-> absolute pixel coords conversion - * @param {number} lon - * @param {number} [worldSize=this.worldSize] - * @returns {number} pixel coordinate - * @private - */ - lngX: function(lon, worldSize) { - return (180 + lon) * (worldSize || this.worldSize) / 360; - }, - /** - * latitude to absolute y coord - * - * @param {number} lat - * @param {number} [worldSize=this.worldSize] - * @returns {number} pixel coordinate - * @private - */ - latY: function(lat, worldSize) { - var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); - return (180 - y) * (worldSize || this.worldSize) / 360; - }, - - xLng: function(x, worldSize) { - return x * 360 / (worldSize || this.worldSize) - 180; - }, - yLat: function(y, worldSize) { - var y2 = 180 - y * 360 / (worldSize || this.worldSize); - return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; - }, - - panBy: function(offset) { - var point = this.centerPoint._add(offset); - this.center = this.pointLocation(point); - this._constrain(); - }, - - setLocationAtPoint: function(latlng, point) { - var c = this.locationCoordinate(latlng); - var coordAtPoint = this.pointCoordinate(point); - var coordCenter = this.pointCoordinate(this.centerPoint); - - var translate = coordAtPoint._sub(c); - this.center = this.coordinateLocation(coordCenter._sub(translate)); - - this._constrain(); - }, - - setZoomAround: function(zoom, center) { - var p; - if (center) p = this.locationPoint(center); - this.zoom = zoom; - if (center) this.setLocationAtPoint(center, p); - }, - - setBearingAround: function(bearing, center) { - var p; - if (center) p = this.locationPoint(center); - this.bearing = bearing; - if (center) this.setLocationAtPoint(center, p); - }, - - /** - * Given a location, return the screen point that corresponds to it - * @param {LatLng} latlng location - * @returns {Point} screen point - * @private - */ - locationPoint: function(latlng) { - return this.coordinatePoint(this.locationCoordinate(latlng)); - }, - - /** - * Given a point on screen, return its latlng - * @param {Point} p screen point - * @returns {LatLng} latlng location - * @private - */ - pointLocation: function(p) { - return this.coordinateLocation(this.pointCoordinate(p)); - }, - - /** - * Given a geographical latlng, return an unrounded - * coordinate that represents it at this transform's zoom level and - * worldsize. - * @param {LatLng} latlng - * @returns {Coordinate} - * @private - */ - locationCoordinate: function(latlng) { - var k = this.zoomScale(this.tileZoom) / this.worldSize; - return new Coordinate( - this.lngX(latlng.lng) * k, - this.latY(latlng.lat) * k, - this.tileZoom); - }, - - /** - * Given a Coordinate, return its geographical position. - * @param {Coordinate} coord - * @returns {LatLng} latlng - * @private - */ - coordinateLocation: function(coord) { - var worldSize = this.zoomScale(coord.zoom); - return new LatLng( - this.yLat(coord.row, worldSize), - this.xLng(coord.column, worldSize)); - }, - - pointCoordinate: function(p, targetZ) { - - if (targetZ === undefined) targetZ = 0; - - var matrix = this.coordinatePointMatrix(this.tileZoom); - var inverted = mat4.invert(new Float64Array(16), matrix); - - if (!inverted) throw "failed to invert matrix"; - - // since we don't know the correct projected z value for the point, - // unproject two points to get a line and then find the point on that - // line with z=0 - - var coord0 = vec4.transformMat4([], [p.x, p.y, 0, 1], inverted); - var coord1 = vec4.transformMat4([], [p.x, p.y, 1, 1], inverted); - - var w0 = coord0[3]; - var w1 = coord1[3]; - var x0 = coord0[0] / w0; - var x1 = coord1[0] / w1; - var y0 = coord0[1] / w0; - var y1 = coord1[1] / w1; - var z0 = coord0[2] / w0; - var z1 = coord1[2] / w1; - - - var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); - - return new Coordinate( - interp(x0, x1, t), - interp(y0, y1, t), - this.tileZoom); - }, - - /** - * Given a coordinate, return the screen point that corresponds to it - * @param {Coordinate} coord - * @returns {Point} screen point - * @private - */ - coordinatePoint: function(coord) { - var matrix = this.coordinatePointMatrix(coord.zoom); - var p = vec4.transformMat4([], [coord.column, coord.row, 0, 1], matrix); - return new Point(p[0] / p[3], p[1] / p[3]); - }, - - coordinatePointMatrix: function(z) { - var proj = this.getProjMatrix(); - var scale = this.worldSize / this.zoomScale(z); - mat4.scale(proj, proj, [scale, scale, 1]); - mat4.multiply(proj, this.getPixelMatrix(), proj); - return proj; - }, - - /** - * converts gl coordinates -1..1 to pixels 0..width - * @returns {Object} matrix - * @private - */ - getPixelMatrix: function() { - var m = mat4.create(); - mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]); - mat4.translate(m, m, [1, -1, 0]); - return m; - }, - - _constrain: function() { - if (!this.center) return; - - var minY, maxY, minX, maxX, sy, sx, x2, y2, - size = this.size; - - if (this.latRange) { - minY = this.latY(this.latRange[1]); - maxY = this.latY(this.latRange[0]); - sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; - } - - if (this.lngRange) { - minX = this.lngX(this.lngRange[0]); - maxX = this.lngX(this.lngRange[1]); - sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; - } - - // how much the map should scale to fit the screen into given latitude/longitude ranges - var s = Math.max(sx || 0, sy || 0); - - if (s) { - this.center = this.unproject(new Point( - sx ? (maxX + minX) / 2 : this.x, - sy ? (maxY + minY) / 2 : this.y)); - this.zoom += this.scaleZoom(s); - return; - } - - if (this.latRange) { - var y = this.y, - h2 = size.y / 2; - - if (y - h2 < minY) y2 = minY + h2; - if (y + h2 > maxY) y2 = maxY - h2; - } - - if (this.lngRange) { - var x = this.x, - w2 = size.x / 2; - - if (x - w2 < minX) x2 = minX + w2; - if (x + w2 > maxX) x2 = maxX - w2; - } - - // pan the map if the screen goes off the range - if (x2 !== undefined || y2 !== undefined) { - this.center = this.unproject(new Point( - x2 !== undefined ? x2 : this.x, - y2 !== undefined ? y2 : this.y)); - } - }, - - getProjMatrix: function() { - var m = new Float64Array(16); - - // Find the distance from the center point to the center top in altitude units using law of sines. - var halfFov = Math.atan(0.5 / this.altitude); - var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov); - // Calculate z value of the farthest fragment that should be rendered. - var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude; - - mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ); - - mat4.translate(m, m, [0, 0, -this.altitude]); - - // After the rotateX, z values are in pixel units. Convert them to - // altitude unites. 1 altitude unit = the screen height. - mat4.scale(m, m, [1, -1, 1 / this.height]); - - mat4.rotateX(m, m, this._pitch); - mat4.rotateZ(m, m, this.angle); - mat4.translate(m, m, [-this.x, -this.y, 0]); - return m; - } -}; - -},{"../util/interpolate":99,"../util/util":103,"./coordinate":17,"./lat_lng":18,"gl-matrix":116,"point-geometry":134}],21:[function(require,module,exports){ -'use strict'; - -// Font data From Hershey Simplex Font -// http://paulbourke.net/dataformats/hershey/ -var simplexFont = { - " ": [16, []], - "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], - "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], - "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], - "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], - "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], - "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], - "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], - "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], - ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], - "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], - "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], - ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], - "-": [26, [4, 9, 22, 9]], - ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], - "/": [22, [20, 25, 2, -7]], - "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], - "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], - "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], - "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], - "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], - "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], - "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], - "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], - "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], - "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], - ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], - ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], - "<": [24, [20, 18, 4, 9, 20, 0]], - "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], - ">": [24, [4, 18, 20, 9, 4, 0]], - "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], - "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], - "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], - "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], - "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], - "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], - "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], - "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], - "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], - "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], - "I": [8, [4, 21, 4, 0]], - "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], - "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], - "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], - "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], - "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], - "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], - "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], - "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], - "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], - "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], - "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], - "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], - "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], - "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], - "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], - "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], - "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], - "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], - "\\": [14, [0, 21, 14, -3]], - "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], - "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], - "_": [16, [0, -2, 16, -2]], - "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], - "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], - "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], - "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], - "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], - "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], - "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], - "l": [8, [4, 21, 4, 0]], - "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], - "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], - "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], - "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], - "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], - "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], - "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], - "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], - "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], - "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], - "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], - "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], - "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], - "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], - "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], - "|": [8, [4, 25, 4, -7]], - "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], - "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] -}; - -module.exports = function textVertices(text, left, baseline, scale) { - scale = scale || 1; - - var strokes = [], - i, len, j, len2, glyph, x, y, prev; - - for (i = 0, len = text.length; i < len; i++) { - glyph = simplexFont[text[i]]; - if (!glyph) continue; - prev = null; - - for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { - if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { - prev = null; - - } else { - x = left + glyph[1][j] * scale; - y = baseline - glyph[1][j + 1] * scale; - if (prev) { - strokes.push(prev.x, prev.y, x, y); - } - prev = {x: x, y: y}; - } - } - left += glyph[0] * scale; - } - - return strokes; -}; - -},{}],22:[function(require,module,exports){ -'use strict'; - -/** - * mapboxgl is a A WebGL JavaScript interactive maps library that can render - * [Mapbox vector tiles](https://www.mapbox.com/blog/vector-tiles/). - * - * @module mapboxgl - * @summary WebGL JavaScript map library - */ - -// jshint -W079 -var mapboxgl = module.exports = {}; - -mapboxgl.Map = require('./ui/map'); -mapboxgl.Navigation = require('./ui/control/navigation'); -mapboxgl.Attribution = require('./ui/control/attribution'); -mapboxgl.Popup = require('./ui/popup'); - -mapboxgl.GeoJSONSource = require('./source/geojson_source'); -mapboxgl.VideoSource = require('./source/video_source'); - -mapboxgl.Style = require('./style/style'); - -mapboxgl.LatLng = require('./geo/lat_lng'); -mapboxgl.LatLngBounds = require('./geo/lat_lng_bounds'); -mapboxgl.Point = require('point-geometry'); - -mapboxgl.Evented = require('./util/evented'); -mapboxgl.util = require('./util/util'); - -mapboxgl.supported = require('./util/browser').supported; - -var ajax = require('./util/ajax'); -mapboxgl.util.getJSON = ajax.getJSON; -mapboxgl.util.getArrayBuffer = ajax.getArrayBuffer; - -var config = require('./util/config'); -mapboxgl.config = config; - -Object.defineProperty(mapboxgl, 'accessToken', { - get: function() { return config.ACCESS_TOKEN; }, - set: function(token) { config.ACCESS_TOKEN = token; } -}); - -},{"./geo/lat_lng":18,"./geo/lat_lng_bounds":19,"./source/geojson_source":36,"./source/video_source":44,"./style/style":52,"./ui/control/attribution":76,"./ui/control/navigation":78,"./ui/map":88,"./ui/popup":89,"./util/ajax":91,"./util/browser":92,"./util/config":96,"./util/evented":97,"./util/util":103,"point-geometry":134}],23:[function(require,module,exports){ -'use strict'; - -var mat3 = require('gl-matrix').mat3; - -module.exports = drawBackground; - -function drawBackground(painter, layer, posMatrix) { - var gl = painter.gl; - var color = layer.paint['background-color']; - var image = layer.paint['background-image']; - var opacity = layer.paint['background-opacity']; - var shader; - - var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null; - var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null; - - if (imagePosA && imagePosB) { - // Draw texture fill - shader = painter.patternShader; - gl.switchShader(shader, posMatrix); - gl.uniform1i(shader.u_image, 0); - gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); - gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); - gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); - gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); - gl.uniform1f(shader.u_opacity, opacity); - - var transform = painter.transform; - var sizeA = imagePosA.size; - var sizeB = imagePosB.size; - var center = transform.locationCoordinate(transform.center); - var scale = 1 / Math.pow(2, transform.zoomFraction); - - gl.uniform1f(shader.u_mix, image.t); - - var matrixA = mat3.create(); - mat3.scale(matrixA, matrixA, [ - 1 / (sizeA[0] * image.fromScale), - 1 / (sizeA[1] * image.fromScale) - ]); - mat3.translate(matrixA, matrixA, [ - (center.column * transform.tileSize) % (sizeA[0] * image.fromScale), - (center.row * transform.tileSize) % (sizeA[1] * image.fromScale) - ]); - mat3.rotate(matrixA, matrixA, -transform.angle); - mat3.scale(matrixA, matrixA, [ - scale * transform.width / 2, - -scale * transform.height / 2 - ]); - - var matrixB = mat3.create(); - mat3.scale(matrixB, matrixB, [ - 1 / (sizeB[0] * image.toScale), - 1 / (sizeB[1] * image.toScale) - ]); - mat3.translate(matrixB, matrixB, [ - (center.column * transform.tileSize) % (sizeB[0] * image.toScale), - (center.row * transform.tileSize) % (sizeB[1] * image.toScale) - ]); - mat3.rotate(matrixB, matrixB, -transform.angle); - mat3.scale(matrixB, matrixB, [ - scale * transform.width / 2, - -scale * transform.height / 2 - ]); - - gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA); - gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB); - - painter.spriteAtlas.bind(gl, true); - - } else { - // Draw filling rectangle. - shader = painter.fillShader; - gl.switchShader(shader, posMatrix); - gl.disableVertexAttribArray(shader.a_color); - gl.vertexAttrib4fv(shader.a_color, color); - } - - gl.disable(gl.STENCIL_TEST); - gl.bindBuffer(gl.ARRAY_BUFFER, painter.backgroundBuffer); - gl.vertexAttribPointer(shader.a_pos, painter.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.backgroundBuffer.itemCount); - gl.enable(gl.STENCIL_TEST); - - gl.stencilMask(0x00); - gl.stencilFunc(gl.EQUAL, 0x80, 0x80); -} - -},{"gl-matrix":116}],24:[function(require,module,exports){ -'use strict'; - -module.exports = drawPlacementDebug; - -function drawPlacementDebug(painter, layer, posMatrix, tile) { - - var elementGroups = tile.elementGroups[layer.ref || layer.id].collisionBox; - if (!elementGroups) return; - - var gl = painter.gl; - var buffer = tile.buffers.collisionBoxVertex; - var shader = painter.collisionBoxShader; - - gl.enable(gl.STENCIL_TEST); - - gl.switchShader(shader, posMatrix); - buffer.bind(gl, shader); - gl.lineWidth(1); - - var stride = 12; - gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, stride, 0); - gl.vertexAttribPointer(shader.a_extrude, 2, gl.SHORT, false, stride, 4); - gl.vertexAttribPointer(shader.a_data, 2, gl.UNSIGNED_BYTE, false, stride, 8); - - gl.uniform1f(shader.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z)); - gl.uniform1f(shader.u_zoom, painter.transform.zoom * 10); - gl.uniform1f(shader.u_maxzoom, (tile.coord.z + 1) * 10); - - var begin = elementGroups.groups[0].vertexStartIndex; - var len = elementGroups.groups[0].vertexLength; - gl.drawArrays(gl.LINES, begin, len); - - gl.disable(gl.STENCIL_TEST); -} - -},{}],25:[function(require,module,exports){ -'use strict'; - -var textVertices = require('../lib/debugtext'); -var browser = require('../util/browser'); - -module.exports = drawDebug; - -function drawDebug(painter, tile) { - var gl = painter.gl; - - // Blend to the front, not the back. - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - - gl.switchShader(painter.debugShader, tile.posMatrix); - - // draw bounding rectangle - gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugBuffer); - gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugBuffer.itemSize, gl.SHORT, false, 0, 0); - gl.uniform4f(painter.debugShader.u_color, 1, 0, 0, 1); - gl.lineWidth(4); - gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.itemCount); - - var vertices = textVertices(tile.coord.toString(), 50, 200, 5); - - gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugTextBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Int16Array(vertices), gl.STREAM_DRAW); - gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugTextBuffer.itemSize, gl.SHORT, false, 0, 0); - gl.lineWidth(8 * browser.devicePixelRatio); - gl.uniform4f(painter.debugShader.u_color, 1, 1, 1, 1); - gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize); - gl.lineWidth(2 * browser.devicePixelRatio); - gl.uniform4f(painter.debugShader.u_color, 0, 0, 0, 1); - gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize); - - // Revert blending mode to blend to the back. - gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); -} - -},{"../lib/debugtext":21,"../util/browser":92}],26:[function(require,module,exports){ -'use strict'; - -var browser = require('../util/browser'); -var mat3 = require('gl-matrix').mat3; - -module.exports = drawFill; - -function drawFill(painter, layer, posMatrix, tile) { - // No data - if (!tile.buffers) return; - var elementGroups = tile.elementGroups[layer.ref || layer.id]; - if (!elementGroups) return; - - var gl = painter.gl; - var translatedPosMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['fill-translate'], layer.paint['fill-translate-anchor']); - - var color = layer.paint['fill-color']; - - var vertex, elements, group, count; - - // Draw the stencil mask. - - // We're only drawing to the first seven bits (== support a maximum of - // 127 overlapping polygons in one place before we get rendering errors). - gl.stencilMask(0x3F); - gl.clear(gl.STENCIL_BUFFER_BIT); - - // Draw front facing triangles. Wherever the 0x80 bit is 1, we are - // increasing the lower 7 bits by one if the triangle is a front-facing - // triangle. This means that all visible polygons should be in CCW - // orientation, while all holes (see below) are in CW orientation. - gl.stencilFunc(gl.NOTEQUAL, 0x80, 0x80); - - // When we do a nonzero fill, we count the number of times a pixel is - // covered by a counterclockwise polygon, and subtract the number of - // times it is "uncovered" by a clockwise polygon. - gl.stencilOpSeparate(gl.FRONT, gl.INCR_WRAP, gl.KEEP, gl.KEEP); - gl.stencilOpSeparate(gl.BACK, gl.DECR_WRAP, gl.KEEP, gl.KEEP); - - // When drawing a shape, we first draw all shapes to the stencil buffer - // and incrementing all areas where polygons are - gl.colorMask(false, false, false, false); - - // Draw the actual triangle fan into the stencil buffer. - gl.switchShader(painter.fillShader, translatedPosMatrix); - - // Draw all buffers - vertex = tile.buffers.fillVertex; - vertex.bind(gl); - elements = tile.buffers.fillElement; - elements.bind(gl); - - var offset, elementOffset; - - gl.disableVertexAttribArray(painter.fillShader.a_color); - - for (var i = 0; i < elementGroups.groups.length; i++) { - group = elementGroups.groups[i]; - offset = group.vertexStartIndex * vertex.itemSize; - gl.vertexAttribPointer(painter.fillShader.a_pos, 2, gl.SHORT, false, 4, offset + 0); - - count = group.elementLength * 3; - elementOffset = group.elementStartIndex * elements.itemSize; - gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); - } - - // Now that we have the stencil mask in the stencil buffer, we can start - // writing to the color buffer. - gl.colorMask(true, true, true, true); - - // From now on, we don't want to update the stencil buffer anymore. - gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); - gl.stencilMask(0x0); - - var strokeColor = layer.paint['fill-outline-color']; - - // Because we're drawing top-to-bottom, and we update the stencil mask - // below, we have to draw the outline first (!) - if (layer.paint['fill-antialias'] === true && !(layer.paint['fill-image'] && !strokeColor)) { - gl.switchShader(painter.outlineShader, translatedPosMatrix); - gl.lineWidth(2 * browser.devicePixelRatio); - - if (strokeColor) { - // If we defined a different color for the fill outline, we are - // going to ignore the bits in 0x3F and just care about the global - // clipping mask. - gl.stencilFunc(gl.EQUAL, 0x80, 0x80); - } else { - // Otherwise, we only want to draw the antialiased parts that are - // *outside* the current shape. This is important in case the fill - // or stroke color is translucent. If we wouldn't clip to outside - // the current shape, some pixels from the outline stroke overlapped - // the (non-antialiased) fill. - gl.stencilFunc(gl.EQUAL, 0x80, 0xBF); - } - - gl.uniform2f(painter.outlineShader.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); - - // Draw all buffers - vertex = tile.buffers.fillVertex; - elements = tile.buffers.outlineElement; - elements.bind(gl); - - gl.disableVertexAttribArray(painter.outlineShader.a_color); - gl.vertexAttrib4fv(painter.outlineShader.a_color, strokeColor ? strokeColor : color); - - for (var k = 0; k < elementGroups.groups.length; k++) { - group = elementGroups.groups[k]; - offset = group.vertexStartIndex * vertex.itemSize; - gl.vertexAttribPointer(painter.outlineShader.a_pos, 2, gl.SHORT, false, 4, offset + 0); - - count = group.secondElementLength * 2; - elementOffset = group.secondElementStartIndex * elements.itemSize; - gl.drawElements(gl.LINES, count, gl.UNSIGNED_SHORT, elementOffset); - } - } - - var image = layer.paint['fill-image']; - var opacity = layer.paint['fill-opacity'] || 1; - var shader; - - if (image) { - // Draw texture fill - var imagePosA = painter.spriteAtlas.getPosition(image.from, true); - var imagePosB = painter.spriteAtlas.getPosition(image.to, true); - if (!imagePosA || !imagePosB) return; - - shader = painter.patternShader; - gl.switchShader(shader, posMatrix); - gl.uniform1i(shader.u_image, 0); - gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); - gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); - gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); - gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); - gl.uniform1f(shader.u_opacity, opacity); - gl.uniform1f(shader.u_mix, image.t); - - var factor = (tile.tileExtent / tile.tileSize) / Math.pow(2, painter.transform.tileZoom - tile.coord.z); - - var matrixA = mat3.create(); - mat3.scale(matrixA, matrixA, [ - 1 / (imagePosA.size[0] * factor * image.fromScale), - 1 / (imagePosA.size[1] * factor * image.fromScale) - ]); - - var matrixB = mat3.create(); - mat3.scale(matrixB, matrixB, [ - 1 / (imagePosB.size[0] * factor * image.toScale), - 1 / (imagePosB.size[1] * factor * image.toScale) - ]); - - gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA); - gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB); - - painter.spriteAtlas.bind(gl, true); - - } else { - // Draw filling rectangle. - shader = painter.fillShader; - gl.switchShader(shader, posMatrix); - gl.disableVertexAttribArray(shader.a_color); - gl.vertexAttrib4fv(shader.a_color, color); - } - - // Only draw regions that we marked - gl.stencilFunc(gl.NOTEQUAL, 0x0, 0x3F); - gl.bindBuffer(gl.ARRAY_BUFFER, painter.tileExtentBuffer); - gl.vertexAttribPointer(shader.a_pos, painter.tileExtentBuffer.itemSize, gl.SHORT, false, 0, 0); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.itemCount); - - gl.stencilMask(0x00); - gl.stencilFunc(gl.EQUAL, 0x80, 0x80); -} - -},{"../util/browser":92,"gl-matrix":116}],27:[function(require,module,exports){ -'use strict'; - -var browser = require('../util/browser'); -var mat2 = require('gl-matrix').mat2; - -/** - * Draw a line. Under the hood this will read elements from - * a tile, dash textures from a lineAtlas, and style properties from a layer. - * @param {Object} painter - * @param {Object} layer - * @param {Object} posMatrix - * @param {Tile} tile - * @returns {undefined} draws with the painter - * @private - */ -module.exports = function drawLine(painter, layer, posMatrix, tile) { - // No data - if (!tile.buffers) return; - var elementGroups = tile.elementGroups[layer.ref || layer.id]; - if (!elementGroups) return; - - var gl = painter.gl; - - // don't draw zero-width lines - if (layer.paint['line-width'] <= 0) return; - - // the distance over which the line edge fades out. - // Retina devices need a smaller distance to avoid aliasing. - var antialiasing = 1 / browser.devicePixelRatio; - - var blur = layer.paint['line-blur'] + antialiasing; - var edgeWidth = layer.paint['line-width'] / 2; - var inset = -1; - var offset = 0; - var shift = 0; - - if (layer.paint['line-gap-width'] > 0) { - inset = layer.paint['line-gap-width'] / 2 + antialiasing * 0.5; - edgeWidth = layer.paint['line-width']; - - // shift outer lines half a pixel towards the middle to eliminate the crack - offset = inset - antialiasing / 2; - } - - var outset = offset + edgeWidth + antialiasing / 2 + shift; - - var color = layer.paint['line-color']; - var ratio = painter.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize); - var vtxMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']); - - var tr = painter.transform; - - - var antialiasingMatrix = mat2.create(); - mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]); - mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle); - - // calculate how much longer the real world distance is at the top of the screen - // than at the middle of the screen. - var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude)); - var x = tr.height / 2 * Math.tan(tr._pitch); - var extra = (topedgelength + x) / topedgelength - 1; - - // how much the tile is overscaled by - var overscaling = tile.tileSize / painter.transform.tileSize; - - var shader; - - - var dasharray = layer.paint['line-dasharray']; - var image = layer.paint['line-image']; - - if (dasharray) { - - shader = painter.linesdfpatternShader; - gl.switchShader(shader, vtxMatrix, tile.exMatrix); - - gl.uniform1f(shader.u_ratio, ratio); - - var posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round'); - var posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round'); - painter.lineAtlas.bind(gl); - - var patternratio = Math.pow(2, Math.floor(Math.log(painter.transform.scale) / Math.LN2) - tile.coord.z) / 8 * overscaling; - var scaleA = [patternratio / posA.width / dasharray.fromScale, -posA.height / 2]; - var gammaA = painter.lineAtlas.width / (dasharray.fromScale * posA.width * 256 * browser.devicePixelRatio) / 2; - var scaleB = [patternratio / posB.width / dasharray.toScale, -posB.height / 2]; - var gammaB = painter.lineAtlas.width / (dasharray.toScale * posB.width * 256 * browser.devicePixelRatio) / 2; - - gl.uniform2fv(shader.u_patternscale_a, scaleA); - gl.uniform1f(shader.u_tex_y_a, posA.y); - gl.uniform2fv(shader.u_patternscale_b, scaleB); - gl.uniform1f(shader.u_tex_y_b, posB.y); - - gl.uniform1i(shader.u_image, 0); - gl.uniform1f(shader.u_sdfgamma, Math.max(gammaA, gammaB)); - gl.uniform1f(shader.u_mix, dasharray.t); - - } else if (image) { - var imagePosA = painter.spriteAtlas.getPosition(image.from, true); - var imagePosB = painter.spriteAtlas.getPosition(image.to, true); - if (!imagePosA || !imagePosB) return; - var factor = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.tileZoom - tile.coord.z) * overscaling; - - painter.spriteAtlas.bind(gl, true); - - shader = painter.linepatternShader; - gl.switchShader(shader, vtxMatrix, tile.exMatrix); - - gl.uniform1f(shader.u_ratio, ratio); - - gl.uniform2fv(shader.u_pattern_size_a, [imagePosA.size[0] * factor * image.fromScale, imagePosB.size[1] ]); - gl.uniform2fv(shader.u_pattern_size_b, [imagePosB.size[0] * factor * image.toScale, imagePosB.size[1] ]); - gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl); - gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br); - gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl); - gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br); - gl.uniform1f(shader.u_fade, image.t); - - gl.disableVertexAttribArray(shader.a_opacity); - gl.vertexAttrib1f(shader.a_opacity, layer.paint['line-opacity']); - - } else { - shader = painter.lineShader; - gl.switchShader(shader, vtxMatrix, tile.exMatrix); - - gl.uniform1f(shader.u_ratio, ratio); - gl.uniform1f(shader.u_extra, extra); - gl.uniformMatrix2fv(shader.u_antialiasingmatrix, false, antialiasingMatrix); - } - - // linepattern does not have a color attribute - if (shader.a_color !== undefined) { - gl.disableVertexAttribArray(shader.a_color); - gl.vertexAttrib4fv(shader.a_color, color); - } - - gl.disableVertexAttribArray(shader.a_linewidth); - gl.vertexAttrib2f(shader.a_linewidth, outset, inset); - - gl.disableVertexAttribArray(shader.a_blur); - gl.vertexAttrib1f(shader.a_blur, blur); - - var vertex = tile.buffers.lineVertex; - vertex.bind(gl); - var element = tile.buffers.lineElement; - element.bind(gl); - - for (var i = 0; i < elementGroups.groups.length; i++) { - var group = elementGroups.groups[i]; - var vtxOffset = group.vertexStartIndex * vertex.itemSize; - gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, vtxOffset + 0); - gl.vertexAttribPointer(shader.a_data, 4, gl.BYTE, false, 8, vtxOffset + 4); - - var count = group.elementLength * 3; - var elementOffset = group.elementStartIndex * element.itemSize; - gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); - } -}; - -},{"../util/browser":92,"gl-matrix":116}],28:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); - -module.exports = drawRaster; - -function drawRaster(painter, layer, posMatrix, tile) { - var gl = painter.gl; - - gl.disable(gl.STENCIL_TEST); - - var shader = painter.rasterShader; - gl.switchShader(shader, posMatrix); - - // color parameters - gl.uniform1f(shader.u_brightness_low, layer.paint['raster-brightness-min']); - gl.uniform1f(shader.u_brightness_high, layer.paint['raster-brightness-max']); - gl.uniform1f(shader.u_saturation_factor, saturationFactor(layer.paint['raster-saturation'])); - gl.uniform1f(shader.u_contrast_factor, contrastFactor(layer.paint['raster-contrast'])); - gl.uniform3fv(shader.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate'])); - - var parentTile = tile.source && tile.source._pyramid.findLoadedParent(tile.coord, 0, {}), - opacities = getOpacities(tile, parentTile, layer, painter.transform); - - var parentScaleBy, parentTL; - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, tile.texture); - - if (parentTile) { - gl.activeTexture(gl.TEXTURE1); - gl.bindTexture(gl.TEXTURE_2D, parentTile.texture); - - parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z); - parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1]; - } else { - opacities[1] = 0; - } - - // cross-fade parameters - gl.uniform2fv(shader.u_tl_parent, parentTL || [0, 0]); - gl.uniform1f(shader.u_scale_parent, parentScaleBy || 1); - gl.uniform1f(shader.u_buffer_scale, 1); - gl.uniform1f(shader.u_opacity0, opacities[0]); - gl.uniform1f(shader.u_opacity1, opacities[1]); - gl.uniform1i(shader.u_image0, 0); - gl.uniform1i(shader.u_image1, 1); - - gl.bindBuffer(gl.ARRAY_BUFFER, tile.boundsBuffer || painter.tileExtentBuffer); - - gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, 0); - gl.vertexAttribPointer(shader.a_texture_pos, 2, gl.SHORT, false, 8, 4); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - - gl.enable(gl.STENCIL_TEST); -} - -function spinWeights(angle) { - angle *= Math.PI / 180; - var s = Math.sin(angle); - var c = Math.cos(angle); - return [ - (2 * c + 1) / 3, - (-Math.sqrt(3) * s - c + 1) / 3, - (Math.sqrt(3) * s - c + 1) / 3 - ]; -} - -function contrastFactor(contrast) { - return contrast > 0 ? - 1 / (1 - contrast) : - 1 + contrast; -} - -function saturationFactor(saturation) { - return saturation > 0 ? - 1 - 1 / (1.001 - saturation) : - -saturation; -} - -function getOpacities(tile, parentTile, layer, transform) { - if (!tile.source) return [1, 0]; - - var now = new Date().getTime(); - - var fadeDuration = layer.paint['raster-fade-duration']; - var sinceTile = (now - tile.timeAdded) / fadeDuration; - var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; - - var idealZ = tile.source._pyramid.coveringZoomLevel(transform); - var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false; - - var opacity = []; - if (!parentTile || parentFurther) { - // if no parent or parent is older - opacity[0] = util.clamp(sinceTile, 0, 1); - opacity[1] = 1 - opacity[0]; - } else { - // parent is younger, zooming out - opacity[0] = util.clamp(1 - sinceParent, 0, 1); - opacity[1] = 1 - opacity[0]; - } - - var op = layer.paint['raster-opacity']; - opacity[0] *= op; - opacity[1] *= op; - - return opacity; -} - -},{"../util/util":103}],29:[function(require,module,exports){ -'use strict'; - -var browser = require('../util/browser'); -var mat4 = require('gl-matrix').mat4; - -var drawCollisionDebug = require('./draw_collision_debug'); - -module.exports = drawSymbols; - -function drawSymbols(painter, layer, posMatrix, tile) { - // No data - if (!tile.buffers) return; - var elementGroups = tile.elementGroups[layer.ref || layer.id]; - if (!elementGroups) return; - - var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] || - layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']); - - var gl = painter.gl; - - if (drawAcrossEdges) { - // Disable the stencil test so that labels aren't clipped to tile boundaries. - // - // Layers with features that may be drawn overlapping aren't clipped. These - // layers are sorted in the y direction, and to draw the correct ordering near - // tile edges the icons are included in both tiles and clipped when drawing. - gl.disable(gl.STENCIL_TEST); - } - - if (elementGroups.text.groups.length) { - drawSymbol(painter, layer, posMatrix, tile, elementGroups.text, 'text', true); - } - if (elementGroups.icon.groups.length) { - drawSymbol(painter, layer, posMatrix, tile, elementGroups.icon, 'icon', elementGroups.sdfIcons); - } - - drawCollisionDebug(painter, layer, posMatrix, tile); - - if (drawAcrossEdges) { - gl.enable(gl.STENCIL_TEST); - } -} - -var defaultSizes = { - icon: 1, - text: 24 -}; - -function drawSymbol(painter, layer, posMatrix, tile, elementGroups, prefix, sdf) { - var gl = painter.gl; - - posMatrix = painter.translateMatrix(posMatrix, tile, layer.paint[prefix + '-translate'], layer.paint[prefix + '-translate-anchor']); - - var tr = painter.transform; - var alignedWithMap = layer.layout[prefix + '-rotation-alignment'] === 'map'; - var skewed = alignedWithMap; - var exMatrix, s, gammaScale; - - if (skewed) { - exMatrix = mat4.create(); - s = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.zoom - tile.coord.z); - gammaScale = 1 / Math.cos(tr._pitch); - } else { - exMatrix = mat4.clone(tile.exMatrix); - s = painter.transform.altitude; - gammaScale = 1; - } - mat4.scale(exMatrix, exMatrix, [s, s, 1]); - - // If layer.paint.size > layer.layout[prefix + '-max-size'] then labels may collide - var fontSize = layer.paint[prefix + '-size']; - var fontScale = fontSize / defaultSizes[prefix]; - mat4.scale(exMatrix, exMatrix, [ fontScale, fontScale, 1 ]); - - // calculate how much longer the real world distance is at the top of the screen - // than at the middle of the screen. - var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude)); - var x = tr.height / 2 * Math.tan(tr._pitch); - var extra = (topedgelength + x) / topedgelength - 1; - - var text = prefix === 'text'; - var shader, vertex, elements, texsize; - - if (!text && !painter.style.sprite.loaded()) - return; - - gl.activeTexture(gl.TEXTURE0); - - if (sdf) { - shader = painter.sdfShader; - } else { - shader = painter.iconShader; - } - - if (text) { - painter.glyphAtlas.updateTexture(gl); - vertex = tile.buffers.glyphVertex; - elements = tile.buffers.glyphElement; - texsize = [painter.glyphAtlas.width / 4, painter.glyphAtlas.height / 4]; - } else { - painter.spriteAtlas.bind(gl, alignedWithMap || painter.options.rotating || - painter.options.zooming || fontScale !== 1 || sdf || painter.transform.pitch); - vertex = tile.buffers.iconVertex; - elements = tile.buffers.iconElement; - texsize = [painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4]; - } - - gl.switchShader(shader, posMatrix, exMatrix); - gl.uniform1i(shader.u_texture, 0); - gl.uniform2fv(shader.u_texsize, texsize); - gl.uniform1i(shader.u_skewed, skewed); - gl.uniform1f(shader.u_extra, extra); - - // adjust min/max zooms for variable font sies - var zoomAdjust = Math.log(fontSize / layer.layout[prefix + '-max-size']) / Math.LN2 || 0; - - gl.uniform1f(shader.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level - - var f = painter.frameHistory.getFadeProperties(300); - gl.uniform1f(shader.u_fadedist, f.fadedist * 10); - gl.uniform1f(shader.u_minfadezoom, Math.floor(f.minfadezoom * 10)); - gl.uniform1f(shader.u_maxfadezoom, Math.floor(f.maxfadezoom * 10)); - gl.uniform1f(shader.u_fadezoom, (painter.transform.zoom + f.bump) * 10); - - var group, offset, count, elementOffset; - - elements.bind(gl); - - if (sdf) { - var sdfPx = 8; - var blurOffset = 1.19; - var haloOffset = 6; - var gamma = 0.105 * defaultSizes[prefix] / fontSize / browser.devicePixelRatio; - - gl.disableVertexAttribArray(shader.a_gamma); - gl.vertexAttrib1f(shader.a_gamma, gamma * gammaScale); - - gl.disableVertexAttribArray(shader.a_color); - gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-color']); - - gl.disableVertexAttribArray(shader.a_buffer); - gl.vertexAttrib1f(shader.a_buffer, (256 - 64) / 256); - - for (var i = 0; i < elementGroups.groups.length; i++) { - group = elementGroups.groups[i]; - offset = group.vertexStartIndex * vertex.itemSize; - vertex.bind(gl, shader, offset); - - count = group.elementLength * 3; - elementOffset = group.elementStartIndex * elements.itemSize; - gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); - } - - if (layer.paint[prefix + '-halo-color']) { - - // vertex attrib arrays disabled above - gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-halo-color']); - gl.vertexAttrib1f(shader.a_buffer, (haloOffset - layer.paint[prefix + '-halo-width'] / fontScale) / sdfPx); - gl.vertexAttrib1f(shader.a_gamma, (layer.paint[prefix + '-halo-blur'] * blurOffset / fontScale / sdfPx + gamma) * gammaScale); - - for (var j = 0; j < elementGroups.groups.length; j++) { - group = elementGroups.groups[j]; - offset = group.vertexStartIndex * vertex.itemSize; - vertex.bind(gl, shader, offset); - - count = group.elementLength * 3; - elementOffset = group.elementStartIndex * elements.itemSize; - gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); - } - } - } else { - gl.disableVertexAttribArray(shader.a_opacity); - gl.vertexAttrib1f(shader.a_opacity, layer.paint['icon-opacity']); - - for (var k = 0; k < elementGroups.groups.length; k++) { - group = elementGroups.groups[k]; - offset = group.vertexStartIndex * vertex.itemSize; - vertex.bind(gl, shader, offset); - - count = group.elementLength * 3; - elementOffset = group.elementStartIndex * elements.itemSize; - gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset); - } - } -} - -},{"../util/browser":92,"./draw_collision_debug":24,"gl-matrix":116}],30:[function(require,module,exports){ -'use strict'; - -var browser = require('../util/browser'); -var mat4 = require('gl-matrix').mat4; - -module.exports = drawVertices; - -function drawVertices(painter, layer, posMatrix, tile) { - var gl = painter.gl; - - if (!tile || !tile.buffers) return; - var elementGroups = tile.elementGroups[layer.ref || layer.id]; - if (!elementGroups) return; - - // Blend to the front, not the back. - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - - // Draw all buffers - if (layer.type === 'fill') { - drawPoints(tile.buffers.fillVertex, elementGroups.groups, posMatrix, 4); - } else if (layer.type === 'symbol') { - drawPoints(tile.buffers.iconVertex, elementGroups.icon.groups, posMatrix, 16); - drawPoints(tile.buffers.glyphVertex, elementGroups.text.groups, posMatrix, 16); - } else if (layer.type === 'line') { - var newPosMatrix = mat4.clone(posMatrix); - mat4.scale(newPosMatrix, newPosMatrix, [0.5, 0.5, 1]); - drawPoints(tile.buffers.lineVertex, elementGroups.groups, newPosMatrix, 8); - } - - function drawPoints(vertex, groups, matrix, stride) { - gl.switchShader(painter.dotShader, matrix); - - gl.uniform1f(painter.dotShader.u_size, 4 * browser.devicePixelRatio); - gl.uniform1f(painter.dotShader.u_blur, 0.25); - gl.uniform4fv(painter.dotShader.u_color, [0.1, 0, 0, 0.1]); - - vertex.bind(gl, painter.dotShader, 0); - for (var i = 0; i < groups.length; i++) { - var group = groups[i]; - var begin = group.vertexStartIndex; - var count = group.vertexLength; - gl.vertexAttribPointer(painter.dotShader.a_pos, 2, gl.SHORT, false, stride, 0); - gl.drawArrays(gl.POINTS, begin, count); - } - } - - // Revert blending mode to blend to the back. - gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); -} - -},{"../util/browser":92,"gl-matrix":116}],31:[function(require,module,exports){ -'use strict'; - -module.exports = FrameHistory; - -function FrameHistory() { - this.frameHistory = []; -} - -FrameHistory.prototype.getFadeProperties = function(duration) { - if (duration === undefined) duration = 300; - var currentTime = (new Date()).getTime(); - - // Remove frames until only one is outside the duration, or until there are only three - while (this.frameHistory.length > 3 && this.frameHistory[1].time + duration < currentTime) { - this.frameHistory.shift(); - } - - if (this.frameHistory[1].time + duration < currentTime) { - this.frameHistory[0].z = this.frameHistory[1].z; - } - - var frameLen = this.frameHistory.length; - if (frameLen < 3) console.warn('there should never be less than three frames in the history'); - - // Find the range of zoom levels we want to fade between - var startingZ = this.frameHistory[0].z, - lastFrame = this.frameHistory[frameLen - 1], - endingZ = lastFrame.z, - lowZ = Math.min(startingZ, endingZ), - highZ = Math.max(startingZ, endingZ); - - // Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one duration - var zoomDiff = lastFrame.z - this.frameHistory[1].z, - timeDiff = lastFrame.time - this.frameHistory[1].time; - var fadedist = zoomDiff / (timeDiff / duration); - - if (isNaN(fadedist)) console.warn('fadedist should never be NaN'); - - // At end of a zoom when the zoom stops changing continue pretending to zoom at that speed - // bump is how much farther it would have been if it had continued zooming at the same rate - var bump = (currentTime - lastFrame.time) / duration * fadedist; - - return { - fadedist: fadedist, - minfadezoom: lowZ, - maxfadezoom: highZ, - bump: bump - }; -}; - -// Record frame history that will be used to calculate fading params -FrameHistory.prototype.record = function(zoom) { - var currentTime = (new Date()).getTime(); - - // first frame ever - if (!this.frameHistory.length) { - this.frameHistory.push({time: 0, z: zoom }, {time: 0, z: zoom }); - } - - if (this.frameHistory.length === 2 || this.frameHistory[this.frameHistory.length - 1].z !== zoom) { - this.frameHistory.push({ - time: currentTime, - z: zoom - }); - } -}; - -},{}],32:[function(require,module,exports){ -'use strict'; - -var shaders = require('./shaders'); -var util = require('../util/util'); - -exports.extend = function(context) { - var origLineWidth = context.lineWidth, - lineWidthRange = context.getParameter(context.ALIASED_LINE_WIDTH_RANGE); - - context.lineWidth = function(width) { - origLineWidth.call(context, util.clamp(width, lineWidthRange[0], lineWidthRange[1])); - }; - - context.getShader = function(name, type) { - var kind = type === this.FRAGMENT_SHADER ? 'fragment' : 'vertex'; - if (!shaders[name] || !shaders[name][kind]) { - throw new Error("Could not find shader " + name); - } - - var shader = this.createShader(type); - var shaderSource = shaders[name][kind]; - - if (typeof orientation === 'undefined') { - // only use highp precision on mobile browsers - shaderSource = shaderSource.replace(/ highp /g, ' '); - } - - this.shaderSource(shader, shaderSource); - this.compileShader(shader); - if (!this.getShaderParameter(shader, this.COMPILE_STATUS)) { - throw new Error(this.getShaderInfoLog(shader)); - } - return shader; - }; - - context.initializeShader = function(name, attributes, uniforms) { - var shader = { - program: this.createProgram(), - fragment: this.getShader(name, this.FRAGMENT_SHADER), - vertex: this.getShader(name, this.VERTEX_SHADER), - attributes: [] - }; - this.attachShader(shader.program, shader.vertex); - this.attachShader(shader.program, shader.fragment); - - // Disabling attrib location 0 causes weird behaviour. To avoid the problem, we assign - // 'a_pos' to attrib location 0 making the assumptions that - // - // - `a_pos` is never disabled - // - every shader has an `a_pos` attribute - // - // see: https://developer.mozilla.org/en-US/docs/Web/WebGL/WebGL_best_practices - this.bindAttribLocation(shader.program, 0, 'a_pos'); - - this.linkProgram(shader.program); - - if (!this.getProgramParameter(shader.program, this.LINK_STATUS)) { - console.error(this.getProgramInfoLog(shader.program)); - } else { - for (var i = 0; i < attributes.length; i++) { - shader[attributes[i]] = this.getAttribLocation(shader.program, attributes[i]); - shader.attributes.push(shader[attributes[i]]); - } - for (var k = 0; k < uniforms.length; k++) { - shader[uniforms[k]] = this.getUniformLocation(shader.program, uniforms[k]); - } - } - - return shader; - }; - - // Switches to a different shader program. - context.switchShader = function(shader, posMatrix, exMatrix) { - if (!posMatrix) { - console.trace('posMatrix does not have required argument'); - } - - if (this.currentShader !== shader) { - this.useProgram(shader.program); - - // Disable all attribute arrays used by the previous shader and enable all the attribute - // arrays used by the next shader. Ideally we would do a better job diffing these to - // minimize operations (as we did in previously) but it is hard to keep track of state - // in spaghetti shader boilerplate code and hard to debug when things go wrong. - var previous = this.currentShader ? this.currentShader.attributes : []; - for (var i = 0; i < previous.length; i++) { - this.disableVertexAttribArray(previous[i]); - } - var next = shader.attributes; - for (var j = 0; j < next.length; j++) { - this.enableVertexAttribArray(next[j]); - } - - this.currentShader = shader; - } - - // Update the matrices if necessary. Note: This relies on object identity! - // This means changing the matrix values without the actual matrix object - // will FAIL to update the matrix properly. - if (shader.posMatrix !== posMatrix) { - this.uniformMatrix4fv(shader.u_matrix, false, posMatrix); - shader.posMatrix = posMatrix; - } - if (exMatrix && shader.exMatrix !== exMatrix && shader.u_exmatrix) { - this.uniformMatrix4fv(shader.u_exmatrix, false, exMatrix); - shader.exMatrix = exMatrix; - } - }; - - context.vertexAttrib2fv = function(attribute, values) { - context.vertexAttrib2f(attribute, values[0], values[1]); - }; - - context.vertexAttrib3fv = function(attribute, values) { - context.vertexAttrib3f(attribute, values[0], values[1], values[2]); - }; - - context.vertexAttrib4fv = function(attribute, values) { - context.vertexAttrib4f(attribute, values[0], values[1], values[2], values[3]); - }; - - return context; -}; - -},{"../util/util":103,"./shaders":35}],33:[function(require,module,exports){ -'use strict'; - -module.exports = LineAtlas; - -/** - * Much like a GlyphAtlas, a LineAtlas lets us reuse rendered dashed lines - * by writing many of them to a texture and then fetching their positions - * using .getDash. - * - * @param {number} width - * @param {number} height - * @private - */ -function LineAtlas(width, height) { - this.width = width; - this.height = height; - this.nextRow = 0; - - this.bytes = 4; - this.data = new Uint8Array(this.width * this.height * this.bytes); - - this.positions = {}; -} - -LineAtlas.prototype.setSprite = function(sprite) { - this.sprite = sprite; -}; - -/** - * Get or create a dash line pattern. - * - * @param {Array} dasharray - * @param {boolean} round whether to add circle caps in between dash segments - * @returns {Object} position of dash texture in { y, height, width } - * @private - */ -LineAtlas.prototype.getDash = function(dasharray, round) { - var key = dasharray.join(",") + round; - - if (!this.positions[key]) { - this.positions[key] = this.addDash(dasharray, round); - } - return this.positions[key]; -}; - -LineAtlas.prototype.addDash = function(dasharray, round) { - - var n = round ? 7 : 0; - var height = 2 * n + 1; - var offset = 128; - - if (this.nextRow + height > this.height) { - console.warn('LineAtlas out of space'); - return null; - } - - var length = 0; - for (var i = 0; i < dasharray.length; i++) { - length += dasharray[i]; - } - - var stretch = this.width / length; - var halfWidth = stretch / 2; - - // If dasharray has an odd length, both the first and last parts - // are dashes and should be joined seamlessly. - var oddLength = dasharray.length % 2 === 1; - - for (var y = -n; y <= n; y++) { - var row = this.nextRow + n + y; - var index = this.width * row; - - var left = oddLength ? -dasharray[dasharray.length - 1] : 0; - var right = dasharray[0]; - var partIndex = 1; - - for (var x = 0; x < this.width; x++) { - - while (right < x / stretch) { - left = right; - right = right + dasharray[partIndex]; - - if (oddLength && partIndex === dasharray.length - 1) { - right += dasharray[0]; - } - - partIndex++; - } - - var distLeft = Math.abs(x - left * stretch); - var distRight = Math.abs(x - right * stretch); - var dist = Math.min(distLeft, distRight); - var inside = (partIndex % 2) === 1; - var signedDistance; - - if (round) { - // Add circle caps - var distMiddle = n ? y / n * (halfWidth + 1) : 0; - if (inside) { - var distEdge = halfWidth - Math.abs(distMiddle); - signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); - } else { - signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); - } - } else { - signedDistance = (inside ? 1 : -1) * dist; - } - - this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); - } - } - - var pos = { - y: (this.nextRow + n + 0.5) / this.height, - height: 2 * n / this.height, - width: length - }; - - this.nextRow += height; - this.dirty = true; - - return pos; -}; - -LineAtlas.prototype.bind = function(gl) { - if (!this.texture) { - this.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); - - } else { - gl.bindTexture(gl.TEXTURE_2D, this.texture); - - if (this.dirty) { - this.dirty = false; - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); - } - } -}; - -LineAtlas.prototype.debug = function() { - - var canvas = document.createElement('canvas'); - - document.body.appendChild(canvas); - canvas.style.position = 'absolute'; - canvas.style.top = 0; - canvas.style.left = 0; - canvas.style.background = '#ff0'; - - canvas.width = this.width; - canvas.height = this.height; - - var ctx = canvas.getContext('2d'); - var data = ctx.getImageData(0, 0, this.width, this.height); - for (var i = 0; i < this.data.length; i++) { - if (this.sdf) { - var k = i * 4; - data.data[k] = data.data[k + 1] = data.data[k + 2] = 0; - data.data[k + 3] = this.data[i]; - } else { - data.data[i] = this.data[i]; - } - } - ctx.putImageData(data, 0, 0); -}; - -},{}],34:[function(require,module,exports){ -'use strict'; - -var glutil = require('./gl_util'); -var browser = require('../util/browser'); -var mat4 = require('gl-matrix').mat4; -var FrameHistory = require('./frame_history'); - -/* - * Initialize a new painter object. - * - * @param {Canvas} gl an experimental-webgl drawing context - */ -module.exports = Painter; -function Painter(gl, transform) { - this.gl = glutil.extend(gl); - this.transform = transform; - - this.reusableTextures = {}; - this.preFbos = {}; - - this.frameHistory = new FrameHistory(); - - this.setup(); -} - -/* - * Update the GL viewport, projection matrix, and transforms to compensate - * for a new width and height value. - */ -Painter.prototype.resize = function(width, height) { - var gl = this.gl; - - this.width = width * browser.devicePixelRatio; - this.height = height * browser.devicePixelRatio; - gl.viewport(0, 0, this.width, this.height); - -}; - - -Painter.prototype.setup = function() { - var gl = this.gl; - - gl.verbose = true; - - // We are blending the new pixels *behind* the existing pixels. That way we can - // draw front-to-back and use then stencil buffer to cull opaque pixels early. - gl.enable(gl.BLEND); - gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); - - gl.enable(gl.STENCIL_TEST); - - // Initialize shaders - this.debugShader = gl.initializeShader('debug', - ['a_pos'], - ['u_matrix', 'u_pointsize', 'u_color']); - - this.gaussianShader = gl.initializeShader('gaussian', - ['a_pos'], - ['u_matrix', 'u_image', 'u_offset']); - - this.rasterShader = gl.initializeShader('raster', - ['a_pos', 'a_texture_pos'], - ['u_matrix', 'u_brightness_low', 'u_brightness_high', 'u_saturation_factor', 'u_spin_weights', 'u_contrast_factor', 'u_opacity0', 'u_opacity1', 'u_image0', 'u_image1', 'u_tl_parent', 'u_scale_parent', 'u_buffer_scale']); - - this.lineShader = gl.initializeShader('line', - ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'], - ['u_matrix', 'u_ratio', 'u_extra', 'u_antialiasingmatrix']); - - this.linepatternShader = gl.initializeShader('linepattern', - ['a_pos', 'a_data', 'a_linewidth', 'a_blur', 'a_opacity'], - ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_pattern_size_a', 'u_pattern_size_b', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_fade']); - - this.linesdfpatternShader = gl.initializeShader('linesdfpattern', - ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'], - ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_patternscale_a', 'u_tex_y_a', 'u_patternscale_b', 'u_tex_y_b', 'u_image', 'u_sdfgamma', 'u_mix']); - - this.dotShader = gl.initializeShader('dot', - ['a_pos'], - ['u_matrix', 'u_size', 'u_color', 'u_blur']); - - this.sdfShader = gl.initializeShader('sdf', - ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_color', 'a_buffer', 'a_gamma'], - ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']); - - this.iconShader = gl.initializeShader('icon', - ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_opacity'], - ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']); - - this.outlineShader = gl.initializeShader('outline', - ['a_pos', 'a_color'], - ['u_matrix', 'u_world'] - ); - - this.patternShader = gl.initializeShader('pattern', - ['a_pos'], - ['u_matrix', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_mix', 'u_patternmatrix_a', 'u_patternmatrix_b', 'u_opacity', 'u_image'] - ); - - this.fillShader = gl.initializeShader('fill', - ['a_pos', 'a_color'], - ['u_matrix'] - ); - - this.collisionBoxShader = gl.initializeShader('collisionbox', - ['a_pos', 'a_extrude', 'a_data'], - ['u_matrix', 'u_scale', 'u_zoom', 'u_maxzoom'] - ); - - this.identityMatrix = mat4.create(); - - // The backgroundBuffer is used when drawing to the full *canvas* - this.backgroundBuffer = gl.createBuffer(); - this.backgroundBuffer.itemSize = 2; - this.backgroundBuffer.itemCount = 4; - gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Int16Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW); - - this.setExtent(4096); - - // The debugTextBuffer is used to draw tile IDs for debugging - this.debugTextBuffer = gl.createBuffer(); - this.debugTextBuffer.itemSize = 2; -}; - -/** - * Rebind the necessary buffers to render at a different extent than - * the current one. No-ops if the extent is not changing. - * - * @param {number} newExtent - * @example - * this.setExtent(4096); - * @private - */ -Painter.prototype.setExtent = function(newExtent) { - if (!newExtent || newExtent === this.tileExtent) return; - - this.tileExtent = newExtent; - - var gl = this.gl; - - // The tileExtentBuffer is used when drawing to a full *tile* - this.tileExtentBuffer = gl.createBuffer(); - this.tileExtentBuffer.itemSize = 4; - this.tileExtentBuffer.itemCount = 4; - gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer); - gl.bufferData( - gl.ARRAY_BUFFER, - new Int16Array([ - // tile coord x, tile coord y, texture coord x, texture coord y - 0, 0, 0, 0, - this.tileExtent, 0, 32767, 0, - 0, this.tileExtent, 0, 32767, - this.tileExtent, this.tileExtent, 32767, 32767 - ]), - gl.STATIC_DRAW); - - // The debugBuffer is used to draw tile outlines for debugging - this.debugBuffer = gl.createBuffer(); - this.debugBuffer.itemSize = 2; - this.debugBuffer.itemCount = 5; - gl.bindBuffer(gl.ARRAY_BUFFER, this.debugBuffer); - gl.bufferData( - gl.ARRAY_BUFFER, - new Int16Array([ - 0, 0, this.tileExtent - 1, 0, this.tileExtent - 1, this.tileExtent - 1, 0, this.tileExtent - 1, 0, 0]), - gl.STATIC_DRAW); -}; - -/* - * Reset the color buffers of the drawing canvas. - */ -Painter.prototype.clearColor = function() { - var gl = this.gl; - gl.clearColor(0, 0, 0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); -}; - -/* - * Reset the drawing canvas by clearing the stencil buffer so that we can draw - * new tiles at the same location, while retaining previously drawn pixels. - */ -Painter.prototype.clearStencil = function() { - var gl = this.gl; - gl.clearStencil(0x0); - gl.stencilMask(0xFF); - gl.clear(gl.STENCIL_BUFFER_BIT); -}; - -Painter.prototype.drawClippingMask = function(tile) { - var gl = this.gl; - gl.switchShader(this.fillShader, tile.posMatrix); - gl.colorMask(false, false, false, false); - - // Clear the entire stencil buffer, except for the 7th bit, which stores - // the global clipping mask that allows us to avoid drawing in regions of - // tiles we've already painted in. - gl.clearStencil(0x0); - gl.stencilMask(0xBF); - gl.clear(gl.STENCIL_BUFFER_BIT); - - // The stencil test will fail always, meaning we set all pixels covered - // by this geometry to 0x80. We use the highest bit 0x80 to mark the regions - // we want to draw in. All pixels that have this bit *not* set will never be - // drawn in. - gl.stencilFunc(gl.EQUAL, 0xC0, 0x40); - gl.stencilMask(0xC0); - gl.stencilOp(gl.REPLACE, gl.KEEP, gl.KEEP); - - // Draw the clipping mask - gl.disableVertexAttribArray(this.fillShader.a_color); - gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer); - gl.vertexAttribPointer(this.fillShader.a_pos, this.tileExtentBuffer.itemSize, gl.SHORT, false, 8, 0); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount); - - gl.stencilFunc(gl.EQUAL, 0x80, 0x80); - gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE); - gl.stencilMask(0x00); - gl.colorMask(true, true, true, true); - gl.enableVertexAttribArray(this.fillShader.a_color); -}; - -// Overridden by headless tests. -Painter.prototype.prepareBuffers = function() {}; -Painter.prototype.bindDefaultFramebuffer = function() { - var gl = this.gl; - gl.bindFramebuffer(gl.FRAMEBUFFER, null); -}; - -var draw = { - symbol: require('./draw_symbol'), - line: require('./draw_line'), - fill: require('./draw_fill'), - raster: require('./draw_raster'), - background: require('./draw_background'), - debug: require('./draw_debug'), - vertices: require('./draw_vertices') -}; - -Painter.prototype.render = function(style, options) { - this.style = style; - this.options = options; - - this.lineAtlas = style.lineAtlas; - - this.spriteAtlas = style.spriteAtlas; - this.spriteAtlas.setSprite(style.sprite); - - this.glyphAtlas = style.glyphAtlas; - this.glyphAtlas.bind(this.gl); - - this.frameHistory.record(this.transform.zoom); - - this.prepareBuffers(); - this.clearColor(); - - for (var i = style._groups.length - 1; i >= 0; i--) { - var group = style._groups[i]; - var source = style.sources[group.source]; - - if (source) { - this.clearStencil(); - source.render(group, this); - - } else if (group.source === undefined) { - this.drawLayers(group, this.identityMatrix); - } - } -}; - -Painter.prototype.drawTile = function(tile, layers) { - this.setExtent(tile.tileExtent); - this.drawClippingMask(tile); - this.drawLayers(layers, tile.posMatrix, tile); - - if (this.options.debug) { - draw.debug(this, tile); - } -}; - -Painter.prototype.drawLayers = function(layers, matrix, tile) { - for (var i = layers.length - 1; i >= 0; i--) { - var layer = layers[i]; - - if (layer.hidden) - continue; - - draw[layer.type](this, layer, matrix, tile); - - if (this.options.vertices) { - draw.vertices(this, layer, matrix, tile); - } - } -}; - -// Draws non-opaque areas. This is for debugging purposes. -Painter.prototype.drawStencilBuffer = function() { - var gl = this.gl; - gl.switchShader(this.fillShader, this.identityMatrix); - - // Blend to the front, not the back. - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.stencilMask(0x00); - gl.stencilFunc(gl.EQUAL, 0x80, 0x80); - - // Drw the filling quad where the stencil buffer isn't set. - gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer); - gl.vertexAttribPointer(this.fillShader.a_pos, this.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0); - gl.disableVertexAttribArray(this.fillShader.a_color); - gl.vertexAttrib4fv(this.fillShader.a_color, [0, 0, 0, 0.5]); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount); - - // Revert blending mode to blend to the back. - gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE); -}; - -Painter.prototype.translateMatrix = function(matrix, tile, translate, anchor) { - if (!translate[0] && !translate[1]) return matrix; - - if (anchor === 'viewport') { - var sinA = Math.sin(-this.transform.angle); - var cosA = Math.cos(-this.transform.angle); - translate = [ - translate[0] * cosA - translate[1] * sinA, - translate[0] * sinA + translate[1] * cosA - ]; - } - - var tilePixelRatio = this.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize); - var translation = [ - translate[0] / tilePixelRatio, - translate[1] / tilePixelRatio, - 0 - ]; - - var translatedMatrix = new Float32Array(16); - mat4.translate(translatedMatrix, matrix, translation); - return translatedMatrix; -}; - -Painter.prototype.saveTexture = function(texture) { - var textures = this.reusableTextures[texture.size]; - if (!textures) { - this.reusableTextures[texture.size] = [texture]; - } else { - textures.push(texture); - } -}; - - -Painter.prototype.getTexture = function(size) { - var textures = this.reusableTextures[size]; - return textures && textures.length > 0 ? textures.pop() : null; -}; - -},{"../util/browser":92,"./draw_background":23,"./draw_debug":25,"./draw_fill":26,"./draw_line":27,"./draw_raster":28,"./draw_symbol":29,"./draw_vertices":30,"./frame_history":31,"./gl_util":32,"gl-matrix":116}],35:[function(require,module,exports){ -'use strict'; - -var glify = undefined; - -module.exports = { - "debug": {"vertex":"precision mediump float;attribute vec2 a_pos;uniform float u_pointsize;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);gl_PointSize=u_pointsize;}","fragment":"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"}, - "dot": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}","fragment":"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"}, - "fill": {"vertex":"precision mediump float;uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec4 a_color;varying vec4 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=2.;a=a_color;}","fragment":"precision mediump float;varying vec4 a;void main(){gl_FragColor=a;}"}, - "gaussian": {"vertex":"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_offset;varying vec2 a[3];void main(){gl_Position=u_matrix*vec4(a_pos,0,1);vec2 b=gl_Position.xy/2.+.5;a[0]=b;a[1]=b+u_offset*1.1824255238063563;a[2]=b-u_offset*1.1824255238063563;}","fragment":"precision mediump float;uniform sampler2D u_image;varying vec2 a[3];void main(){vec4 b=vec4(0);b+=texture2D(u_image,a[0])*.40261994689424746;b+=texture2D(u_image,a[1])*.2986900265528763;b+=texture2D(u_image,a[2])*.2986900265528763;gl_FragColor=b;}"}, - "line": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,e;varying float b,d,f;varying vec4 c;void main(){vec2 g,h;g=a_data.xy;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;vec4 i=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+i.xy/u_ratio,0,1);float j,k,l;j=gl_Position.y/gl_Position.w;k=length(g)/length(u_antialiasingmatrix*g);l=1./(1.-j*u_extra);d=l*k;c=a_color;e=a_linewidth;f=a_blur;}","fragment":"precision mediump float;uniform vec2 u_dasharray;varying vec4 c;varying vec2 a,e;varying float b,d,f;void main(){float g,h,i;g=length(a)*e.s;h=f*d;i=clamp(min(g-(e.t-h),e.s-g)/h,0.,1.);gl_FragColor=c*i;}"}, - "linepattern": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data;attribute float a_blur,a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio;varying vec2 a,c;varying float b,d,e;void main(){vec2 f,h,i,j;f=a_data.xy;float g=a_data.z*128.+a_data.w;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;i=f*.015873016;j=a_linewidth.s*i;gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=g;c=a_linewidth;d=a_blur;e=a_opacity;}","fragment":"precision mediump float;uniform float u_point,u_fade;uniform vec2 u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,c;varying float b,d,e;void main(){float f,g,h,i,j,k;f=length(a)*c.s;g=clamp(min(f-(c.t-d),c.s-f)/d,0.,1.);h=mod(b/u_pattern_size_a.x,1.);i=mod(b/u_pattern_size_b.x,1.);j=.5+a.y*c.s/u_pattern_size_a.y;k=.5+a.y*c.s/u_pattern_size_b.y;vec2 l,m;l=mix(u_pattern_tl_a,u_pattern_br_a,vec2(h,j));m=mix(u_pattern_tl_b,u_pattern_br_b,vec2(i,k));vec4 n=mix(texture2D(u_image,l),texture2D(u_image,m),u_fade);g*=e;gl_FragColor=n*g;}"}, - "linesdfpattern": {"vertex":"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio,u_tex_y_a,u_tex_y_b;uniform vec2 u_patternscale_a,u_patternscale_b;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){vec2 g,i;g=a_data.xy;float h=a_data.z*128.+a_data.w;i=mod(a_pos,2.);i.y=sign(i.y-.5);a=i;vec4 j=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=vec2(h*u_patternscale_a.x,i.y*u_patternscale_a.y+u_tex_y_a);c=vec2(h*u_patternscale_b.x,i.y*u_patternscale_b.y+u_tex_y_b);d=a_color;e=a_linewidth;f=a_blur;}","fragment":"precision mediump float;uniform sampler2D u_image;uniform float u_sdfgamma,u_mix;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){float g,h,i,j,k;g=length(a)*e.s;h=clamp(min(g-(e.t-f),e.s-g)/f,0.,1.);i=texture2D(u_image,b).a;j=texture2D(u_image,c).a;k=mix(i,j,u_mix);h*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,k);gl_FragColor=d*h;}"}, - "outline": {"vertex":"precision mediump float;attribute vec2 a_pos;attribute vec4 a_color;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec4 a;varying vec2 b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);b=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;a=a_color;}","fragment":"precision mediump float;varying vec4 a;varying vec2 b;void main(){float c,d;c=length(b-gl_FragCoord.xy);d=smoothstep(1.,0.,c);gl_FragColor=a*d;}"}, - "pattern": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}","fragment":"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"}, - "raster": {"vertex":"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}","fragment":"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"}, - "icon": {"vertex":"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;attribute float a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=a_opacity;}","fragment":"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"}, - "sdf": {"vertex":"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2,a_color;attribute float a_buffer,a_gamma;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){vec2 g,i;g=a_data1.xy;float h,j,k,l,m,n,o;h=a_data1[2];i=a_data2.st;j=i[0];k=i[1];l=2.-step(j,u_zoom)-(1.-step(k,u_zoom));m=clamp((u_fadezoom-h)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=m;else b=1.-m;if(u_maxfadezoom=h)b=1.;l+=step(b,0.);if(u_skewed){vec4 n=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+n.xy,0,1);gl_Position.z+=l*gl_Position.w;}else{vec4 n=u_exmatrix*vec4(a_offset/64.,l,0);gl_Position=u_matrix*vec4(a_pos,0,1)+n;}n=gl_Position.y/gl_Position.w;o=1./(1.-n*u_extra);c=o;a=g/u_texsize;d=a_color;e=a_buffer;f=a_gamma;}","fragment":"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){float g,h,i;g=f*c;h=texture2D(u_texture,a).a;i=smoothstep(e-g,e+g,h)*b;gl_FragColor=d*i;}"}, - "collisionbox": {"vertex":"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}","fragment":"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"} -}; - -},{}],36:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var Evented = require('../util/evented'); -var TilePyramid = require('./tile_pyramid'); -var Source = require('./source'); -var urlResolve = require('resolve-url'); - -module.exports = GeoJSONSource; - -/** - * Create a GeoJSON data source instance given an options object - * @class GeoJSONSource - * @param {Object} [options] - * @param {Object|string} options.data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files. - * @param {number} [options.maxzoom=14] Maximum zoom to preserve detail at. - * @param {number} [options.buffer] Tile buffer on each side. - * @param {number} [options.tolerance] Simplification tolerance (higher means simpler). - * @example - * var sourceObj = new mapboxgl.GeoJSONSource({ - * data: { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [ - * -76.53063297271729, - * 39.18174077994108 - * ] - * } - * }] - * } - * }); - * map.addSource('some id', sourceObj); // add - * map.removeSource('some id'); // remove - */ -function GeoJSONSource(options) { - options = options || {}; - - this._data = options.data; - - if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom; - - this.geojsonVtOptions = { maxZoom: this.maxzoom }; - if (options.buffer !== undefined) this.geojsonVtOptions.buffer = options.buffer; - if (options.tolerance !== undefined) this.geojsonVtOptions.tolerance = options.tolerance; - - this._pyramid = new TilePyramid({ - tileSize: 512, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - cacheSize: 20, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this) - }); -} - -GeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */{ - minzoom: 0, - maxzoom: 14, - _dirty: true, - - /** - * Update source geojson data and rerender map - * - * @param {Object|string} data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files. - * @returns {GeoJSONSource} this - */ - setData: function(data) { - this._data = data; - this._dirty = true; - - this.fire('change'); - - if (this.map) - this.update(this.map.transform); - - return this; - }, - - onAdd: function(map) { - this.map = map; - }, - - loaded: function() { - return this._loaded && this._pyramid.loaded(); - }, - - update: function(transform) { - if (this._dirty) { - this._updateData(); - } - - if (this._loaded) { - this._pyramid.update(this.used, transform); - } - }, - - reload: function() { - if (this._loaded) { - this._pyramid.reload(); - } - }, - - render: Source._renderTiles, - featuresAt: Source._vectorFeaturesAt, - - _updateData: function() { - this._dirty = false; - var data = this._data; - if (typeof data === 'string') { - data = urlResolve(window.location.href, data); - } - this.workerID = this.dispatcher.send('parse geojson', { - data: data, - tileSize: 512, - source: this.id, - geojsonVtOptions: this.geojsonVtOptions - }, function(err) { - - if (err) { - this.fire('error', {error: err}); - return; - } - this._loaded = true; - this._pyramid.reload(); - - this.fire('change'); - }.bind(this)); - }, - - _loadTile: function(tile) { - var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; - var params = { - uid: tile.uid, - coord: tile.coord, - zoom: tile.coord.z, - maxZoom: this.maxzoom, - tileSize: 512, - source: this.id, - overscaling: overscaling, - angle: this.map.transform.angle, - pitch: this.map.transform.pitch, - collisionDebug: this.map.collisionDebug - }; - - tile.workerID = this.dispatcher.send('load geojson tile', params, function(err, data) { - - tile.unloadVectorData(this.map.painter); - - if (tile.aborted) - return; - - if (err) { - this.fire('tile.error', {tile: tile}); - return; - } - - tile.loadVectorData(data); - this.fire('tile.load', {tile: tile}); - - }.bind(this), this.workerID); - }, - - _abortTile: function(tile) { - tile.aborted = true; - }, - - _addTile: function(tile) { - this.fire('tile.add', {tile: tile}); - }, - - _removeTile: function(tile) { - this.fire('tile.remove', {tile: tile}); - }, - - _unloadTile: function(tile) { - tile.unloadVectorData(this.map.painter); - this.glyphAtlas.removeGlyphs(tile.uid); - this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID); - } -}); - -},{"../util/evented":97,"../util/util":103,"./source":39,"./tile_pyramid":42,"resolve-url":136}],37:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); -var VectorTileFeature = require('vector-tile').VectorTileFeature; - -module.exports = GeoJSONWrapper; - -// conform to vectortile api -function GeoJSONWrapper(features) { - this.features = features; - this.length = features.length; -} - -GeoJSONWrapper.prototype.feature = function(i) { - return new FeatureWrapper(this.features[i]); -}; - -function FeatureWrapper(feature) { - this.type = feature.type; - this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry; - this.properties = feature.tags; - this.extent = 4096; -} - -FeatureWrapper.prototype.loadGeometry = function() { - var rings = this.rawGeometry; - this.geometry = []; - - for (var i = 0; i < rings.length; i++) { - var ring = rings[i], - newRing = []; - for (var j = 0; j < ring.length; j++) { - newRing.push(new Point(ring[j][0], ring[j][1])); - } - this.geometry.push(newRing); - } - return this.geometry; -}; - -FeatureWrapper.prototype.bbox = function() { - if (!this.geometry) this.loadGeometry(); - - var rings = this.geometry, - x1 = Infinity, - x2 = -Infinity, - y1 = Infinity, - y2 = -Infinity; - - for (var i = 0; i < rings.length; i++) { - var ring = rings[i]; - - for (var j = 0; j < ring.length; j++) { - var coord = ring[j]; - - x1 = Math.min(x1, coord.x); - x2 = Math.max(x2, coord.x); - y1 = Math.min(y1, coord.y); - y2 = Math.max(y2, coord.y); - } - } - - return [x1, y1, x2, y2]; -}; - -FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; - -},{"point-geometry":134,"vector-tile":138}],38:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var ajax = require('../util/ajax'); -var Evented = require('../util/evented'); -var Source = require('./source'); -var normalizeURL = require('../util/mapbox').normalizeTileURL; - -module.exports = RasterTileSource; - -function RasterTileSource(options) { - util.extend(this, util.pick(options, ['url', 'tileSize'])); - - Source._loadTileJSON.call(this, options); -} - -RasterTileSource.prototype = util.inherit(Evented, { - minzoom: 0, - maxzoom: 22, - roundZoom: true, - tileSize: 512, - _loaded: false, - - onAdd: function(map) { - this.map = map; - }, - - loaded: function() { - return this._pyramid && this._pyramid.loaded(); - }, - - update: function(transform) { - if (this._pyramid) { - this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration); - } - }, - - reload: function() { - // noop - }, - - render: Source._renderTiles, - - _loadTile: function(tile) { - ajax.getImage(normalizeURL(tile.coord.url(this.tiles), this.url), function(err, img) { - if (tile.aborted) - return; - - if (err) { - this.fire('tile.error', {tile: tile}); - return; - } - - var gl = this.map.painter.gl; - tile.texture = this.map.painter.getTexture(img.width); - if (tile.texture) { - gl.bindTexture(gl.TEXTURE_2D, tile.texture); - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img); - } else { - tile.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, tile.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); - tile.texture.size = img.width; - } - gl.generateMipmap(gl.TEXTURE_2D); - - tile.timeAdded = new Date().getTime(); - this.map.animationLoop.set(this.style.rasterFadeDuration); - - tile.source = this; - tile.loaded = true; - - this.fire('tile.load', {tile: tile}); - }.bind(this)); - }, - - _abortTile: function(tile) { - tile.aborted = true; - }, - - _addTile: function(tile) { - this.fire('tile.add', {tile: tile}); - }, - - _removeTile: function(tile) { - this.fire('tile.remove', {tile: tile}); - }, - - _unloadTile: function(tile) { - if (tile.texture) this.map.painter.saveTexture(tile.texture); - }, - - featuresAt: function(point, params, callback) { - callback(null, []); - } -}); - -},{"../util/ajax":91,"../util/evented":97,"../util/mapbox":100,"../util/util":103,"./source":39}],39:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var ajax = require('../util/ajax'); -var browser = require('../util/browser'); -var TilePyramid = require('./tile_pyramid'); -var TileCoord = require('./tile_coord'); -var normalizeURL = require('../util/mapbox').normalizeSourceURL; - -exports._loadTileJSON = function(options) { - - var loaded = function(err, tileJSON) { - if (err) { - this.fire('error', {error: err}); - return; - } - - util.extend(this, util.pick(tileJSON, - ['tiles', 'minzoom', 'maxzoom', 'attribution'])); - - this._pyramid = new TilePyramid({ - tileSize: this.tileSize, - cacheSize: 20, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - roundZoom: this.roundZoom, - reparseOverscaled: this.reparseOverscaled, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this), - redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined - }); - - // if index is defined, fetch the index json, then extend the pyramid - if (tileJSON.index) { - ajax.getJSON(normalizeURL(tileJSON.index), function (err, index) { - if (err) { - this.fire('error', {error: err}); - return; - } - - util.extend(this._pyramid, index); - this.fire('load'); - - }.bind(this)); - } else { - this.fire('load'); - } - - }.bind(this); - - if (options.url) { - ajax.getJSON(normalizeURL(options.url), loaded); - } else { - browser.frame(loaded.bind(this, null, options)); - } -}; - -exports._renderTiles = function(layers, painter) { - if (!this._pyramid) - return; - - var ids = this._pyramid.renderedIDs(); - for (var i = 0; i < ids.length; i++) { - var tile = this._pyramid.getTile(ids[i]), - // coord is different than tile.coord for wrapped tiles since the actual - // tile object is shared between all the visible copies of that tile. - coord = TileCoord.fromID(ids[i]), - z = coord.z, - x = coord.x, - y = coord.y, - w = coord.w; - - // if z > maxzoom then the tile is actually a overscaled maxzoom tile, - // so calculate the matrix the maxzoom tile would use. - z = Math.min(z, this.maxzoom); - - x += w * (1 << z); - tile.calculateMatrices(z, x, y, painter.transform, painter); - - painter.drawTile(tile, layers); - } -}; - -exports._vectorFeaturesAt = function(coord, params, callback) { - if (!this._pyramid) - return callback(null, []); - - var result = this._pyramid.tileAt(coord); - if (!result) - return callback(null, []); - - this.dispatcher.send('query features', { - uid: result.tile.uid, - x: result.x, - y: result.y, - scale: result.scale, - source: this.id, - params: params - }, callback, result.tile.workerID); -}; - -/* - * Create a tiled data source instance given an options object - * - * @param {Object} options - * @param {string} options.type Either `raster` or `vector`. - * @param {string} options.url A tile source URL. This should either be `mapbox://{mapid}` or a full `http[s]` url that points to a TileJSON endpoint. - * @param {Array} options.tiles An array of tile sources. If `url` is not specified, `tiles` can be used instead to specify tile sources, as in the TileJSON spec. Other TileJSON keys such as `minzoom` and `maxzoom` can be specified in a source object if `tiles` is used. - * @param {string} options.id An optional `id` to assign to the source - * @param {number} [options.tileSize=512] Optional tile size (width and height in pixels, assuming tiles are square). This option is only configurable for raster sources - * @param {number} options.cacheSize Optional max number of tiles to cache at any given time - * @example - * var sourceObj = new mapboxgl.Source.create({ - * type: 'vector', - * url: 'mapbox://mapbox.mapbox-streets-v5' - * }); - * map.addSource('some id', sourceObj); // add - * map.removeSource('some id'); // remove - */ -exports.create = function(source) { - // This is not at file scope in order to avoid a circular require. - var sources = { - vector: require('./vector_tile_source'), - raster: require('./raster_tile_source'), - geojson: require('./geojson_source'), - video: require('./video_source') - }; - - for (var type in sources) { - if (source instanceof sources[type]) { - return source; - } - } - - return new sources[source.type](source); -}; - -},{"../util/ajax":91,"../util/browser":92,"../util/mapbox":100,"../util/util":103,"./geojson_source":36,"./raster_tile_source":38,"./tile_coord":41,"./tile_pyramid":42,"./vector_tile_source":43,"./video_source":44}],40:[function(require,module,exports){ -'use strict'; - -var glmatrix = require('gl-matrix'); -var mat2 = glmatrix.mat2; -var mat4 = glmatrix.mat4; -var util = require('../util/util'); -var BufferSet = require('../data/buffer/buffer_set'); - -module.exports = Tile; - -/** - * A tile object is the combination of a Coordinate, which defines - * its place, as well as a unique ID and data tracking for its content - * - * @param {Coordinate} coord - * @param {number} size - * @private - */ -function Tile(coord, size) { - this.coord = coord; - this.uid = util.uniqueId(); - this.loaded = false; - this.uses = 0; - this.tileSize = size; -} - -Tile.prototype = { - // todo unhardcode - tileExtent: 4096, - - /** - * Calculate the internal posMatrix that this tile uses to display - * itself in a map, given a coordinate as (z, x, y) and a transform - * @param {number} z - * @param {number} x - * @param {number} y - * @param {Object} transform - * @private - */ - calculateMatrices: function(z, x, y, transform) { - - // Initialize model-view matrix that converts from the tile coordinates - // to screen coordinates. - var tileScale = Math.pow(2, z); - var scale = transform.worldSize / tileScale; - - // TODO: remove - this.scale = scale; - - // The position matrix - this.posMatrix = new Float64Array(16); - mat4.identity(this.posMatrix); - mat4.translate(this.posMatrix, this.posMatrix, [x * scale, y * scale, 0]); - - mat4.scale(this.posMatrix, this.posMatrix, [ scale / this.tileExtent, scale / this.tileExtent, 1 ]); - mat4.multiply(this.posMatrix, transform.getProjMatrix(), this.posMatrix); - - // The extrusion matrix. - this.exMatrix = mat4.create(); - mat4.ortho(this.exMatrix, 0, transform.width, transform.height, 0, 0, -1); - //mat4.rotateZ(this.exMatrix, this.exMatrix, -transform.angle); - - // 2x2 matrix for rotating points - this.rotationMatrix = mat2.create(); - mat2.rotate(this.rotationMatrix, this.rotationMatrix, transform.angle); - - this.posMatrix = new Float32Array(this.posMatrix); - }, - - /** - * Given a coordinate position, zoom that coordinate to my zoom and - * scale and return a position in x, y, scale - * @param {Coordinate} coord - * @returns {Object} position - * @private - */ - positionAt: function(coord, sourceMaxZoom) { - coord = coord.zoomTo(Math.min(this.coord.z, sourceMaxZoom)); - return { - x: (coord.column - this.coord.x) * 4096, - y: (coord.row - this.coord.y) * 4096, - scale: this.scale - }; - }, - - /** - * Given a data object with a 'buffers' property, load it into - * this tile's elementGroups and buffers properties and set loaded - * to true. If the data is null, like in the case of an empty - * GeoJSON tile, no-op but still set loaded to true. - * @param {Object} data - * @returns {undefined} - * @private - */ - loadVectorData: function(data) { - this.loaded = true; - - // empty GeoJSON tile - if (!data) return; - - this.buffers = new BufferSet(data.buffers); - this.elementGroups = data.elementGroups; - this.tileExtent = data.extent; - }, - - /** - * given a data object and a GL painter, destroy and re-create - * all of its buffers. - * @param {Object} data - * @param {Object} painter - * @returns {undefined} - * @private - */ - reloadSymbolData: function(data, painter) { - - if (!this.buffers) { - // the tile has been destroyed - return; - } - - this.buffers.glyphVertex.destroy(painter.gl); - this.buffers.glyphElement.destroy(painter.gl); - this.buffers.iconVertex.destroy(painter.gl); - this.buffers.iconElement.destroy(painter.gl); - this.buffers.collisionBoxVertex.destroy(painter.gl); - - var buffers = new BufferSet(data.buffers); - this.buffers.glyphVertex = buffers.glyphVertex; - this.buffers.glyphElement = buffers.glyphElement; - this.buffers.iconVertex = buffers.iconVertex; - this.buffers.iconElement = buffers.iconElement; - this.buffers.collisionBoxVertex = buffers.collisionBoxVertex; - - for (var id in data.elementGroups) { - this.elementGroups[id] = data.elementGroups[id]; - } - }, - - /** - * Make sure that this tile doesn't own any data within a given - * painter, so that it doesn't consume any memory or maintain - * any references to the painter. - * @param {Object} painter gl painter object - * @returns {undefined} - * @private - */ - unloadVectorData: function(painter) { - for (var b in this.buffers) { - this.buffers[b].destroy(painter.gl); - } - this.buffers = null; - } -}; - -},{"../data/buffer/buffer_set":2,"../util/util":103,"gl-matrix":116}],41:[function(require,module,exports){ -'use strict'; - -module.exports = TileCoord; - -function TileCoord(z, x, y, w) { - if (w === undefined) w = 0; - this.z = z; - this.x = x; - this.y = y; - this.w = w; - - // calculate id - w *= 2; - if (w < 0) w = w * -1 - 1; - var dim = 1 << this.z; - this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z; -} - -TileCoord.prototype.toString = function() { - return this.z + "/" + this.x + "/" + this.y; -}; - -// Parse a packed integer id into a TileCoord object -TileCoord.fromID = function(id) { - var z = id % 32, dim = 1 << z; - var xy = ((id - z) / 32); - var x = xy % dim, y = ((xy - x) / dim) % dim; - var w = Math.floor(xy / (dim * dim)); - if (w % 2 !== 0) w = w * -1 - 1; - w /= 2; - return new TileCoord(z, x, y, w); -}; - -// given a list of urls, choose a url template and return a tile URL -TileCoord.prototype.url = function(urls, sourceMaxZoom) { - return urls[(this.x + this.y) % urls.length] - .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) - .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z)) - .replace('{x}', this.x) - .replace('{y}', this.y); -}; - -// Return the coordinate of the parent tile -TileCoord.prototype.parent = function(sourceMaxZoom) { - if (this.z === 0) return null; - - // the id represents an overscaled tile, return the same coordinates with a lower z - if (this.z > sourceMaxZoom) { - return new TileCoord(this.z - 1, this.x, this.y, this.w); - } - - return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w); -}; - -TileCoord.prototype.wrapped = function() { - return new TileCoord(this.z, this.x, this.y, 0); -}; - -// Return the coordinates of the tile's children -TileCoord.prototype.children = function(sourceMaxZoom) { - - if (this.z >= sourceMaxZoom) { - // return a single tile coord representing a an overscaled tile - return [new TileCoord(this.z + 1, this.x, this.y, this.w)]; - } - - var z = this.z + 1; - var x = this.x * 2; - var y = this.y * 2; - return [ - new TileCoord(z, x, y, this.w), - new TileCoord(z, x + 1, y, this.w), - new TileCoord(z, x, y + 1, this.w), - new TileCoord(z, x + 1, y + 1, this.w) - ]; -}; - -// Taken from polymaps src/Layer.js -// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 - -function edge(a, b) { - if (a.row > b.row) { var t = a; a = b; b = t; } - return { - x0: a.column, - y0: a.row, - x1: b.column, - y1: b.row, - dx: b.column - a.column, - dy: b.row - a.row - }; -} - -function scanSpans(e0, e1, ymin, ymax, scanLine) { - var y0 = Math.max(ymin, Math.floor(e1.y0)); - var y1 = Math.min(ymax, Math.ceil(e1.y1)); - - // sort edges by x-coordinate - if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? - (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : - (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { - var t = e0; e0 = e1; e1 = t; - } - - // scan lines! - var m0 = e0.dx / e0.dy; - var m1 = e1.dx / e1.dy; - var d0 = e0.dx > 0; // use y + 1 to compute x0 - var d1 = e1.dx < 0; // use y + 1 to compute x1 - for (var y = y0; y < y1; y++) { - var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; - var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; - scanLine(Math.floor(x1), Math.ceil(x0), y); - } -} - -function scanTriangle(a, b, c, ymin, ymax, scanLine) { - var ab = edge(a, b), - bc = edge(b, c), - ca = edge(c, a); - - var t; - - // sort edges by y-length - if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } - if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } - if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } - - // scan span! scan span! - if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine); - if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine); -} - -TileCoord.cover = function(z, bounds, actualZ) { - var tiles = 1 << z; - var t = {}; - - function scanLine(x0, x1, y) { - var x, wx; - if (y >= 0 && y <= tiles) { - for (x = x0; x < x1; x++) { - wx = (x + tiles) % tiles; - var coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles)); - t[coord.id] = coord; - } - } - } - - // Divide the screen up in two triangles and scan each of them: - // +---/ - // | / | - // /---+ - scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine); - scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine); - - return Object.keys(t).map(function(id) { - return t[id]; - }); -}; - -},{}],42:[function(require,module,exports){ -'use strict'; - -var Tile = require('./tile'); -var TileCoord = require('./tile_coord'); -var Point = require('point-geometry'); -var Cache = require('../util/mru_cache'); -var util = require('../util/util'); - -module.exports = TilePyramid; - -/** - * A tile pyramid is a specialized cache and datastructure - * that contains tiles. It's used by sources to manage their - * data. - * - * @param {Object} options - * @param {number} options.tileSize - * @param {number} options.minzoom - * @param {number} options.maxzoom - * @private - */ -function TilePyramid(options) { - this.tileSize = options.tileSize; - this.minzoom = options.minzoom; - this.maxzoom = options.maxzoom; - this.roundZoom = options.roundZoom; - this.reparseOverscaled = options.reparseOverscaled; - // esri/chelm - this.index = options.index; - - this._load = options.load; - this._abort = options.abort; - this._unload = options.unload; - this._add = options.add; - this._remove = options.remove; - this._redoPlacement = options.redoPlacement; - - this._tiles = {}; - this._cache = new Cache(options.cacheSize, function(tile) { return this._unload(tile); }.bind(this)); -} - -TilePyramid.prototype = { - /** - * Confirm that every tracked tile is loaded. - * @returns {boolean} whether all tiles are loaded. - * @private - */ - loaded: function() { - for (var t in this._tiles) { - if (!this._tiles[t].loaded) - return false; - } - return true; - }, - - /** - * Return all tile ids ordered with z-order, and cast to numbers - * @returns {Array} ids - * @private - */ - orderedIDs: function() { - return Object.keys(this._tiles) - .sort(function(a, b) { return (b % 32) - (a % 32); }) - .map(function(id) { return +id; }); - }, - - renderedIDs: function() { - return this.orderedIDs().filter(function(id) { - return this._tiles[id].loaded && !this._coveredTiles[id]; - }.bind(this)); - }, - - reload: function() { - this._cache.reset(); - for (var i in this._tiles) { - this._load(this._tiles[i]); - } - }, - - /** - * Get a specific tile by id - * @param {string|number} id tile id - * @returns {Object} tile - * @private - */ - getTile: function(id) { - return this._tiles[id]; - }, - - /** - * get the zoom level adjusted for the difference in map and source tilesizes - * @param {Object} transform - * @returns {number} zoom level - * @private - */ - getZoom: function(transform) { - return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2; - }, - - /** - * Return a zoom level that will cover all tiles in a given transform - * @param {Object} transform - * @returns {number} zoom level - * @private - */ - coveringZoomLevel: function(transform) { - return (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); - }, - - /** - * Given a transform, return all coordinates that could cover that - * transform for a covering zoom level. - * @param {Object} transform - * @returns {Array} tiles - * @private - */ - coveringTiles: function(transform) { - var z = this.coveringZoomLevel(transform); - var actualZ = z; - - if (z < this.minzoom) return []; - if (z > this.maxzoom) z = this.maxzoom; - - var tr = transform, - tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z), - centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5); - - return TileCoord.cover(z, [ - tr.pointCoordinate(new Point(0, 0))._zoomTo(z), - tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z), - tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z), - tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z) - ], this.reparseOverscaled ? actualZ : z).sort(function(a, b) { - return centerPoint.dist(a) - centerPoint.dist(b); - }); - }, - - /** - * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; - * adds found tiles to retain object; returns true if children completely cover the tile - * - * @param {Coordinate} coord - * @param {number} maxCoveringZoom - * @param {boolean} retain - * @returns {boolean} whether the operation was complete - * @private - */ - findLoadedChildren: function(coord, maxCoveringZoom, retain) { - var complete = true; - var z = coord.z; - var coords = coord.children(this.maxzoom); - for (var i = 0; i < coords.length; i++) { - var id = coords[i].id; - if (this._tiles[id] && this._tiles[id].loaded) { - retain[id] = true; - } else { - complete = false; - if (z < maxCoveringZoom) { - // Go further down the hierarchy to find more unloaded children. - this.findLoadedChildren(coords[i], maxCoveringZoom, retain); - } - } - } - return complete; - }, - - /** - * Find a loaded parent of the given tile (up to minCoveringZoom); - * adds the found tile to retain object and returns the tile if found - * - * @param {Coordinate} coord - * @param {number} minCoveringZoom - * @param {boolean} retain - * @returns {Tile} tile object - * @private - */ - findLoadedParent: function(coord, minCoveringZoom, retain) { - for (var z = coord.z - 1; z >= minCoveringZoom; z--) { - coord = coord.parent(this.maxzoom); - var tile = this._tiles[coord.id]; - if (tile && tile.loaded) { - retain[coord.id] = true; - return tile; - } - } - }, - - /** - * Removes tiles that are outside the viewport and adds new tiles that - * are inside the viewport. - * @private - */ - update: function(used, transform, fadeDuration) { - var i; - var coord; - var tile; - - // Determine the overzooming/underzooming amounts. - var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); - var minCoveringZoom = util.clamp(zoom - 10, this.minzoom, this.maxzoom); - var maxCoveringZoom = util.clamp(zoom + 1, this.minzoom, this.maxzoom); - - // Retain is a list of tiles that we shouldn't delete, even if they are not - // the most ideal tile for the current viewport. This may include tiles like - // parent or child tiles that are *already* loaded. - var retain = {}; - var now = new Date().getTime(); - - // Covered is a list of retained tiles who's areas are full covered by other, - // better, retained tiles. They are not drawn separately. - this._coveredTiles = {}; - - var required = used ? this.coveringTiles(transform) : []; - for (i = 0; i < required.length; i++) { - coord = required[i]; - tile = this.addTile(coord); - - retain[coord.id] = true; - - if (tile.loaded) - continue; - - // The tile we require is not yet loaded. - // Retain child or parent tiles that cover the same area. - if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) { - this.findLoadedParent(coord, minCoveringZoom, retain); - } - } - - for (var id in retain) { - coord = TileCoord.fromID(id); - tile = this._tiles[id]; - if (tile && tile.timeAdded > now - (fadeDuration || 0)) { - // This tile is still fading in. Find tiles to cross-fade with it. - if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) { - this._coveredTiles[id] = true; - retain[id] = true; - } else { - this.findLoadedParent(coord, minCoveringZoom, retain); - } - } - } - - // Remove the tiles we don't need anymore. - var remove = util.keysDifference(this._tiles, retain); - for (i = 0; i < remove.length; i++) { - this.removeTile(+remove[i]); - } - }, - - /** - * Add a tile, given its coordinate, to the pyramid. - * @param {Coordinate} coord - * @returns {Coordinate} the coordinate. - * @private - */ - addTile: function(coord) { - var tile = this._tiles[coord.id]; - if (tile) - return tile; - - var wrapped = coord.wrapped(); - tile = this._tiles[wrapped.id]; - - if (!tile) { - tile = this._cache.get(wrapped.id); - if (tile && this._redoPlacement) { - this._redoPlacement(tile); - } - } - - if (!tile) { - var zoom = coord.z; - var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1; - tile = new Tile(wrapped, this.tileSize * overscaling); - // esri/chelm - if (this.index) { - tile.parentId = this.indexSearch(coord.id); - } - this._load(tile); - } - - tile.uses++; - this._tiles[coord.id] = tile; - this._add(tile, coord); - - return tile; - }, - - /** - * Remove a tile, given its id, from the pyramid - * @param {string|number} id tile id - * @returns {undefined} nothing - * @private - */ - removeTile: function(id) { - var tile = this._tiles[id]; - if (!tile) - return; - - tile.uses--; - delete this._tiles[id]; - this._remove(tile); - - if (tile.uses > 0) - return; - - if (tile.loaded) { - this._cache.add(tile.coord.wrapped().id, tile); - } else { - this._abort(tile); - this._unload(tile); - } - }, - - /** - * Remove all tiles from this pyramid - * @private - */ - clearTiles: function() { - for (var id in this._tiles) - this.removeTile(id); - this._cache.reset(); - }, - - /** - * For a given coordinate, search through our current tiles and attempt - * to find a tile at that point - * @param {Coordinate} coord - * @returns {Object} tile - * @private - */ - tileAt: function(coord) { - var ids = this.orderedIDs(); - for (var i = 0; i < ids.length; i++) { - var tile = this._tiles[ids[i]]; - var pos = tile.positionAt(coord, this.maxzoom); - if (pos && pos.x >= 0 && pos.x < 4096 && pos.y >= 0 && pos.y < 4096) { - // The click is within the viewport. There is only ever one tile in - // a layer that has this property. - return { - tile: tile, - x: pos.x, - y: pos.y, - scale: pos.scale - }; - } - } - }, - - /** - * For a given tile id find its parent tile from the index - * @param {string|number} id tile id - * @returns {Object} tile - * @private - */ - indexSearch: function (id) { - var tile = TileCoord.fromID(id); - - var ids = []; - - var parentTile = tile; - while (id !== 0) { - parentTile = parentTile.parent(id); - id = parentTile.id; - ids.push(id); - } - - var cursor = this.index, - cursorId = ids.pop(), - index; - - while (ids.length) { - id = ids.pop(); - index = tile.children(cursorId).indexOf(id); - if (cursor) { - if (cursor[index] === 0) { - id = cursorId; - break; - } else if (cursor[index] === 1) { - break; - } else { - cursorId = id; - cursor = cursor[index]; - } - } - } - - return TileCoord.fromID(id).id; - - } - -}; - -},{"../util/mru_cache":101,"../util/util":103,"./tile":40,"./tile_coord":41,"point-geometry":134}],43:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var Evented = require('../util/evented'); -var Source = require('./source'); -var TileCoord = require('./tile_coord'); - -module.exports = VectorTileSource; - -function VectorTileSource(options) { - util.extend(this, util.pick(options, ['url', 'tileSize'])); - - if (this.tileSize !== 512) { - throw new Error('vector tile sources must have a tileSize of 512'); - } - - Source._loadTileJSON.call(this, options); -} - -VectorTileSource.prototype = util.inherit(Evented, { - minzoom: 0, - maxzoom: 22, - tileSize: 512, - reparseOverscaled: true, - _loaded: false, - - onAdd: function(map) { - this.map = map; - }, - - loaded: function() { - return this._pyramid && this._pyramid.loaded(); - }, - - update: function(transform) { - if (this._pyramid) { - this._pyramid.update(this.used, transform); - } - }, - - reload: function() { - if (this._pyramid) { - this._pyramid.reload(); - } - }, - - redoPlacement: function() { - if (!this._pyramid) { - return; - } - - var ids = this._pyramid.orderedIDs(); - for (var i = 0; i < ids.length; i++) { - var tile = this._pyramid.getTile(ids[i]); - this._redoTilePlacement(tile); - } - }, - - render: Source._renderTiles, - featuresAt: Source._vectorFeaturesAt, - - _loadTile: function(tile) { - var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; - var params = { - url: tile.coord.url(this.tiles, this.maxzoom), - uid: tile.uid, - coord: tile.coord, - zoom: tile.coord.z, - maxZoom: this.maxzoom, - tileSize: this.tileSize * overscaling, - source: this.id, - overscaling: overscaling, - angle: this.map.transform.angle, - pitch: this.map.transform.pitch, - collisionDebug: this.map.collisionDebug - }; - - // request the tile parentID if it exists - if (tile.parentId) { - console.log(TileCoord.fromID(tile.parentID)) - params.url = TileCoord.fromID(tile.parentID).url(this.tiles, this.maxzoom); - } - - if (tile.workerID) { - this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID); - } else { - tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile)); - } - }, - - _tileLoaded: function(tile, err, data) { - if (tile.aborted) - return; - - if (err) { - this.fire('tile.error', {tile: tile}); - return; - } - - tile.loadVectorData(data); - - if (tile.redoWhenDone) { - tile.redoWhenDone = false; - this._redoTilePlacement(tile); - } - - this.fire('tile.load', {tile: tile}); - }, - - _abortTile: function(tile) { - tile.aborted = true; - this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID); - }, - - _addTile: function(tile) { - this.fire('tile.add', {tile: tile}); - }, - - _removeTile: function(tile) { - this.fire('tile.remove', {tile: tile}); - }, - - _unloadTile: function(tile) { - tile.unloadVectorData(this.map.painter); - this.glyphAtlas.removeGlyphs(tile.uid); - this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID); - }, - - _redoTilePlacement: function(tile) { - - if (!tile.loaded || tile.redoingPlacement) { - tile.redoWhenDone = true; - return; - } - - tile.redoingPlacement = true; - - this.dispatcher.send('redo placement', { - uid: tile.uid, - source: this.id, - angle: this.map.transform.angle, - pitch: this.map.transform.pitch, - collisionDebug: this.map.collisionDebug - }, done.bind(this), tile.workerID); - - function done(_, data) { - tile.reloadSymbolData(data, this.map.painter); - this.fire('tile.load', {tile: tile}); - - tile.redoingPlacement = false; - if (tile.redoWhenDone) { - this._redoTilePlacement(tile); - tile.redoWhenDone = false; - } - } - } -}); - -},{"../util/evented":97,"../util/util":103,"./source":39,"./tile_coord":41}],44:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var Tile = require('./tile'); -var LatLng = require('../geo/lat_lng'); -var Point = require('point-geometry'); -var Evented = require('../util/evented'); -var Coordinate = require('../geo/coordinate'); -var ajax = require('../util/ajax'); - -module.exports = VideoSource; - -/** - * Create a Video data source instance given an options object - * @class VideoSource - * @param {Object} [options] - * @param {string|Array} options.url A string or array of URL(s) to video files - * @param {Array} options.coordinates lat,lng coordinates in order clockwise starting at the top left: tl, tr, br, bl - * @example - * var sourceObj = new mapboxgl.VideoSource({ - * url: [ - * 'https://www.mapbox.com/videos/baltimore-smoke.mp4', - * 'https://www.mapbox.com/videos/baltimore-smoke.webm' - * ], - * coordinates: [ - * [39.18579907229748, -76.54335737228394], - * [39.1838364847587, -76.52803659439087], - * [39.17683392507606, -76.5295386314392], - * [39.17876344106642, -76.54520273208618] - * ] - * }); - * map.addSource('some id', sourceObj); // add - * map.removeSource('some id'); // remove - */ -function VideoSource(options) { - this.coordinates = options.coordinates; - - ajax.getVideo(options.url, function(err, video) { - // @TODO handle errors via event. - if (err) return; - - this.video = video; - this.video.loop = true; - - var loopID; - - // start repainting when video starts playing - this.video.addEventListener('playing', function() { - loopID = this.map.style.animationLoop.set(Infinity); - this.map._rerender(); - }.bind(this)); - - // stop repainting when video stops - this.video.addEventListener('pause', function() { - this.map.style.animationLoop.cancel(loopID); - }.bind(this)); - - this._loaded = true; - - if (this.map) { - this.video.play(); - this.createTile(); - this.fire('change'); - } - }.bind(this)); -} - -VideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{ - roundZoom: true, - - /** - * Return the HTML video element. - * - * @returns {Object} - */ - getVideo: function() { - return this.video; - }, - - onAdd: function(map) { - this.map = map; - if (this.video) { - this.video.play(); - this.createTile(); - } - }, - - createTile: function() { - /* - * Calculate which mercator tile is suitable for rendering the video in - * and create a buffer with the corner coordinates. These coordinates - * may be outside the tile, because raster tiles aren't clipped when rendering. - */ - var map = this.map; - var coords = this.coordinates.map(function(latlng) { - var loc = LatLng.convert(latlng); - return map.transform.locationCoordinate(loc).zoomTo(0); - }); - - var minX = Infinity; - var minY = Infinity; - var maxX = -Infinity; - var maxY = -Infinity; - - for (var i = 0; i < coords.length; i++) { - minX = Math.min(minX, coords[i].column); - minY = Math.min(minY, coords[i].row); - maxX = Math.max(maxX, coords[i].column); - maxY = Math.max(maxY, coords[i].row); - } - - var dx = maxX - minX; - var dy = maxY - minY; - var dMax = Math.max(dx, dy); - var center = new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0) - .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2)); - - var tileExtent = 4096; - var tileCoords = coords.map(function(coord) { - var zoomedCoord = coord.zoomTo(center.zoom); - return new Point( - Math.round((zoomedCoord.column - center.column) * tileExtent), - Math.round((zoomedCoord.row - center.row) * tileExtent)); - }); - - var gl = map.painter.gl; - var maxInt16 = 32767; - var array = new Int16Array([ - tileCoords[0].x, tileCoords[0].y, 0, 0, - tileCoords[1].x, tileCoords[1].y, maxInt16, 0, - tileCoords[3].x, tileCoords[3].y, 0, maxInt16, - tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16 - ]); - - this.tile = new Tile(); - this.tile.buckets = {}; - - this.tile.boundsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, this.tile.boundsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW); - - this.center = center; - }, - - loaded: function() { - return this.video && this.video.readyState >= 2; - }, - - update: function() { - // noop - }, - - reload: function() { - // noop - }, - - render: function(layers, painter) { - if (!this._loaded) return; - if (this.video.readyState < 2) return; // not enough data for current position - - var c = this.center; - this.tile.calculateMatrices(c.zoom, c.column, c.row, this.map.transform, painter); - - var gl = painter.gl; - if (!this.tile.texture) { - this.tile.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video); - } else { - gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); - } - - painter.drawLayers(layers, this.tile.posMatrix, this.tile); - }, - - featuresAt: function(point, params, callback) { - return callback(null, []); - } -}); - -},{"../geo/coordinate":17,"../geo/lat_lng":18,"../util/ajax":91,"../util/evented":97,"../util/util":103,"./tile":40,"point-geometry":134}],45:[function(require,module,exports){ -'use strict'; - -var Actor = require('../util/actor'); -var WorkerTile = require('./worker_tile'); -var util = require('../util/util'); -var ajax = require('../util/ajax'); -var vt = require('vector-tile'); -var Protobuf = require('pbf'); - -var geojsonvt = require('geojson-vt'); -var GeoJSONWrapper = require('./geojson_wrapper'); - -module.exports = function(self) { - return new Worker(self); -}; - -function Worker(self) { - this.self = self; - this.actor = new Actor(self, this); - this.loading = {}; - - this.loaded = {}; - this.layers = []; - this.geoJSONIndexes = {}; -} - -util.extend(Worker.prototype, { - 'set layers': function(layers) { - this.layers = layers; - }, - - 'load tile': function(params, callback) { - var source = params.source, - uid = params.uid; - - if (!this.loading[source]) - this.loading[source] = {}; - - - var tile = this.loading[source][uid] = new WorkerTile(params); - - tile.xhr = ajax.getArrayBuffer(params.url, done.bind(this)); - - function done(err, data) { - delete this.loading[source][uid]; - - if (err) return callback(err); - - tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data))); - if (params.id !== params.parentId && tile.data.layers) { - var tilePos = tile.coord.fromID(params.id); - var parentPos = tile.coord.fromID(params.parentId); - var dz = tilePos.z - parentPos.z; - var xPos = tilePos.x & ((1 << dz) - 1); - var yPos = tilePos.y & ((1 << dz) - 1); - tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); - } else { - tile.parse(tile.data, this.layers, this.actor, callback); - } - - this.loaded[source] = this.loaded[source] || {}; - this.loaded[source][uid] = tile; - } - }, - - 'reload tile': function(params, callback) { - var loaded = this.loaded[params.source], - uid = params.uid; - if (loaded && loaded[uid]) { - var tile = loaded[uid]; - tile.parse(tile.data, this.layers, this.actor, callback); - } - }, - - 'abort tile': function(params) { - var loading = this.loading[params.source], - uid = params.uid; - if (loading && loading[uid]) { - loading[uid].xhr.abort(); - delete loading[uid]; - } - }, - - 'remove tile': function(params) { - var loaded = this.loaded[params.source], - uid = params.uid; - if (loaded && loaded[uid]) { - delete loaded[uid]; - } - }, - - 'redo placement': function(params, callback) { - var loaded = this.loaded[params.source], - loading = this.loading[params.source], - uid = params.uid; - - if (loaded && loaded[uid]) { - var tile = loaded[uid]; - var result = tile.redoPlacement(params.angle, params.pitch, params.collisionDebug); - - if (result.result) { - callback(null, result.result, result.transferables); - } - - } else if (loading && loading[uid]) { - loading[uid].angle = params.angle; - } - }, - - 'parse geojson': function(params, callback) { - var indexData = function(err, data) { - if (err) return callback(err); - this.geoJSONIndexes[params.source] = geojsonvt(data, params.geojsonVtOptions); - callback(null); - }.bind(this); - - // TODO accept params.url for urls instead - - // Not, because of same origin issues, urls must either include an - // explicit origin or absolute path. - // ie: /foo/bar.json or http://example.com/bar.json - // but not ../foo/bar.json - if (typeof params.data === 'string') { - ajax.getJSON(params.data, indexData); - } - else indexData(null, params.data); - }, - - 'load geojson tile': function(params, callback) { - var source = params.source, - coord = params.coord; - - // console.time('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); - - var geoJSONTile = this.geoJSONIndexes[source].getTile(coord.z, coord.x, coord.y); - - // console.timeEnd('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); - - // if (!geoJSONTile) console.log('not found', this.geoJSONIndexes[source], coord); - - if (!geoJSONTile) return callback(null, null); // nothing in the given tile - - var tile = new WorkerTile(params); - tile.parse(new GeoJSONWrapper(geoJSONTile.features), this.layers, this.actor, callback); - - this.loaded[source] = this.loaded[source] || {}; - this.loaded[source][params.uid] = tile; - }, - - 'query features': function(params, callback) { - var tile = this.loaded[params.source] && this.loaded[params.source][params.uid]; - if (tile) { - tile.featureTree.query(params, callback); - } else { - callback(null, []); - } - } -}); - -},{"../util/actor":90,"../util/ajax":91,"../util/util":103,"./geojson_wrapper":37,"./worker_tile":46,"geojson-vt":112,"pbf":132,"vector-tile":138}],46:[function(require,module,exports){ -'use strict'; - -var FeatureTree = require('../data/feature_tree'); -var CollisionTile = require('../symbol/collision_tile'); -var BufferSet = require('../data/buffer/buffer_set'); -var createBucket = require('../data/create_bucket'); - -module.exports = WorkerTile; - -function WorkerTile(params) { - this.coord = params.coord; - this.uid = params.uid; - this.zoom = params.zoom; - this.maxZoom = params.maxZoom; - this.tileSize = params.tileSize; - this.source = params.source; - this.overscaling = params.overscaling; - this.angle = params.angle; - this.pitch = params.pitch; - this.collisionDebug = params.collisionDebug; - - this.stacks = {}; -} - -WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, yPos) { - - this.status = 'parsing'; - - this.featureTree = new FeatureTree(this.coord, this.overscaling); - - var i, k, - tile = this, - layer, - bucket, - buffers = new BufferSet(), - collisionTile = new CollisionTile(this.angle, this.pitch), - buckets = {}, - bucketsInOrder = this.bucketsInOrder = [], - bucketsBySourceLayer = {}; - - // Map non-ref layers to buckets. - for (i = 0; i < layers.length; i++) { - layer = layers[i]; - - if (layer.source !== this.source) - continue; - - if (layer.ref) - continue; - - var minzoom = layer.minzoom; - if (minzoom && this.zoom < minzoom && minzoom < this.maxZoom) - continue; - - var maxzoom = layer.maxzoom; - if (maxzoom && this.zoom >= maxzoom) - continue; - - var visibility = layer.layout.visibility; - if (visibility === 'none') - continue; - - bucket = createBucket(layer, buffers, this.zoom, this.overscaling, this.collisionDebug); - bucket.layers = [layer.id]; - - buckets[bucket.id] = bucket; - bucketsInOrder.push(bucket); - - if (data.layers) { - // vectortile - var sourceLayer = layer['source-layer']; - if (!bucketsBySourceLayer[sourceLayer]) - bucketsBySourceLayer[sourceLayer] = {}; - bucketsBySourceLayer[sourceLayer][bucket.id] = bucket; - } else { - // geojson tile - bucketsBySourceLayer[bucket.id] = bucket; - } - } - - // Index ref layers. - for (i = 0; i < layers.length; i++) { - layer = layers[i]; - - if (layer.source !== this.source) - continue; - - if (!layer.ref) - continue; - - bucket = buckets[layer.ref]; - if (!bucket) - continue; - - bucket.layers.push(layer.id); - } - - var extent = 4096; - - // read each layer, and sort its features into buckets - if (data.layers) { - // vectortile - for (k in bucketsBySourceLayer) { - layer = data.layers[k]; - if (!layer) continue; - if (layer.extent) extent = layer.extent; - sortLayerIntoBuckets(layer, bucketsBySourceLayer[k], dz, xPos, yPos); - } - } else { - // geojson - sortLayerIntoBuckets(data, bucketsBySourceLayer); - } - - function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { - for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i); - //MOB - feature.dz = dz; - feature.xPos = xPos; - feature.yPos = yPos; - - for (var key in buckets) { - var bucket = buckets[key]; - if (bucket.filter(feature)) { - bucket.features.push(feature); - } - } - } - } - - var prevPlacementBucket; - var remaining = bucketsInOrder.length; - - /* - * The async parsing here is a bit tricky. - * Some buckets depend on resources that may need to be loaded async (glyphs). - * Some buckets need to be parsed in order (to get collision priorities right). - * - * Dependencies calls are initiated first to get those rolling. - * Buckets that don't need to be parsed in order, aren't to save time. - */ - - for (i = 0; i < bucketsInOrder.length; i++) { - bucket = bucketsInOrder[i]; - - // Link buckets that need to be parsed in order - if (bucket.needsPlacement) { - if (prevPlacementBucket) { - prevPlacementBucket.next = bucket; - } else { - bucket.previousPlaced = true; - } - prevPlacementBucket = bucket; - } - - if (bucket.getDependencies) { - bucket.getDependencies(this, actor, dependenciesDone(bucket)); - } - - // immediately parse buckets where order doesn't matter and no dependencies - if (!bucket.needsPlacement && !bucket.getDependencies) { - parseBucket(tile, bucket); - } - } - - function dependenciesDone(bucket) { - return function(err) { - bucket.dependenciesLoaded = true; - parseBucket(tile, bucket, err); - }; - } - - function parseBucket(tile, bucket, skip) { - if (bucket.getDependencies && !bucket.dependenciesLoaded) return; - if (bucket.needsPlacement && !bucket.previousPlaced) return; - - if (!skip) { - var now = Date.now(); - if (bucket.features.length) bucket.addFeatures(collisionTile); - var time = Date.now() - now; - if (bucket.interactive) { - for (var i = 0; i < bucket.features.length; i++) { - var feature = bucket.features[i]; - tile.featureTree.insert(feature.bbox(), bucket.layers, feature); - } - } - if (typeof self !== 'undefined') { - self.bucketStats = self.bucketStats || {_total: 0}; - self.bucketStats._total += time; - self.bucketStats[bucket.id] = (self.bucketStats[bucket.id] || 0) + time; - } - } - - remaining--; - - if (!remaining) { - done(); - return; - } - - // try parsing the next bucket, if it is ready - if (bucket.next) { - bucket.next.previousPlaced = true; - parseBucket(tile, bucket.next); - } - } - - function done() { - - tile.status = 'done'; - - if (tile.redoPlacementAfterDone) { - var result = tile.redoPlacement(tile.angle, tile.pitch).result; - buffers.glyphVertex = result.buffers.glyphVertex; - buffers.iconVertex = result.buffers.iconVertex; - buffers.collisionBoxVertex = result.buffers.collisionBoxVertex; - } - - var transferables = [], - elementGroups = {}; - - for (k in buffers) { - transferables.push(buffers[k].array); - } - - for (k in buckets) { - elementGroups[k] = buckets[k].elementGroups; - } - - callback(null, { - elementGroups: elementGroups, - buffers: buffers, - extent: extent - }, transferables); - } -}; - -WorkerTile.prototype.redoPlacement = function(angle, pitch, collisionDebug) { - - if (this.status !== 'done') { - this.redoPlacementAfterDone = true; - this.angle = angle; - return {}; - } - - var buffers = new BufferSet(); - var transferables = []; - var elementGroups = {}; - var collisionTile = new CollisionTile(angle, pitch); - - var bucketsInOrder = this.bucketsInOrder; - for (var i = 0; i < bucketsInOrder.length; i++) { - var bucket = bucketsInOrder[i]; - - if (bucket.type === 'symbol') { - bucket.placeFeatures(collisionTile, buffers, collisionDebug); - elementGroups[bucket.id] = bucket.elementGroups; - } - } - - for (var k in buffers) { - transferables.push(buffers[k].array); - } - - return { - result: { - elementGroups: elementGroups, - buffers: buffers - }, - transferables: transferables - }; - -}; - -},{"../data/buffer/buffer_set":2,"../data/create_bucket":11,"../data/feature_tree":13,"../symbol/collision_tile":65}],47:[function(require,module,exports){ -'use strict'; - -module.exports = AnimationLoop; - -function AnimationLoop() { - this.n = 0; - this.times = []; -} - -// Are all animations done? -AnimationLoop.prototype.stopped = function() { - this.times = this.times.filter(function(t) { - return t.time >= (new Date()).getTime(); - }); - return !this.times.length; -}; - -// Add a new animation that will run t milliseconds -// Returns an id that can be used to cancel it layer -AnimationLoop.prototype.set = function(t) { - this.times.push({ id: this.n, time: t + (new Date()).getTime() }); - return this.n++; -}; - -// Cancel an animation -AnimationLoop.prototype.cancel = function(n) { - this.times = this.times.filter(function(t) { - return t.id !== n; - }); -}; - -},{}],48:[function(require,module,exports){ -'use strict'; - -var Evented = require('../util/evented'); -var ajax = require('../util/ajax'); -var browser = require('../util/browser'); - -module.exports = ImageSprite; - -function ImageSprite(base) { - this.base = base; - this.retina = browser.devicePixelRatio > 1; - - base = this.base + (this.retina ? '@2x' : ''); - - ajax.getJSON(base + '.json', function(err, data) { - if (err) { - this.fire('error', {error: err}); - return; - } - - this.data = data; - if (this.img) this.fire('load'); - }.bind(this)); - - ajax.getImage(base + '.png', function(err, img) { - if (err) { - this.fire('error', {error: err}); - return; - } - - // premultiply the sprite - var data = img.getData(); - var newdata = img.data = new Uint8Array(data.length); - for (var i = 0; i < data.length; i += 4) { - var alpha = data[i + 3] / 255; - newdata[i + 0] = data[i + 0] * alpha; - newdata[i + 1] = data[i + 1] * alpha; - newdata[i + 2] = data[i + 2] * alpha; - newdata[i + 3] = data[i + 3]; - } - - this.img = img; - if (this.data) this.fire('load'); - }.bind(this)); -} - -ImageSprite.prototype = Object.create(Evented); - -ImageSprite.prototype.toJSON = function() { - return this.base; -}; - -ImageSprite.prototype.loaded = function() { - return !!(this.data && this.img); -}; - -ImageSprite.prototype.resize = function(/*gl*/) { - if (browser.devicePixelRatio > 1 !== this.retina) { - var newSprite = new ImageSprite(this.base); - newSprite.on('load', function() { - this.img = newSprite.img; - this.data = newSprite.data; - this.retina = newSprite.retina; - }.bind(this)); - } -}; - -function SpritePosition() {} -SpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false }; - -ImageSprite.prototype.getSpritePosition = function(name) { - if (!this.loaded()) return new SpritePosition(); - - var pos = this.data && this.data[name]; - if (pos && this.img) return pos; - - return new SpritePosition(); -}; - -},{"../util/ajax":91,"../util/browser":92,"../util/evented":97}],49:[function(require,module,exports){ -'use strict'; - -var reference = require('./reference'); - -module.exports = {}; - -reference.layout.forEach(function(className) { - var Properties = function(props) { - for (var p in props) { - this[p] = props[p]; - } - }; - - var properties = reference[className]; - for (var prop in properties) { - if (properties[prop].default === undefined) continue; - Properties.prototype[prop] = properties[prop].default; - } - module.exports[className.replace('layout_', '')] = Properties; -}); - -},{"./reference":51}],50:[function(require,module,exports){ -'use strict'; - -var reference = require('./reference'); -var parseCSSColor = require('csscolorparser').parseCSSColor; - -module.exports = {}; - -reference.paint.forEach(function(className) { - var Calculated = function() {}; - - var properties = reference[className]; - for (var p in properties) { - var prop = properties[p], - value = prop.default; - - if (value === undefined) continue; - if (prop.type === 'color') value = parseCSSColor(value); - - Calculated.prototype[p] = value; - } - - Calculated.prototype.hidden = false; - module.exports[className.replace('paint_', '')] = Calculated; -}); - -},{"./reference":51,"csscolorparser":108}],51:[function(require,module,exports){ -module.exports = require('mapbox-gl-style-spec/reference/latest'); - -},{"mapbox-gl-style-spec/reference/latest":129}],52:[function(require,module,exports){ -'use strict'; - -var Evented = require('../util/evented'); -var styleBatch = require('./style_batch'); -var StyleLayer = require('./style_layer'); -var ImageSprite = require('./image_sprite'); -var GlyphSource = require('../symbol/glyph_source'); -var GlyphAtlas = require('../symbol/glyph_atlas'); -var SpriteAtlas = require('../symbol/sprite_atlas'); -var LineAtlas = require('../render/line_atlas'); -var util = require('../util/util'); -var ajax = require('../util/ajax'); -var normalizeURL = require('../util/mapbox').normalizeStyleURL; -var browser = require('../util/browser'); -var Dispatcher = require('../util/dispatcher'); -var AnimationLoop = require('./animation_loop'); -var validate = require('mapbox-gl-style-spec/lib/validate/latest'); - -module.exports = Style; - -function Style(stylesheet, animationLoop) { - this.animationLoop = animationLoop || new AnimationLoop(); - this.dispatcher = new Dispatcher(Math.max(browser.hardwareConcurrency - 1, 1), this); - this.glyphAtlas = new GlyphAtlas(1024, 1024); - this.spriteAtlas = new SpriteAtlas(512, 512); - this.spriteAtlas.resize(browser.devicePixelRatio); - this.lineAtlas = new LineAtlas(256, 512); - - this._layers = {}; - this._order = []; - this._groups = []; - this.sources = {}; - - this.zoomHistory = {}; - - util.bindAll([ - '_forwardSourceEvent', - '_forwardTileEvent', - '_redoPlacement' - ], this); - - var loaded = function(err, stylesheet) { - if (err) { - this.fire('error', {error: err}); - return; - } - - var valid = validate(stylesheet); - if (valid.length) { - valid.forEach(function(e) { - throw new Error(e.message); - }); - } - - this._loaded = true; - this.stylesheet = stylesheet; - - var sources = stylesheet.sources; - for (var id in sources) { - this.addSource(id, sources[id]); - } - - if (stylesheet.sprite) { - this.sprite = new ImageSprite(stylesheet.sprite); - this.sprite.on('load', this.fire.bind(this, 'change')); - } - - this.glyphSource = new GlyphSource(stylesheet.glyphs, this.glyphAtlas); - this._resolve(); - this.fire('load'); - }.bind(this); - - if (typeof stylesheet === 'string') { - ajax.getJSON(normalizeURL(stylesheet), loaded); - } else { - browser.frame(loaded.bind(this, null, stylesheet)); - } -} - -Style.prototype = util.inherit(Evented, { - _loaded: false, - - loaded: function() { - if (!this._loaded) - return false; - - for (var id in this.sources) - if (!this.sources[id].loaded()) - return false; - - if (this.sprite && !this.sprite.loaded()) - return false; - - return true; - }, - - _resolve: function() { - var id, layer; - - this._layers = {}; - this._order = []; - - for (var i = 0; i < this.stylesheet.layers.length; i++) { - layer = new StyleLayer(this.stylesheet.layers[i], this.stylesheet.constants || {}); - this._layers[layer.id] = layer; - this._order.push(layer.id); - } - - // Resolve layout properties. - for (id in this._layers) { - this._layers[id].resolveLayout(); - } - - // Resolve reference and paint properties. - for (id in this._layers) { - this._layers[id].resolveReference(this._layers); - this._layers[id].resolvePaint(); - } - - this._groupLayers(); - this._broadcastLayers(); - }, - - _groupLayers: function() { - var group; - - this._groups = []; - - // Split into groups of consecutive top-level layers with the same source. - for (var i = 0; i < this._order.length; ++i) { - var layer = this._layers[this._order[i]]; - - if (!group || layer.source !== group.source) { - group = []; - group.source = layer.source; - this._groups.push(group); - } - - group.push(layer); - } - }, - - _broadcastLayers: function() { - var ordered = []; - - for (var id in this._layers) { - ordered.push(this._layers[id].json()); - } - - this.dispatcher.broadcast('set layers', ordered); - }, - - _cascade: function(classes, options) { - if (!this._loaded) return; - - options = options || { - transition: true - }; - - for (var id in this._layers) { - this._layers[id].cascade(classes, options, - this.stylesheet.transition || {}, - this.animationLoop); - } - - this.fire('change'); - }, - - _recalculate: function(z) { - for (var id in this.sources) - this.sources[id].used = false; - - this._updateZoomHistory(z); - - this.rasterFadeDuration = 300; - for (id in this._layers) { - var layer = this._layers[id]; - - if (layer.recalculate(z, this.zoomHistory) && layer.source) { - this.sources[layer.source].used = true; - } - } - - var maxZoomTransitionDuration = 300; - if (Math.floor(this.z) !== Math.floor(z)) { - this.animationLoop.set(maxZoomTransitionDuration); - } - - this.z = z; - this.fire('zoom'); - }, - - _updateZoomHistory: function(z) { - - var zh = this.zoomHistory; - - if (zh.lastIntegerZoom === undefined) { - // first time - zh.lastIntegerZoom = Math.floor(z); - zh.lastIntegerZoomTime = 0; - zh.lastZoom = z; - } - - // check whether an integer zoom level as passed since the last frame - // and if yes, record it with the time. Used for transitioning patterns. - if (Math.floor(zh.lastZoom) < Math.floor(z)) { - zh.lastIntegerZoom = Math.floor(z); - zh.lastIntegerZoomTime = Date.now(); - - } else if (Math.floor(zh.lastZoom) > Math.floor(z)) { - zh.lastIntegerZoom = Math.floor(z + 1); - zh.lastIntegerZoomTime = Date.now(); - } - - zh.lastZoom = z; - }, - - /** - * Apply multiple style mutations in a batch - * @param {function} work Function which accepts the StyleBatch interface - * @private - */ - batch: function(work) { - styleBatch(this, work); - }, - - addSource: function(id, source) { - this.batch(function(batch) { - batch.addSource(id, source); - }); - - return this; - }, - - /** - * Remove a source from this stylesheet, given its id. - * @param {string} id id of the source to remove - * @returns {Style} this style - * @throws {Error} if no source is found with the given ID - * @private - */ - removeSource: function(id) { - this.batch(function(batch) { - batch.removeSource(id); - }); - - return this; - }, - - /** - * Get a source by id. - * @param {string} id id of the desired source - * @returns {Object} source - * @private - */ - getSource: function(id) { - return this.sources[id]; - }, - - /** - * Add a layer to the map style. The layer will be inserted before the layer with - * ID `before`, or appended if `before` is omitted. - * @param {StyleLayer|Object} layer - * @param {string=} before ID of an existing layer to insert before - * @fires layer.add - * @returns {Style} `this` - * @private - */ - addLayer: function(layer, before) { - this.batch(function(batch) { - batch.addLayer(layer, before); - }); - - return this; - }, - - /** - * Remove a layer from this stylesheet, given its id. - * @param {string} id id of the layer to remove - * @returns {Style} this style - * @throws {Error} if no layer is found with the given ID - * @private - */ - removeLayer: function(id) { - this.batch(function(batch) { - batch.removeLayer(id); - }); - - return this; - }, - - /** - * Get a layer by id. - * @param {string} id id of the desired layer - * @returns {Layer} layer - * @private - */ - getLayer: function(id) { - return this._layers[id]; - }, - - /** - * If a layer has a `ref` property that makes it derive some values - * from another layer, return that referent layer. Otherwise, - * returns the layer itself. - * @param {string} id the layer's id - * @returns {Layer} the referent layer or the layer itself - * @private - */ - getReferentLayer: function(id) { - var layer = this.getLayer(id); - if (layer.ref) { - layer = this.getLayer(layer.ref); - } - return layer; - }, - - setFilter: function(layer, filter) { - this.batch(function(batch) { - batch.setFilter(layer, filter); - }); - - return this; - }, - - setLayerZoomRange: function(layerId, minzoom, maxzoom) { - this.batch(function(batch) { - batch.setLayerZoomRange(layerId, minzoom, maxzoom); - }); - - return this; - }, - - /** - * Get a layer's filter object - * @param {string} layer the layer to inspect - * @returns {*} the layer's filter, if any - * @private - */ - getFilter: function(layer) { - return this.getReferentLayer(layer).filter; - }, - - setLayoutProperty: function(layer, name, value) { - this.batch(function(batch) { - batch.setLayoutProperty(layer, name, value); - }); - - return this; - }, - - /** - * Get a layout property's value from a given layer - * @param {string} layer the layer to inspect - * @param {string} name the name of the layout property - * @returns {*} the property value - * @private - */ - getLayoutProperty: function(layer, name) { - return this.getReferentLayer(layer).getLayoutProperty(name); - }, - - setPaintProperty: function(layer, name, value, klass) { - this.batch(function(batch) { - batch.setPaintProperty(layer, name, value, klass); - }); - - return this; - }, - - getPaintProperty: function(layer, name, klass) { - return this.getLayer(layer).getPaintProperty(name, klass); - }, - - featuresAt: function(coord, params, callback) { - var features = []; - var error = null; - - if (params.layer) { - params.layer = { id: params.layer }; - } - - util.asyncEach(Object.keys(this.sources), function(id, callback) { - var source = this.sources[id]; - source.featuresAt(coord, params, function(err, result) { - if (result) features = features.concat(result); - if (err) error = err; - callback(); - }); - }.bind(this), function() { - if (error) return callback(error); - - callback(null, features - .filter(function(feature) { - return this._layers[feature.layer] !== undefined; - }.bind(this)) - .map(function(feature) { - feature.layer = this._layers[feature.layer].json(); - return feature; - }.bind(this))); - }.bind(this)); - }, - - _remove: function() { - this.dispatcher.remove(); - }, - - _reloadSource: function(id) { - this.sources[id].reload(); - }, - - _updateSources: function(transform) { - for (var id in this.sources) { - this.sources[id].update(transform); - } - }, - - _redoPlacement: function() { - for (var id in this.sources) { - if (this.sources[id].redoPlacement) this.sources[id].redoPlacement(); - } - }, - - _forwardSourceEvent: function(e) { - this.fire('source.' + e.type, util.extend({source: e.target}, e)); - }, - - _forwardTileEvent: function(e) { - this.fire(e.type, util.extend({source: e.target}, e)); - }, - - // Callbacks from web workers - - 'get sprite json': function(params, callback) { - var sprite = this.sprite; - if (sprite.loaded()) { - callback(null, { sprite: sprite.data, retina: sprite.retina }); - } else { - sprite.on('load', function() { - callback(null, { sprite: sprite.data, retina: sprite.retina }); - }); - } - }, - - 'get icons': function(params, callback) { - var sprite = this.sprite; - var spriteAtlas = this.spriteAtlas; - if (sprite.loaded()) { - spriteAtlas.setSprite(sprite); - spriteAtlas.addIcons(params.icons, callback); - } else { - sprite.on('load', function() { - spriteAtlas.setSprite(sprite); - spriteAtlas.addIcons(params.icons, callback); - }); - } - }, - - 'get glyphs': function(params, callback) { - this.glyphSource.getSimpleGlyphs(params.fontstack, params.codepoints, params.uid, callback); - } -}); - -},{"../render/line_atlas":33,"../symbol/glyph_atlas":67,"../symbol/glyph_source":68,"../symbol/sprite_atlas":74,"../util/ajax":91,"../util/browser":92,"../util/dispatcher":94,"../util/evented":97,"../util/mapbox":100,"../util/util":103,"./animation_loop":47,"./image_sprite":48,"./style_batch":53,"./style_layer":57,"mapbox-gl-style-spec/lib/validate/latest":127}],53:[function(require,module,exports){ -'use strict'; - -var Source = require('../source/source'); -var StyleLayer = require('./style_layer'); - -function styleBatch(style, work) { - if (!style._loaded) { - throw new Error('Style is not done loading'); - } - - var batch = Object.create(styleBatch.prototype); - - batch._style = style; - batch._groupLayers = false; - batch._broadcastLayers = false; - batch._reloadSources = {}; - batch._events = []; - batch._change = false; - - work(batch); - - if (batch._groupLayers) { - batch._style._groupLayers(); - } - - if (batch._broadcastLayers) { - batch._style._broadcastLayers(); - } - - Object.keys(batch._reloadSources).forEach(function(sourceId) { - batch._style._reloadSource(sourceId); - }); - - batch._events.forEach(function(args) { - batch._style.fire.apply(batch._style, args); - }); - - if (batch._change) { - batch._style.fire('change'); - } -} - -styleBatch.prototype = { - - addLayer: function(layer, before) { - if (this._style._layers[layer.id] !== undefined) { - throw new Error('There is already a layer with this ID'); - } - if (!(layer instanceof StyleLayer)) { - layer = new StyleLayer(layer, this._style.stylesheet.constants || {}); - } - this._style._layers[layer.id] = layer; - this._style._order.splice(before ? this._style._order.indexOf(before) : Infinity, 0, layer.id); - layer.resolveLayout(); - layer.resolveReference(this._style._layers); - layer.resolvePaint(); - - this._groupLayers = true; - this._broadcastLayers = true; - if (layer.source) { - this._reloadSources[layer.source] = true; - } - this._events.push(['layer.add', {layer: layer}]); - this._change = true; - - return this; - }, - - removeLayer: function(id) { - var layer = this._style._layers[id]; - if (layer === undefined) { - throw new Error('There is no layer with this ID'); - } - for (var i in this._style._layers) { - if (this._style._layers[i].ref === id) { - this.removeLayer(i); - } - } - delete this._style._layers[id]; - this._style._order.splice(this._style._order.indexOf(id), 1); - - this._groupLayers = true; - this._broadcastLayers = true; - this._events.push(['layer.remove', {layer: layer}]); - this._change = true; - - return this; - }, - - setPaintProperty: function(layer, name, value, klass) { - this._style.getLayer(layer).setPaintProperty(name, value, klass); - this._change = true; - - return this; - }, - - setLayoutProperty: function(layer, name, value) { - layer = this._style.getReferentLayer(layer); - layer.setLayoutProperty(name, value); - - this._broadcastLayers = true; - if (layer.source) { - this._reloadSources[layer.source] = true; - } - this._change = true; - - return this; - }, - - setFilter: function(layer, filter) { - layer = this._style.getReferentLayer(layer); - layer.filter = filter; - - this._broadcastLayers = true; - if (layer.source) { - this._reloadSources[layer.source] = true; - } - this._change = true; - - return this; - }, - - setLayerZoomRange: function(layerId, minzoom, maxzoom) { - var layer = this._style.getReferentLayer(layerId); - if (minzoom != null) { - layer.minzoom = minzoom; - } - if (maxzoom != null) { - layer.maxzoom = maxzoom; - } - - this._broadcastLayers = true; - if (layer.source) { - this._reloadSources[layer.source] = true; - } - this._change = true; - - return this; - }, - - addSource: function(id, source) { - if (!this._style._loaded) { - throw new Error('Style is not done loading'); - } - if (this._style.sources[id] !== undefined) { - throw new Error('There is already a source with this ID'); - } - source = Source.create(source); - this._style.sources[id] = source; - source.id = id; - source.style = this._style; - source.dispatcher = this._style.dispatcher; - source.glyphAtlas = this._style.glyphAtlas; - source - .on('load', this._style._forwardSourceEvent) - .on('error', this._style._forwardSourceEvent) - .on('change', this._style._forwardSourceEvent) - .on('tile.add', this._style._forwardTileEvent) - .on('tile.load', this._style._forwardTileEvent) - .on('tile.error', this._style._forwardTileEvent) - .on('tile.remove', this._style._forwardTileEvent); - - this._events.push(['source.add', {source: source}]); - this._change = true; - - return this; - }, - - removeSource: function(id) { - if (this._style.sources[id] === undefined) { - throw new Error('There is no source with this ID'); - } - var source = this._style.sources[id]; - delete this._style.sources[id]; - source - .off('load', this._style._forwardSourceEvent) - .off('error', this._style._forwardSourceEvent) - .off('change', this._style._forwardSourceEvent) - .off('tile.add', this._style._forwardTileEvent) - .off('tile.load', this._style._forwardTileEvent) - .off('tile.error', this._style._forwardTileEvent) - .off('tile.remove', this._style._forwardTileEvent); - - this._events.push(['source.remove', {source: source}]); - this._change = true; - - return this; - } -}; - -module.exports = styleBatch; - -},{"../source/source":39,"./style_layer":57}],54:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); - -exports.resolve = function(value, constants) { - function resolve(value) { - return typeof value === 'string' && value[0] === '@' ? constants[value] : value; - } - - var i; - - value = resolve(value); - - if (Array.isArray(value)) { - value = value.slice(); - - for (i = 0; i < value.length; i++) { - if (value[i] in constants) { - value[i] = resolve(value[i]); - } - } - } - - if (value.stops) { - value = util.extend({}, value); - value.stops = value.stops.slice(); - - for (i = 0; i < value.stops.length; i++) { - if (value.stops[i][1] in constants) { - value.stops[i] = [ - value.stops[i][0], - resolve(value.stops[i][1]) - ]; - } - } - } - - return value; -}; - -exports.resolveAll = function (properties, constants) { - if (!constants) - return properties; - - var result = {}; - - for (var key in properties) { - result[key] = exports.resolve(properties[key], constants); - } - - return result; -}; - -},{"../util/util":103}],55:[function(require,module,exports){ -'use strict'; - -var parseCSSColor = require('csscolorparser').parseCSSColor; -var mapboxGLFunction = require('mapbox-gl-function'); -var util = require('../util/util'); - -module.exports = StyleDeclaration; - -function StyleDeclaration(reference, value) { - this.type = reference.type; - this.transitionable = reference.transition; - - // immutable representation of value. used for comparison - this.json = JSON.stringify(value); - - if (this.type !== 'color') { - this.value = value; - } else if (value.stops) { - this.value = prepareColorFunction(value); - } else { - this.value = parseColor(value); - } - - if (reference.function === 'interpolated') { - this.calculate = mapboxGLFunction.interpolated(this.value); - } else { - this.calculate = mapboxGLFunction['piecewise-constant'](this.value); - if (reference.transition) { - this.calculate = transitioned(this.calculate); - } - } -} - -function transitioned(calculate) { - return function(z, zh, duration) { - var fraction = z % 1; - var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1); - var fromScale = 1; - var toScale = 1; - var mix, from, to; - - if (z > zh.lastIntegerZoom) { - mix = fraction + (1 - fraction) * t; - fromScale *= 2; - from = calculate(z - 1); - to = calculate(z); - } else { - mix = 1 - (1 - t) * fraction; - to = calculate(z); - from = calculate(z + 1); - fromScale /= 2; - } - - return { - from: from, - fromScale: fromScale, - to: to, - toScale: toScale, - t: mix - }; - }; -} - -var colorCache = {}; - -function parseColor(value) { - if (colorCache[value]) return colorCache[value]; - var color = prepareColor(parseCSSColor(value)); - colorCache[value] = color; - return color; -} - -function prepareColor(c) { - return [c[0] / 255, c[1] / 255, c[2] / 255, c[3] / 1]; -} - -function prepareColorFunction(f) { - return util.extend({}, f, {stops: f.stops.map(function(stop) { - return [stop[0], parseColor(stop[1])]; - })}); -} - -},{"../util/util":103,"csscolorparser":108,"mapbox-gl-function":126}],56:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var reference = require('./reference'); -var StyleConstant = require('./style_constant'); -var StyleDeclaration = require('./style_declaration'); - -var lookup = { - paint: {}, - layout: {} -}; - -reference.layer.type.values.forEach(function(type) { - lookup.paint[type] = makeConstructor(reference['paint_' + type]); - lookup.layout[type] = makeConstructor(reference['layout_' + type]); -}); - -function makeConstructor(reference) { - function StyleDeclarationSet(properties, constants) { - this._values = {}; - this._transitions = {}; - - this._constants = constants; - - for (var k in properties) { - this[k] = StyleConstant.resolve(properties[k], this._constants); - } - } - - Object.keys(reference).forEach(function(k) { - var property = reference[k]; - - Object.defineProperty(StyleDeclarationSet.prototype, k, { - set: function(v) { - this._values[k] = new StyleDeclaration(property, StyleConstant.resolve(v, this._constants)); - }, - get: function() { - return this._values[k].value; - } - }); - - if (property.transition) { - Object.defineProperty(StyleDeclarationSet.prototype, k + '-transition', { - set: function(v) { - this._transitions[k] = v; - }, - get: function() { - return this._transitions[k]; - } - }); - } - }); - - StyleDeclarationSet.prototype.values = function() { - return this._values; - }; - - StyleDeclarationSet.prototype.transition = function(k, global) { - var t = this._transitions[k] || {}; - return { - duration: util.coalesce(t.duration, global.duration, 300), - delay: util.coalesce(t.delay, global.delay, 0) - }; - }; - - StyleDeclarationSet.prototype.json = function() { - var result = {}; - - for (var v in this._values) { - result[v] = this._values[v].value; - } - - for (var t in this._transitions) { - result[t + '-transition'] = this._transitions[v]; - } - - return result; - }; - - return StyleDeclarationSet; -} - -module.exports = function(renderType, layerType, properties, constants) { - return new lookup[renderType][layerType](properties, constants); -}; - -},{"../util/util":103,"./reference":51,"./style_constant":54,"./style_declaration":55}],57:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var StyleConstant = require('./style_constant'); -var StyleTransition = require('./style_transition'); -var StyleDeclarationSet = require('./style_declaration_set'); -var LayoutProperties = require('./layout_properties'); -var PaintProperties = require('./paint_properties'); - -module.exports = StyleLayer; - -function StyleLayer(layer, constants) { - this._layer = layer; - this._constants = constants; - - this.id = layer.id; - this.ref = layer.ref; - - // Resolved and cascaded paint properties. - this._resolved = {}; // class name -> StyleDeclarationSet - this._cascaded = {}; // property name -> StyleTransition - - this.assign(layer); -} - -StyleLayer.prototype = { - resolveLayout: function() { - if (!this.ref) { - this.layout = new LayoutProperties[this.type]( - StyleConstant.resolveAll(this._layer.layout, this._constants)); - - if (this.layout['symbol-placement'] === 'line') { - if (!this.layout.hasOwnProperty('text-rotation-alignment')) { - this.layout['text-rotation-alignment'] = 'map'; - } - if (!this.layout.hasOwnProperty('icon-rotation-alignment')) { - this.layout['icon-rotation-alignment'] = 'map'; - } - this.layout['symbol-avoid-edges'] = true; - } - } - }, - - setLayoutProperty: function(name, value) { - this.layout[name] = StyleConstant.resolve(value, this._constants); - }, - - getLayoutProperty: function(name) { - return this.layout[name]; - }, - - resolveReference: function(layers) { - if (this.ref) { - this.assign(layers[this.ref]); - } - }, - - resolvePaint: function() { - for (var p in this._layer) { - var match = p.match(/^paint(?:\.(.*))?$/); - if (!match) - continue; - this._resolved[match[1] || ''] = - new StyleDeclarationSet('paint', this.type, this._layer[p], this._constants); - } - }, - - setPaintProperty: function(name, value, klass) { - var declarations = this._resolved[klass || '']; - if (!declarations) { - declarations = this._resolved[klass || ''] = - new StyleDeclarationSet('paint', this.type, {}, this._constants); - } - declarations[name] = value; - }, - - getPaintProperty: function(name, klass) { - var declarations = this._resolved[klass || '']; - if (!declarations) - return undefined; - return declarations[name]; - }, - - cascade: function(classes, options, globalTrans, animationLoop) { - for (var klass in this._resolved) { - if (klass !== "" && !classes[klass]) - continue; - - var declarations = this._resolved[klass], - values = declarations.values(); - - for (var k in values) { - var newDeclaration = values[k]; - var oldTransition = options.transition ? this._cascaded[k] : undefined; - - // Only create a new transition if the declaration changed - if (!oldTransition || oldTransition.declaration.json !== newDeclaration.json) { - var newStyleTrans = declarations.transition(k, globalTrans); - var newTransition = this._cascaded[k] = - new StyleTransition(newDeclaration, oldTransition, newStyleTrans); - - // Run the animation loop until the end of the transition - if (!newTransition.instant()) { - newTransition.loopID = animationLoop.set(newTransition.endTime - (new Date()).getTime()); - } - - if (oldTransition) { - animationLoop.cancel(oldTransition.loopID); - } - } - } - } - }, - - recalculate: function(z, zoomHistory) { - var type = this.type, - calculated = this.paint = new PaintProperties[type](); - - for (var k in this._cascaded) { - calculated[k] = this._cascaded[k].at(z, zoomHistory); - } - - this.hidden = (this.minzoom && z < this.minzoom) || - (this.maxzoom && z >= this.maxzoom) || - // include visibility check for non-bucketed background layers - (this.layout.visibility === 'none'); - - if (type === 'symbol') { - if ((calculated['text-opacity'] === 0 || !this.layout['text-field']) && - (calculated['icon-opacity'] === 0 || !this.layout['icon-image'])) { - this.hidden = true; - } else { - premultiplyLayer(calculated, 'text'); - premultiplyLayer(calculated, 'icon'); - } - - } else if (calculated[type + '-opacity'] === 0) { - this.hidden = true; - } else { - premultiplyLayer(calculated, type); - } - - if (this._cascaded['line-dasharray']) { - // If the line is dashed, scale the dash lengths by the line - // width at the previous round zoom level. - var dashArray = calculated['line-dasharray']; - var lineWidth = this._cascaded['line-width'] ? - this._cascaded['line-width'].at(Math.floor(z), Infinity) : - calculated['line-width']; - - dashArray.fromScale *= lineWidth; - dashArray.toScale *= lineWidth; - } - - return !this.hidden; - }, - - assign: function(layer) { - util.extend(this, util.pick(layer, - ['type', 'source', 'source-layer', - 'minzoom', 'maxzoom', 'filter', - 'layout'])); - }, - - json: function() { - return util.extend({}, - this._layer, - util.pick(this, - ['type', 'source', 'source-layer', - 'minzoom', 'maxzoom', 'filter', - 'layout', 'paint'])); - } -}; - -function premultiplyLayer(layer, type) { - var colorProp = type + '-color', - haloProp = type + '-halo-color', - outlineProp = type + '-outline-color', - color = layer[colorProp], - haloColor = layer[haloProp], - outlineColor = layer[outlineProp], - opacity = layer[type + '-opacity']; - - var colorOpacity = color && (opacity * color[3]); - var haloOpacity = haloColor && (opacity * haloColor[3]); - var outlineOpacity = outlineColor && (opacity * outlineColor[3]); - - if (colorOpacity !== undefined && colorOpacity < 1) { - layer[colorProp] = util.premultiply([color[0], color[1], color[2], colorOpacity]); - } - if (haloOpacity !== undefined && haloOpacity < 1) { - layer[haloProp] = util.premultiply([haloColor[0], haloColor[1], haloColor[2], haloOpacity]); - } - if (outlineOpacity !== undefined && outlineOpacity < 1) { - layer[outlineProp] = util.premultiply([outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity]); - } -} - -},{"../util/util":103,"./layout_properties":49,"./paint_properties":50,"./style_constant":54,"./style_declaration_set":56,"./style_transition":58}],58:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var interpolate = require('../util/interpolate'); - -module.exports = StyleTransition; - -/* - * Represents a transition between two declarations - */ -function StyleTransition(declaration, oldTransition, value) { - - this.declaration = declaration; - this.startTime = this.endTime = (new Date()).getTime(); - - var type = declaration.type; - if ((type === 'string' || type === 'array') && declaration.transitionable) { - this.interp = interpZoomTransitioned; - } else { - this.interp = interpolate[type]; - } - - this.oldTransition = oldTransition; - this.duration = value.duration || 0; - this.delay = value.delay || 0; - - if (!this.instant()) { - this.endTime = this.startTime + this.duration + this.delay; - this.ease = util.easeCubicInOut; - } - - if (oldTransition && oldTransition.endTime <= this.startTime) { - // Old transition is done running, so we can - // delete its reference to its old transition. - - delete oldTransition.oldTransition; - } -} - -StyleTransition.prototype.instant = function() { - return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0); -}; - -/* - * Return the value of the transitioning property at zoom level `z` and optional time `t` - */ -StyleTransition.prototype.at = function(z, zoomHistory, t) { - - var value = this.declaration.calculate(z, zoomHistory, this.duration); - - if (this.instant()) return value; - - t = t || Date.now(); - - if (t < this.endTime) { - var oldValue = this.oldTransition.at(z, zoomHistory, this.startTime); - var eased = this.ease((t - this.startTime - this.delay) / this.duration); - value = this.interp(oldValue, value, eased); - } - - return value; - -}; - -function interpZoomTransitioned(from, to, t) { - return { - from: from.to, - fromScale: from.toScale, - to: to.to, - toScale: to.toScale, - t: t - }; -} - -},{"../util/interpolate":99,"../util/util":103}],59:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); - -module.exports = Anchor; - -function Anchor(x, y, angle, segment) { - this.x = x; - this.y = y; - this.angle = angle; - - if (segment !== undefined) { - this.segment = segment; - } -} - -Anchor.prototype = Object.create(Point.prototype); - -Anchor.prototype.clone = function() { - return new Anchor(this.x, this.y, this.angle, this.segment); -}; - -},{"point-geometry":134}],60:[function(require,module,exports){ -'use strict'; - -module.exports = BinPack; -function BinPack(width, height) { - this.width = width; - this.height = height; - this.free = [{ x: 0, y: 0, w: width, h: height }]; -} - -/** - * Simple algorithm to recursively merge the newly released cell with its - * neighbor. This doesn't merge more than two cells at a time, and fails - * for complicated merges. - * @private - */ -BinPack.prototype.release = function(rect) { - for (var i = 0; i < this.free.length; i++) { - var free = this.free[i]; - - if (free.y === rect.y && free.h === rect.h && free.x + free.w === rect.x) { - free.w += rect.w; - - } else if (free.x === rect.x && free.w === rect.w && free.y + free.h === rect.y) { - free.h += rect.h; - - } else if (rect.y === free.y && rect.h === free.h && rect.x + rect.w === free.x) { - free.x = rect.x; - free.w += rect.w; - - } else if (rect.x === free.x && rect.w === free.w && rect.y + rect.h === free.y) { - free.y = rect.y; - free.h += rect.h; - - } else continue; - - this.free.splice(i, 1); - this.release(free); - return; - - } - this.free.push(rect); -}; - -BinPack.prototype.allocate = function(width, height) { - // Find the smallest free rect angle - var rect = { x: Infinity, y: Infinity, w: Infinity, h: Infinity }; - var smallest = -1; - for (var i = 0; i < this.free.length; i++) { - var ref = this.free[i]; - if (width <= ref.w && height <= ref.h && ref.y <= rect.y && ref.x <= rect.x) { - rect = ref; - smallest = i; - } - } - - if (smallest < 0) { - // There's no space left for this char. - return { x: -1, y: -1 }; - } - - this.free.splice(smallest, 1); - - // Shorter/Longer Axis Split Rule (SAS) - // http://clb.demon.fi/files/RectangleBinPack.pdf p. 15 - // Ignore the dimension of R and just split long the shorter dimension - // See Also: http://www.cs.princeton.edu/~chazelle/pubs/blbinpacking.pdf - if (rect.w < rect.h) { - // split horizontally - // +--+---+ - // |__|___| <-- b1 - // +------+ <-- b2 - if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: height }); - if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: rect.w, h: rect.h - height }); - } else { - // split vertically - // +--+---+ - // |__| | <-- b1 - // +--|---+ <-- b2 - if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: rect.h }); - if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: width, h: rect.h - height }); - } - - return { x: rect.x, y: rect.y, w: width, h: height }; -}; - -},{}],61:[function(require,module,exports){ -'use strict'; - -module.exports = checkMaxAngle; - -/** - * Labels placed around really sharp angles aren't readable. Check if any - * part of the potential label has a combined angle that is too big. - * - * @param {Array} line - * @param {Anchor} anchor The point on the line around which the label is anchored. - * @param {number} labelLength The length of the label in geometry units. - * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. - * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have. - * - * @returns {boolean} whether the label should be placed - * @private - */ -function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) { - - // horizontal labels always pass - if (anchor.segment === undefined) return true; - - var p = anchor; - var index = anchor.segment + 1; - var anchorDistance = 0; - - // move backwards along the line to the first segment the label appears on - while (anchorDistance > -labelLength / 2) { - index--; - - // there isn't enough room for the label after the beginning of the line - if (index < 0) return false; - - anchorDistance -= line[index].dist(p); - p = line[index]; - } - - anchorDistance += line[index].dist(line[index + 1]); - index++; - - // store recent corners and their total angle difference - var recentCorners = []; - var recentAngleDelta = 0; - - // move forwards by the length of the label and check angles along the way - while (anchorDistance < labelLength / 2) { - var prev = line[index - 1]; - var current = line[index]; - var next = line[index + 1]; - - // there isn't enough room for the label before the end of the line - if (!next) return false; - - var angleDelta = prev.angleTo(current) - current.angleTo(next); - // restrict angle to -pi..pi range - angleDelta = ((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI; - - recentCorners.push({ - distance: anchorDistance, - angleDelta: angleDelta - }); - recentAngleDelta += angleDelta; - - // remove corners that are far enough away from the list of recent anchors - while (anchorDistance - recentCorners[0].distance > windowSize) { - recentAngleDelta -= recentCorners.shift().angleDelta; - } - - // the sum of angles within the window area exceeds the maximum allowed value. check fails. - if (Math.abs(recentAngleDelta) > maxAngle) return false; - - index++; - anchorDistance += current.dist(next); - } - - // no part of the line had an angle greater than the maximum allowed. check passes. - return true; -} - -},{}],62:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); - -module.exports = clipLine; - -/** - * Returns the part of a multiline that intersects with the provided rectangular box. - * - * @param {Array>} lines - * @param {number} x1 the left edge of the box - * @param {number} y1 the top edge of the box - * @param {number} x2 the right edge of the box - * @param {number} y2 the bottom edge of the box - * @returns {Array>} lines - * @private - */ -function clipLine(lines, x1, y1, x2, y2) { - var clippedLines = []; - - for (var l = 0; l < lines.length; l++) { - var line = lines[l]; - var clippedLine; - - for (var i = 0; i < line.length - 1; i++) { - var p0 = line[i]; - var p1 = line[i + 1]; - - - if (p0.x < x1 && p1.x < x1) { - continue; - } else if (p0.x < x1) { - p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x))); - } else if (p1.x < x1) { - p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x))); - } - - if (p0.y < y1 && p1.y < y1) { - continue; - } else if (p0.y < y1) { - p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1); - } else if (p1.y < y1) { - p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1); - } - - if (p0.x >= x2 && p1.x >= x2) { - continue; - } else if (p0.x >= x2) { - p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x))); - } else if (p1.x >= x2) { - p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x))); - } - - if (p0.y >= y2 && p1.y >= y2) { - continue; - } else if (p0.y >= y2) { - p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2); - } else if (p1.y >= y2) { - p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2); - } - - if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { - clippedLine = [p0]; - clippedLines.push(clippedLine); - } - - clippedLine.push(p1); - } - } - - return clippedLines; -} - -},{"point-geometry":134}],63:[function(require,module,exports){ -'use strict'; - -module.exports = CollisionBox; - -/** - * A collision box represents an area of the map that that is covered by a - * label. CollisionFeature uses one or more of these collision boxes to - * represent all the area covered by a single label. They are used to - * prevent collisions between labels. - * - * A collision box actually represents a 3d volume. The first two dimensions, - * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`. - * The third dimension, zoom, is limited by `maxScale` which determines - * how far in the z dimensions the box extends. - * - * As you zoom in on a map, all points on the map get further and further apart - * but labels stay roughly the same size. Labels cover less real world area on - * the map at higher zoom levels than they do at lower zoom levels. This is why - * areas are are represented with an anchor point and offsets from that point - * instead of just using four absolute points. - * - * Line labels are represented by a set of these boxes spaced out along a line. - * When you zoom in, line labels cover less real world distance along the line - * than they used to. Collision boxes near the edges that used to cover label - * no longer do. If a box doesn't cover the label anymore it should be ignored - * when doing collision checks. `maxScale` is how much you can scale the map - * before the label isn't within the box anymore. - * For example - * lower zoom: - * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png - * slightly higher zoom: - * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png - * In the zoomed in image the two grey boxes on either side don't cover the - * label anymore. Their maxScale is smaller than the current scale. - * - * - * @class CollisionBox - * @param {Point} anchorPoint The anchor point the box is centered around. - * @param {number} x1 The distance from the anchor to the left edge. - * @param {number} y1 The distance from the anchor to the top edge. - * @param {number} x2 The distance from the anchor to the right edge. - * @param {number} y2 The distance from the anchor to the bottom edge. - * @param {number} maxScale The maximum scale this box can block other boxes at. - * @private - */ -function CollisionBox(anchorPoint, x1, y1, x2, y2, maxScale) { - // the box is centered around the anchor point - this.anchorPoint = anchorPoint; - - // distances to the edges from the anchor - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; - - // the box is only valid for scales < maxScale. - // The box does not block other boxes at scales >= maxScale; - this.maxScale = maxScale; - - // the scale at which the label can first be shown - this.placementScale = 0; - - // rotated and scaled bbox used for indexing - this[0] = this[1] = this[2] = this[3] = 0; -} - -},{}],64:[function(require,module,exports){ -'use strict'; - -var CollisionBox = require('./collision_box'); -var Point = require('point-geometry'); - -module.exports = CollisionFeature; - -/** - * A CollisionFeature represents the area of the tile covered by a single label. - * It is used with CollisionTile to check if the label overlaps with any - * previous labels. A CollisionFeature is mostly just a set of CollisionBox - * objects. - * - * @class CollisionFeature - * @param {Array} line The geometry the label is placed on. - * @param {Anchor} anchor The point along the line around which the label is anchored. - * @param {Object} shaped The text or icon shaping results. - * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units. - * @param {number} padding The amount of padding to add around the label edges. - * @param {boolean} alignLine Whether the label is aligned with the line or the viewport. - * - * @private - */ -function CollisionFeature(line, anchor, shaped, boxScale, padding, alignLine) { - - var y1 = shaped.top * boxScale - padding; - var y2 = shaped.bottom * boxScale + padding; - var x1 = shaped.left * boxScale - padding; - var x2 = shaped.right * boxScale + padding; - - this.boxes = []; - - if (alignLine) { - - var height = y2 - y1; - var length = x2 - x1; - - if (height <= 0) return; - - // set minimum box height to avoid very many small labels - height = Math.max(10 * boxScale, height); - - this._addLineCollisionBoxes(line, anchor, length, height); - - } else { - this.boxes.push(new CollisionBox(new Point(anchor.x, anchor.y), x1, y1, x2, y2, Infinity)); - } -} - -/** - * Create a set of CollisionBox objects for a line. - * - * @param {Array} line - * @param {Anchor} anchor - * @param {number} labelLength The length of the label in geometry units. - * @param {number} boxSize The size of the collision boxes that will be created. - * - * @private - */ -CollisionFeature.prototype._addLineCollisionBoxes = function(line, anchor, labelLength, boxSize) { - var step = boxSize / 2; - var nBoxes = Math.floor(labelLength / step); - - // offset the center of the first box by half a box so that the edge of the - // box is at the edge of the label. - var firstBoxOffset = -boxSize / 2; - - var bboxes = this.boxes; - - var p = anchor; - var index = anchor.segment + 1; - var anchorDistance = firstBoxOffset; - - // move backwards along the line to the first segment the label appears on - do { - index--; - - // there isn't enough room for the label after the beginning of the line - // checkMaxAngle should have already caught this - if (index < 0) return bboxes; - - anchorDistance -= line[index].dist(p); - p = line[index]; - } while (anchorDistance > -labelLength / 2); - - var segmentLength = line[index].dist(line[index + 1]); - - for (var i = 0; i < nBoxes; i++) { - // the distance the box will be from the anchor - var boxDistanceToAnchor = -labelLength / 2 + i * step; - - // the box is not on the current segment. Move to the next segment. - while (anchorDistance + segmentLength < boxDistanceToAnchor) { - anchorDistance += segmentLength; - index++; - - // There isn't enough room before the end of the line. - if (index + 1 >= line.length) return bboxes; - - segmentLength = line[index].dist(line[index + 1]); - } - - // the distance the box will be from the beginning of the segment - var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; - - var p0 = line[index]; - var p1 = line[index + 1]; - var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0); - - var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0); - var maxScale = labelLength / 2 / distanceToInnerEdge; - - bboxes.push(new CollisionBox(boxAnchorPoint, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale)); - } - - return bboxes; -}; - -},{"./collision_box":63,"point-geometry":134}],65:[function(require,module,exports){ -'use strict'; - -var rbush = require('rbush'); - -module.exports = CollisionTile; - -/** - * A collision tile used to prevent symbols from overlapping. It keep tracks of - * where previous symbols have been placed and is used to check if a new - * symbol overlaps with any previously added symbols. - * - * @class CollisionTile - * @param {number} angle - * @param {number} pitch - * @private - */ -function CollisionTile(angle, pitch) { - this.tree = rbush(); - this.angle = angle; - - var sin = Math.sin(angle), - cos = Math.cos(angle); - this.rotationMatrix = [cos, -sin, sin, cos]; - - // Stretch boxes in y direction to account for the map tilt. - this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI); - - // The amount the map is squished depends on the y position. - // Sort of account for this by making all boxes a bit bigger. - this.yStretch = Math.pow(this.yStretch, 1.3); -} - -CollisionTile.prototype.minScale = 0.25; -CollisionTile.prototype.maxScale = 2; - - -/** - * Find the scale at which the collisionFeature can be shown without - * overlapping with other features. - * - * @param {CollisionFeature} collisionFeature - * @returns {number} placementScale - * @private - */ -CollisionTile.prototype.placeCollisionFeature = function(collisionFeature) { - - var minPlacementScale = this.minScale; - var rotationMatrix = this.rotationMatrix; - var yStretch = this.yStretch; - - for (var b = 0; b < collisionFeature.boxes.length; b++) { - - var box = collisionFeature.boxes[b]; - - var anchorPoint = box.anchorPoint.matMult(rotationMatrix); - var x = anchorPoint.x; - var y = anchorPoint.y; - - box[0] = x + box.x1; - box[1] = y + box.y1 * yStretch; - box[2] = x + box.x2; - box[3] = y + box.y2 * yStretch; - - var blockingBoxes = this.tree.search(box); - - for (var i = 0; i < blockingBoxes.length; i++) { - var blocking = blockingBoxes[i]; - var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix); - - // Find the lowest scale at which the two boxes can fit side by side without overlapping. - // Original algorithm: - var s1 = (blocking.x1 - box.x2) / (x - blockingAnchorPoint.x); // scale at which new box is to the left of old box - var s2 = (blocking.x2 - box.x1) / (x - blockingAnchorPoint.x); // scale at which new box is to the right of old box - var s3 = (blocking.y1 - box.y2) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the top of old box - var s4 = (blocking.y2 - box.y1) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the bottom of old box - - if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1; - if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1; - - var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4)); - - if (collisionFreeScale > blocking.maxScale) { - // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it, - // so unblock the new box at the scale that the old box disappears. - collisionFreeScale = blocking.maxScale; - } - - if (collisionFreeScale > box.maxScale) { - // If the box can only be shown after it is visible, then the box can never be shown. - // But the label can be shown after this box is not visible. - collisionFreeScale = box.maxScale; - } - - if (collisionFreeScale > minPlacementScale && - collisionFreeScale >= blocking.placementScale) { - // If this collision occurs at a lower scale than previously found collisions - // and the collision occurs while the other label is visible - - // this this is the lowest scale at which the label won't collide with anything - minPlacementScale = collisionFreeScale; - } - - if (minPlacementScale >= this.maxScale) return minPlacementScale; - } - } - - return minPlacementScale; -}; - -/** - * Remember this collisionFeature and what scale it was placed at to block - * later features from overlapping with it. - * - * @param {CollisionFeature} collisionFeature - * @param {number} minPlacementScale - * @private - */ -CollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale) { - - var boxes = collisionFeature.boxes; - for (var k = 0; k < boxes.length; k++) { - boxes[k].placementScale = minPlacementScale; - } - - if (minPlacementScale < this.maxScale) { - this.tree.load(boxes); - } -}; - -},{"rbush":135}],66:[function(require,module,exports){ -'use strict'; - -var interpolate = require('../util/interpolate'); -var Anchor = require('../symbol/anchor'); -var checkMaxAngle = require('./check_max_angle'); - -module.exports = getAnchors; - -function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling) { - - // Resample a line to get anchor points for labels and check that each - // potential label passes text-max-angle check and has enough froom to fit - // on the line. - - var angleWindowSize = shapedText ? - 3 / 5 * glyphSize * boxScale : - 0; - - var labelLength = Math.max( - shapedText ? shapedText.right - shapedText.left : 0, - shapedIcon ? shapedIcon.right - shapedIcon.left : 0); - - // Is the line continued from outside the tile boundary? - if (line[0].x === 0 || line[0].x === 4096 || line[0].y === 0 || line[0].y === 4096) { - var continuedLine = true; - } - - // Is the label long, relative to the spacing? - // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. - if (spacing - labelLength * boxScale < spacing / 4) { - spacing = labelLength * boxScale + spacing / 4; - } - - // Offset the first anchor by: - // Either half the label length plus a fixed extra offset if the line is not continued - // Or half the spacing if the line is continued. - - // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. - var fixedExtraOffset = glyphSize * 2; - - var offset = !continuedLine ? - ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : - (spacing / 2 * overscaling) % spacing; - - return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, continuedLine, false); -} - - -function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, placeAtMiddle) { - - var distance = 0, - markedDistance = offset - spacing; - - var anchors = []; - - for (var i = 0; i < line.length - 1; i++) { - - var a = line[i], - b = line[i + 1]; - - var segmentDist = a.dist(b), - angle = b.angleTo(a); - - while (markedDistance + spacing < distance + segmentDist) { - markedDistance += spacing; - - var t = (markedDistance - distance) / segmentDist, - x = interpolate(a.x, b.x, t), - y = interpolate(a.y, b.y, t); - - if (x >= 0 && x < 4096 && y >= 0 && y < 4096) { - x = Math.round(x); - y = Math.round(y); - var anchor = new Anchor(x, y, angle, i); - - if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { - anchors.push(anchor); - } - } - } - - distance += segmentDist; - } - - if (!placeAtMiddle && !anchors.length && !continuedLine) { - // The first attempt at finding anchors at which labels can be placed failed. - // Try again, but this time just try placing one anchor at the middle of the line. - // This has the most effect for short lines in overscaled tiles, since the - // initial offset used in overscaled tiles is calculated to align labels with positions in - // parent tiles instead of placing the label as close to the beginning as possible. - anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, true); - } - - return anchors; -} - -},{"../symbol/anchor":59,"../util/interpolate":99,"./check_max_angle":61}],67:[function(require,module,exports){ -'use strict'; - -var BinPack = require('./bin_pack'); - -module.exports = GlyphAtlas; -function GlyphAtlas(width, height) { - this.width = width; - this.height = height; - - this.bin = new BinPack(width, height); - this.index = {}; - this.ids = {}; - this.data = new Uint8Array(width * height); -} - -GlyphAtlas.prototype = { - get debug() { - return 'canvas' in this; - }, - set debug(value) { - if (value && !this.canvas) { - this.canvas = document.createElement('canvas'); - this.canvas.width = this.width; - this.canvas.height = this.height; - document.body.appendChild(this.canvas); - this.ctx = this.canvas.getContext('2d'); - } else if (!value && this.canvas) { - this.canvas.parentNode.removeChild(this.canvas); - delete this.ctx; - delete this.canvas; - } - } -}; - -GlyphAtlas.prototype.getGlyphs = function() { - var glyphs = {}, - split, - name, - id; - - for (var key in this.ids) { - split = key.split('#'); - name = split[0]; - id = split[1]; - - if (!glyphs[name]) glyphs[name] = []; - glyphs[name].push(id); - } - - return glyphs; -}; - -GlyphAtlas.prototype.getRects = function() { - var rects = {}, - split, - name, - id; - - for (var key in this.ids) { - split = key.split('#'); - name = split[0]; - id = split[1]; - - if (!rects[name]) rects[name] = {}; - rects[name][id] = this.index[key]; - } - - return rects; -}; - -GlyphAtlas.prototype.removeGlyphs = function(id) { - for (var key in this.ids) { - - var ids = this.ids[key]; - - var pos = ids.indexOf(id); - if (pos >= 0) ids.splice(pos, 1); - this.ids[key] = ids; - - if (!ids.length) { - var rect = this.index[key]; - - var target = this.data; - for (var y = 0; y < rect.h; y++) { - var y1 = this.width * (rect.y + y) + rect.x; - for (var x = 0; x < rect.w; x++) { - target[y1 + x] = 0; - } - } - - this.dirty = true; - - this.bin.release(rect); - - delete this.index[key]; - delete this.ids[key]; - } - } - - - this.updateTexture(this.gl); -}; - -GlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) { - if (!glyph) { - // console.warn('missing glyph', code, String.fromCharCode(code)); - return null; - } - var key = name + "#" + glyph.id; - - // The glyph is already in this texture. - if (this.index[key]) { - if (this.ids[key].indexOf(id) < 0) { - this.ids[key].push(id); - } - return this.index[key]; - } - - // The glyph bitmap has zero width. - if (!glyph.bitmap) { - return null; - } - - var bufferedWidth = glyph.width + buffer * 2; - var bufferedHeight = glyph.height + buffer * 2; - - // Add a 1px border around every image. - var padding = 1; - var packWidth = bufferedWidth + 2 * padding; - var packHeight = bufferedHeight + 2 * padding; - - // Increase to next number divisible by 4, but at least 1. - // This is so we can scale down the texture coordinates and pack them - // into 2 bytes rather than 4 bytes. - packWidth += (4 - packWidth % 4); - packHeight += (4 - packHeight % 4); - - var rect = this.bin.allocate(packWidth, packHeight); - if (rect.x < 0) { - console.warn('glyph bitmap overflow'); - return { glyph: glyph, rect: null }; - } - - this.index[key] = rect; - this.ids[key] = [id]; - - var target = this.data; - var source = glyph.bitmap; - for (var y = 0; y < bufferedHeight; y++) { - var y1 = this.width * (rect.y + y + padding) + rect.x + padding; - var y2 = bufferedWidth * y; - for (var x = 0; x < bufferedWidth; x++) { - target[y1 + x] = source[y2 + x]; - } - } - - this.dirty = true; - - return rect; -}; - -GlyphAtlas.prototype.bind = function(gl) { - this.gl = gl; - if (!this.texture) { - this.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null); - - } else { - gl.bindTexture(gl.TEXTURE_2D, this.texture); - } -}; - -GlyphAtlas.prototype.updateTexture = function(gl) { - this.bind(gl); - if (this.dirty) { - - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); - - // DEBUG - if (this.ctx) { - var data = this.ctx.getImageData(0, 0, this.width, this.height); - for (var i = 0, j = 0; i < this.data.length; i++, j += 4) { - data.data[j] = this.data[i]; - data.data[j + 1] = this.data[i]; - data.data[j + 2] = this.data[i]; - data.data[j + 3] = 255; - } - this.ctx.putImageData(data, 0, 0); - - this.ctx.strokeStyle = 'red'; - for (var k = 0; k < this.bin.free.length; k++) { - var free = this.bin.free[k]; - this.ctx.strokeRect(free.x, free.y, free.w, free.h); - } - } - // END DEBUG - - this.dirty = false; - } -}; - -},{"./bin_pack":60}],68:[function(require,module,exports){ -'use strict'; - -var normalizeURL = require('../util/mapbox').normalizeGlyphsURL; -var getArrayBuffer = require('../util/ajax').getArrayBuffer; -var Glyphs = require('../util/glyphs'); -var Protobuf = require('pbf'); - -module.exports = GlyphSource; - -/** - * A glyph source has a URL from which to load new glyphs and owns a GlyphAtlas - * that stores currently-loaded glyphs. - * - * @param {string} url glyph template url - * @param {Object} glyphAtlas glyph atlas object - * @private - */ -function GlyphSource(url, glyphAtlas) { - this.url = url && normalizeURL(url); - this.glyphAtlas = glyphAtlas; - this.stacks = []; - this.loading = {}; -} - -GlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) { - - if (this.stacks[fontstack] === undefined) this.stacks[fontstack] = {}; - - var glyphs = {}; - - var stack = this.stacks[fontstack]; - var glyphAtlas = this.glyphAtlas; - - // the number of pixels the sdf bitmaps are padded by - var buffer = 3; - - var missing = {}; - var remaining = 0; - var range; - - for (var i = 0; i < glyphIDs.length; i++) { - var glyphID = glyphIDs[i]; - range = Math.floor(glyphID / 256); - - if (stack[range]) { - var glyph = stack[range].glyphs[glyphID]; - var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer); - if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); - } else { - if (missing[range] === undefined) { - missing[range] = []; - remaining++; - } - missing[range].push(glyphID); - } - } - - if (!remaining) callback(undefined, glyphs); - - var onRangeLoaded = function(err, range, data) { - // TODO not be silent about errors - if (!err) { - var stack = this.stacks[fontstack][range] = data.stacks[0]; - for (var i = 0; i < missing[range].length; i++) { - var glyphID = missing[range][i]; - var glyph = stack.glyphs[glyphID]; - var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer); - if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); - } - } - remaining--; - if (!remaining) callback(undefined, glyphs); - }.bind(this); - - for (var r in missing) { - this.loadRange(fontstack, r, onRangeLoaded); - } -}; - -// A simplified representation of the glyph containing only the properties needed for shaping. -function SimpleGlyph(glyph, rect, buffer) { - var padding = 1; - this.advance = glyph.advance; - this.left = glyph.left - buffer - padding; - this.top = glyph.top + buffer + padding; - this.rect = rect; -} - -GlyphSource.prototype.loadRange = function(fontstack, range, callback) { - - if (range * 256 > 65535) return callback('gyphs > 65535 not supported'); - - if (this.loading[fontstack] === undefined) this.loading[fontstack] = {}; - var loading = this.loading[fontstack]; - - if (loading[range]) { - loading[range].push(callback); - } else { - loading[range] = [callback]; - - var rangeName = (range * 256) + '-' + (range * 256 + 255); - var url = glyphUrl(fontstack, rangeName, this.url); - - getArrayBuffer(url, function(err, data) { - var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data))); - for (var i = 0; i < loading[range].length; i++) { - loading[range][i](err, range, glyphs); - } - delete loading[range]; - }); - } -}; - -/** - * Use CNAME sharding to load a specific glyph range over a randomized - * but consistent subdomain. - * @param {string} fontstack comma-joined fonts - * @param {string} range comma-joined range - * @param {url} url templated url - * @param {string} [subdomains=abc] subdomains as a string where each letter is one. - * @returns {string} a url to load that section of glyphs - * @private - */ -function glyphUrl(fontstack, range, url, subdomains) { - subdomains = subdomains || 'abc'; - - return url - .replace('{s}', subdomains[fontstack.length % subdomains.length]) - .replace('{fontstack}', fontstack) - .replace('{range}', range); -} - -},{"../util/ajax":91,"../util/glyphs":98,"../util/mapbox":100,"pbf":132}],69:[function(require,module,exports){ -'use strict'; - -module.exports = function (features, textFeatures, geometries) { - - var leftIndex = {}, - rightIndex = {}, - mergedFeatures = [], - mergedGeom = [], - mergedTexts = [], - mergedIndex = 0, - k; - - function add(k) { - mergedFeatures.push(features[k]); - mergedGeom.push(geometries[k]); - mergedTexts.push(textFeatures[k]); - mergedIndex++; - } - - function mergeFromRight(leftKey, rightKey, geom) { - var i = rightIndex[leftKey]; - delete rightIndex[leftKey]; - rightIndex[rightKey] = i; - - mergedGeom[i][0].pop(); - mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]); - return i; - } - - function mergeFromLeft(leftKey, rightKey, geom) { - var i = leftIndex[rightKey]; - delete leftIndex[rightKey]; - leftIndex[leftKey] = i; - - mergedGeom[i][0].shift(); - mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]); - return i; - } - - function getKey(text, geom, onRight) { - var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; - return text + ':' + point.x + ':' + point.y; - } - - for (k = 0; k < features.length; k++) { - var geom = geometries[k], - text = textFeatures[k]; - - if (!text) { - add(k); - continue; - } - - var leftKey = getKey(text, geom), - rightKey = getKey(text, geom, true); - - if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { - // found lines with the same text adjacent to both ends of the current line, merge all three - var j = mergeFromLeft(leftKey, rightKey, geom); - var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]); - - delete leftIndex[leftKey]; - delete rightIndex[rightKey]; - - rightIndex[getKey(text, mergedGeom[i], true)] = i; - mergedGeom[j] = null; - - } else if (leftKey in rightIndex) { - // found mergeable line adjacent to the start of the current line, merge - mergeFromRight(leftKey, rightKey, geom); - - } else if (rightKey in leftIndex) { - // found mergeable line adjacent to the end of the current line, merge - mergeFromLeft(leftKey, rightKey, geom); - - } else { - // no adjacent lines, add as a new item - add(k); - leftIndex[leftKey] = mergedIndex - 1; - rightIndex[rightKey] = mergedIndex - 1; - } - } - - return { - features: mergedFeatures, - textFeatures: mergedTexts, - geometries: mergedGeom - }; -}; - -},{}],70:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); - -module.exports = { - getIconQuads: getIconQuads, - getGlyphQuads: getGlyphQuads -}; - -var minScale = 0.5; // underscale by 1 zoom level - -/** - * A textured quad for rendering a single icon or glyph. - * - * The zoom range the glyph can be shown is defined by minScale and maxScale. - * - * @param {Point} anchorPoint the point the symbol is anchored around - * @param {Point} tl The offset of the top left corner from the anchor. - * @param {Point} tr The offset of the top right corner from the anchor. - * @param {Point} bl The offset of the bottom left corner from the anchor. - * @param {Point} br The offset of the bottom right corner from the anchor. - * @param {Object} tex The texture coordinates. - * @param {number} angle The angle of the label at it's center, not the angle of this quad. - * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at. - * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at. - * - * @class SymbolQuad - * @private - */ -function SymbolQuad(anchorPoint, tl, tr, bl, br, tex, angle, minScale, maxScale) { - this.anchorPoint = anchorPoint; - this.tl = tl; - this.tr = tr; - this.bl = bl; - this.br = br; - this.tex = tex; - this.angle = angle; - this.minScale = minScale; - this.maxScale = maxScale; -} - -/** - * Create the quads used for rendering an icon. - * - * @param {Anchor} anchor - * @param {PositionedIcon} shapedIcon - * @param {number} boxScale A magic number for converting glyph metric units to geometry units. - * @param {Array>} line - * @param {LayoutProperties} layout - * @param {boolean} alongLine Whether the icon should be placed along the line. - * @returns {Array} - * @private - */ -function getIconQuads(anchor, shapedIcon, boxScale, line, layout, alongLine) { - - var rect = shapedIcon.image.rect; - - var border = 1; - var left = shapedIcon.left - border; - var right = left + rect.w; - var top = shapedIcon.top - border; - var bottom = top + rect.h; - var tl = new Point(left, top); - var tr = new Point(right, top); - var br = new Point(right, bottom); - var bl = new Point(left, bottom); - - var angle = layout['icon-rotate'] * Math.PI / 180; - if (alongLine) { - var prev = line[anchor.segment]; - angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x); - } - - if (angle) { - var sin = Math.sin(angle), - cos = Math.cos(angle), - matrix = [cos, -sin, sin, cos]; - - tl = tl.matMult(matrix); - tr = tr.matMult(matrix); - bl = bl.matMult(matrix); - br = br.matMult(matrix); - } - - return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, minScale, Infinity)]; -} - -/** - * Create the quads used for rendering a text label. - * - * @param {Anchor} anchor - * @param {Shaping} shaping - * @param {number} boxScale A magic number for converting from glyph metric units to geometry units. - * @param {Array>} line - * @param {LayoutProperties} layout - * @param {boolean} alongLine Whether the label should be placed along the line. - * @returns {Array} - * @private - */ -function getGlyphQuads(anchor, shaping, boxScale, line, layout, alongLine) { - - var textRotate = layout['text-rotate'] * Math.PI / 180; - var keepUpright = layout['text-keep-upright']; - - var positionedGlyphs = shaping.positionedGlyphs; - var quads = []; - - for (var k = 0; k < positionedGlyphs.length; k++) { - var positionedGlyph = positionedGlyphs[k]; - var glyph = positionedGlyph.glyph; - var rect = glyph.rect; - - if (!rect) continue; - - var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale; - - var glyphInstances; - var labelMinScale = minScale; - if (alongLine) { - glyphInstances = []; - labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true); - if (keepUpright) { - labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false)); - } - - } else { - glyphInstances = [{ - anchorPoint: new Point(anchor.x, anchor.y), - offset: 0, - angle: 0, - maxScale: Infinity, - minScale: minScale - }]; - } - - var x1 = positionedGlyph.x + glyph.left, - y1 = positionedGlyph.y - glyph.top, - x2 = x1 + rect.w, - y2 = y1 + rect.h, - - otl = new Point(x1, y1), - otr = new Point(x2, y1), - obl = new Point(x1, y2), - obr = new Point(x2, y2); - - for (var i = 0; i < glyphInstances.length; i++) { - - var instance = glyphInstances[i], - tl = otl, - tr = otr, - bl = obl, - br = obr, - angle = instance.angle + textRotate; - - if (angle) { - var sin = Math.sin(angle), - cos = Math.cos(angle), - matrix = [cos, -sin, sin, cos]; - - tl = tl.matMult(matrix); - tr = tr.matMult(matrix); - bl = bl.matMult(matrix); - br = br.matMult(matrix); - } - - // Prevent label from extending past the end of the line - var glyphMinScale = Math.max(instance.minScale, labelMinScale); - - var glyphAngle = (anchor.angle + textRotate + instance.offset + 2 * Math.PI) % (2 * Math.PI); - quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, glyphAngle, glyphMinScale, instance.maxScale)); - - } - } - - return quads; -} - -/** - * We can only render glyph quads that slide along a straight line. To draw - * curved lines we need an instance of a glyph for each segment it appears on. - * This creates all the instances of a glyph that are necessary to render a label. - * - * We need a - * @param {Array} glyphInstances An empty array that glyphInstances are added to. - * @param {Anchor} anchor - * @param {number} offset The glyph's offset from the center of the label. - * @param {Array} line - * @param {number} segment The index of the segment of the line on which the anchor exists. - * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier. - * - * @returns {Array} glyphInstances - * @private - */ -function getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) { - var upsideDown = !forward; - - if (offset < 0) forward = !forward; - - if (forward) segment++; - - var newAnchorPoint = new Point(anchor.x, anchor.y); - var end = line[segment]; - var prevScale = Infinity; - - offset = Math.abs(offset); - - var placementScale = minScale; - - while (true) { - var distance = newAnchorPoint.dist(end); - var scale = offset / distance; - - // Get the angle of the line segment - var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x); - if (!forward) angle += Math.PI; - if (upsideDown) angle += Math.PI; - - glyphs.push({ - anchorPoint: newAnchorPoint, - offset: upsideDown ? Math.PI : 0, - minScale: scale, - maxScale: prevScale, - angle: (angle + 2 * Math.PI) % (2 * Math.PI) - }); - - if (scale <= placementScale) break; - - newAnchorPoint = end; - - // skip duplicate nodes - while (newAnchorPoint.equals(end)) { - segment += forward ? 1 : -1; - end = line[segment]; - if (!end) { - return scale; - } - } - - var unit = end.sub(newAnchorPoint)._unit(); - newAnchorPoint = newAnchorPoint.sub(unit._mult(distance)); - - prevScale = scale; - } - - return placementScale; -} - -},{"point-geometry":134}],71:[function(require,module,exports){ -'use strict'; - -var resolveTokens = require('../util/token'); - -module.exports = resolveIcons; - -// For an array of features determine what icons need to be loaded. -function resolveIcons(features, layoutProperties) { - var icons = []; - - for (var i = 0, fl = features.length; i < fl; i++) { - var text = resolveTokens(features[i].properties, layoutProperties['icon-image']); - if (!text) continue; - - if (icons.indexOf(text) < 0) { - icons.push(text); - } - } - - return icons; -} - -},{"../util/token":102}],72:[function(require,module,exports){ -'use strict'; - -var resolveTokens = require('../util/token'); - -module.exports = resolveText; - -/** - * For an array of features determine what glyph ranges need to be loaded - * and apply any text preprocessing. The remaining users of text should - * use the `textFeatures` key returned by this function rather than accessing - * feature text directly. - * @private - */ -function resolveText(features, layoutProperties, glyphs) { - var textFeatures = []; - var codepoints = []; - - for (var i = 0, fl = features.length; i < fl; i++) { - var text = resolveTokens(features[i].properties, layoutProperties['text-field']); - if (!text) { - textFeatures[i] = null; - continue; - } - text = text.toString(); - - var transform = layoutProperties['text-transform']; - if (transform === 'uppercase') { - text = text.toLocaleUpperCase(); - } else if (transform === 'lowercase') { - text = text.toLocaleLowerCase(); - } - - for (var j = 0, jl = text.length; j < jl; j++) { - codepoints.push(text.charCodeAt(j)); - } - - // Track indexes of features with text. - textFeatures[i] = text; - } - - // get a list of unique codepoints we are missing - codepoints = uniq(codepoints, glyphs); - - return { - textFeatures: textFeatures, - codepoints: codepoints - }; -} - -function uniq(ids, alreadyHave) { - var u = []; - var last; - ids.sort(sortNumbers); - for (var i = 0; i < ids.length; i++) { - if (ids[i] !== last) { - last = ids[i]; - if (!alreadyHave[last]) u.push(ids[i]); - } - } - return u; -} - -function sortNumbers(a, b) { - return a - b; -} - -},{"../util/token":102}],73:[function(require,module,exports){ -'use strict'; - -module.exports = { - shapeText: shapeText, - shapeIcon: shapeIcon -}; - - -// The position of a glyph relative to the text's anchor point. -function PositionedGlyph(codePoint, x, y, glyph) { - this.codePoint = codePoint; - this.x = x; - this.y = y; - this.glyph = glyph; -} - -// A collection of positioned glyphs and some metadata -function Shaping(positionedGlyphs, text, top, bottom, left, right) { - this.positionedGlyphs = positionedGlyphs; - this.text = text; - this.top = top; - this.bottom = bottom; - this.left = left; - this.right = right; -} - -function shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) { - - var positionedGlyphs = []; - var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]); - - // the y offset *should* be part of the font metadata - var yOffset = -17; - - var x = translate[0]; - var y = translate[1] + yOffset; - - for (var i = 0; i < text.length; i++) { - var codePoint = text.charCodeAt(i); - var glyph = glyphs[codePoint]; - - if (!glyph) continue; - - positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph)); - x += glyph.advance + spacing; - } - - if (!positionedGlyphs.length) return false; - - linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify); - - return shaping; -} - -var breakable = { 32: true }; // Currently only breaks at regular spaces - -function linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify) { - var lastSafeBreak = null; - - var lengthBeforeCurrentLine = 0; - var lineStartIndex = 0; - var line = 0; - - var maxLineLength = 0; - - var positionedGlyphs = shaping.positionedGlyphs; - - if (maxWidth) { - for (var i = 0; i < positionedGlyphs.length; i++) { - var positionedGlyph = positionedGlyphs[i]; - - positionedGlyph.x -= lengthBeforeCurrentLine; - positionedGlyph.y += lineHeight * line; - - if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) { - - var lineLength = positionedGlyphs[lastSafeBreak + 1].x; - maxLineLength = Math.max(lineLength, maxLineLength); - - for (var k = lastSafeBreak + 1; k <= i; k++) { - positionedGlyphs[k].y += lineHeight; - positionedGlyphs[k].x -= lineLength; - } - - if (justify) { - justifyLine(positionedGlyphs, glyphs, lineStartIndex, lastSafeBreak - 1, justify); - } - - lineStartIndex = lastSafeBreak + 1; - lastSafeBreak = null; - lengthBeforeCurrentLine += lineLength; - line++; - } - - if (breakable[positionedGlyph.codePoint]) { - lastSafeBreak = i; - } - } - } - - var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1]; - var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance; - maxLineLength = Math.max(maxLineLength, lastLineLength); - - var height = (line + 1) * lineHeight; - - justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify); - align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line); - - // Calculate the bounding box - shaping.top += -verticalAlign * height; - shaping.bottom = shaping.top + height; - shaping.left += -horizontalAlign * maxLineLength; - shaping.right = shaping.left + maxLineLength; -} - -function justifyLine(positionedGlyphs, glyphs, start, end, justify) { - var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance; - var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; - - for (var j = start; j <= end; j++) { - positionedGlyphs[j].x -= lineIndent; - } - -} - -function align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line) { - var shiftX = (justify - horizontalAlign) * maxLineLength; - var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight; - - for (var j = 0; j < positionedGlyphs.length; j++) { - positionedGlyphs[j].x += shiftX; - positionedGlyphs[j].y += shiftY; - } -} - - -function shapeIcon(image, layout) { - if (!image || !image.rect) return null; - - var dx = layout['icon-offset'][0]; - var dy = layout['icon-offset'][1]; - var x1 = dx - image.width / 2; - var x2 = x1 + image.width; - var y1 = dy - image.height / 2; - var y2 = y1 + image.height; - - return new PositionedIcon(image, y1, y2, x1, x2); -} - -function PositionedIcon(image, top, bottom, left, right) { - this.image = image; - this.top = top; - this.bottom = bottom; - this.left = left; - this.right = right; -} - -},{}],74:[function(require,module,exports){ -'use strict'; - -var BinPack = require('./bin_pack'); - -module.exports = SpriteAtlas; -function SpriteAtlas(width, height) { - this.width = width; - this.height = height; - - this.bin = new BinPack(width, height); - this.images = {}; - this.data = false; - this.texture = 0; // WebGL ID - this.filter = 0; // WebGL ID - this.pixelRatio = 1; - this.dirty = true; -} - -SpriteAtlas.prototype = { - get debug() { - return 'canvas' in this; - }, - set debug(value) { - if (value && !this.canvas) { - this.canvas = document.createElement('canvas'); - this.canvas.width = this.width * this.pixelRatio; - this.canvas.height = this.height * this.pixelRatio; - this.canvas.style.width = this.width + 'px'; - this.canvas.style.width = this.width + 'px'; - document.body.appendChild(this.canvas); - this.ctx = this.canvas.getContext('2d'); - } else if (!value && this.canvas) { - this.canvas.parentNode.removeChild(this.canvas); - delete this.ctx; - delete this.canvas; - } - } -}; - -SpriteAtlas.prototype.resize = function(newRatio) { - if (this.pixelRatio === newRatio) return false; - - var oldRatio = this.pixelRatio; - this.pixelRatio = newRatio; - - if (this.canvas) { - this.canvas.width = this.width * this.pixelRatio; - this.canvas.height = this.height * this.pixelRatio; - } - - if (this.data) { - var oldData = this.data; - - this.data = false; - this.allocate(); - this.texture = false; - - var oldWidth = this.width * oldRatio; - var oldHeight = this.height * oldRatio; - var newWidth = this.width * newRatio; - var newHeight = this.height * newRatio; - - // Basic image scaling. TODO: Replace this with better image scaling. - var newImage = this.data; - var oldImage = oldData; - - for (var y = 0; y < newHeight; y++) { - var oldYOffset = Math.floor((y * oldHeight) / newHeight) * oldWidth; - var newYOffset = y * newWidth; - for (var x = 0; x < newWidth; x++) { - var oldX = Math.floor((x * oldWidth) / newWidth); - newImage[newYOffset + x] = oldImage[oldYOffset + oldX]; - } - } - - oldData = null; - this.dirty = true; - } - - return this.dirty; -}; - -function copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) { - var srcI = srcY * srcStride + srcX; - var dstI = dstY * dstStride + dstX; - var x, y; - - if (wrap) { - // add 1 pixel wrapped padding on each side of the image - dstI -= dstStride; - for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) { - for (x = -1; x <= width; x++) { - dst[dstI + x] = src[srcI + ((x + width) % width)]; - } - } - - } else { - for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) { - for (x = 0; x < width; x++) { - dst[dstI + x] = src[srcI + x]; - } - } - } -} - -SpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) { - - // Increase to next number divisible by 4, but at least 1. - // This is so we can scale down the texture coordinates and pack them - // into 2 bytes rather than 4 bytes. - // Pad icons to prevent them from polluting neighbours during linear interpolation - var padding = 2; - var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4); - var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4; - - // We have to allocate a new area in the bin, and store an empty image in it. - // Add a 1px border around every image. - var rect = this.bin.allocate(packWidth, packHeight); - if (rect.w === 0) { - return rect; - } - - rect.originalWidth = pixelWidth; - rect.originalHeight = pixelHeight; - - return rect; -}; - -SpriteAtlas.prototype.getImage = function(name, wrap) { - if (this.images[name]) { - return this.images[name]; - } - - if (!this.sprite) { - return null; - } - - var pos = this.sprite.getSpritePosition(name); - if (!pos.width || !pos.height) { - return null; - } - - var width = pos.width / pos.pixelRatio; - var height = pos.height / pos.pixelRatio; - var rect = this.allocateImage(width, height); - if (rect.w === 0) { - return rect; - } - - var image = new AtlasImage(rect, width, height, pos.sdf); - this.images[name] = image; - - this.copy(rect, pos, wrap); - - return image; -}; - - -SpriteAtlas.prototype.getPosition = function(name, repeating) { - var image = this.getImage(name, repeating); - var rect = image && image.rect; - - if (!rect) { - return null; - } - - // When the image is repeating, get the correct position of the image, rather than the - // one rounded up to 4 pixels. - var width = repeating ? image.width : rect.w; - var height = repeating ? image.height : rect.h; - var padding = 1; - - return { - size: [width, height], - tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height], - br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height] - }; -}; - - -SpriteAtlas.prototype.allocate = function() { - if (!this.data) { - var w = Math.floor(this.width * this.pixelRatio); - var h = Math.floor(this.height * this.pixelRatio); - this.data = new Uint32Array(w * h); - for (var i = 0; i < this.data.length; i++) { - this.data[i] = 0; - } - } -}; - - -SpriteAtlas.prototype.copy = function(dst, src, wrap) { - // if (!sprite->raster) return; - if (!this.sprite.img.data) return; - var srcImg = new Uint32Array(this.sprite.img.data.buffer); - - this.allocate(); - var dstImg = this.data; - - var padding = 1; - - copyBitmap( - /* source buffer */ srcImg, - /* source stride */ this.sprite.img.width, - /* source x */ src.x, - /* source y */ src.y, - /* dest buffer */ dstImg, - /* dest stride */ this.width * this.pixelRatio, - /* dest x */ (dst.x + padding) * this.pixelRatio, - /* dest y */ (dst.y + padding) * this.pixelRatio, - /* icon dimension */ src.width, - /* icon dimension */ src.height, - /* wrap */ wrap - ); - - this.dirty = true; -}; - -SpriteAtlas.prototype.setSprite = function(sprite) { - this.sprite = sprite; -}; - -SpriteAtlas.prototype.addIcons = function(icons, callback) { - for (var i = 0; i < icons.length; i++) { - this.getImage(icons[i]); - } - - callback(null, this.images); -}; - -SpriteAtlas.prototype.bind = function(gl, linear) { - var first = false; - if (!this.texture) { - this.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - first = true; - } else { - gl.bindTexture(gl.TEXTURE_2D, this.texture); - } - - var filterVal = linear ? gl.LINEAR : gl.NEAREST; - if (filterVal !== this.filter) { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal); - this.filter = filterVal; - } - - if (this.dirty) { - this.allocate(); - - if (first) { - gl.texImage2D( - gl.TEXTURE_2D, // enum target - 0, // ind level - gl.RGBA, // ind internalformat - this.width * this.pixelRatio, // GLsizei width - this.height * this.pixelRatio, // GLsizei height - 0, // ind border - gl.RGBA, // enum format - gl.UNSIGNED_BYTE, // enum type - new Uint8Array(this.data.buffer) // Object data - ); - } else { - gl.texSubImage2D( - gl.TEXTURE_2D, // enum target - 0, // int level - 0, // int xoffset - 0, // int yoffset - this.width * this.pixelRatio, // long width - this.height * this.pixelRatio, // long height - gl.RGBA, // enum format - gl.UNSIGNED_BYTE, // enum type - new Uint8Array(this.data.buffer) // Object pixels - ); - } - - this.dirty = false; - - // DEBUG - if (this.ctx) { - var data = this.ctx.getImageData(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio); - data.data.set(new Uint8ClampedArray(this.data.buffer)); - this.ctx.putImageData(data, 0, 0); - - this.ctx.strokeStyle = 'red'; - for (var k = 0; k < this.bin.free.length; k++) { - var free = this.bin.free[k]; - this.ctx.strokeRect(free.x * this.pixelRatio, free.y * this.pixelRatio, free.w * this.pixelRatio, free.h * this.pixelRatio); - } - } - // END DEBUG - } -}; - -function AtlasImage(rect, width, height, sdf) { - this.rect = rect; - this.width = width; - this.height = height; - this.sdf = sdf; -} - -},{"./bin_pack":60}],75:[function(require,module,exports){ -'use strict'; - -var util = require('../util/util'); -var interpolate = require('../util/interpolate'); -var browser = require('../util/browser'); -var LatLng = require('../geo/lat_lng'); -var LatLngBounds = require('../geo/lat_lng_bounds'); -var Point = require('point-geometry'); - -/** - * Options common to Map#jumpTo, Map#easeTo, and Map#flyTo, controlling the destination - * location, zoom level, bearing and pitch. All properties are options; unspecified - * options will default to the current value for that property. - * - * @typedef {Object} CameraOptions - * @property {Array} center Latitude and longitude (passed as `[lat, lng]`) - * @property {number} zoom Map zoom level - * @property {number} bearing Map rotation bearing in degrees counter-clockwise from north - * @property {number} pitch The angle at which the camera is looking at the ground - */ - -/** - * Options common to map movement methods that involve animation, such as Map#panBy and - * Map#easeTo, controlling the duration of the animation and easing function. All properties - * are optional. - * - * @typedef {Object} AnimationOptions - * @property {number} duration Number in milliseconds - * @property {Function} easing - * @property {Array} offset point, origin of movement relative to map center - * @property {boolean} animate When set to false, no animation happens - */ - -var Camera = module.exports = function() {}; - -util.extend(Camera.prototype, /** @lends Map.prototype */{ - /** - * Get the current view geographical point. - * @returns {LatLng} - */ - getCenter: function() { return this.transform.center; }, - - /** - * Sets a map location. Equivalent to `jumpTo({center: center})`. - * - * @param {Array} center Latitude and longitude (passed as `[lat, lng]`) - * @fires movestart - * @fires moveend - * @returns {Map} `this` - * @example - * map.setCenter([-74, 38]); - */ - setCenter: function(center) { - this.jumpTo({center: center}); - return this; - }, - - /** - * Pan by a certain number of pixels - * - * @param {Array} offset [x, y] - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - panBy: function(offset, options) { - this.panTo(this.transform.center, util.extend({offset: Point.convert(offset).mult(-1)}, options)); - return this; - }, - - /** - * Pan to a certain location with easing - * - * @param {Object} latlng a `LatLng` object - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - panTo: function(latlng, options) { - this.stop(); - - latlng = LatLng.convert(latlng); - - options = util.extend({ - duration: 500, - easing: util.ease, - offset: [0, 0] - }, options); - - var tr = this.transform, - offset = Point.convert(options.offset).rotate(-tr.angle), - from = tr.point, - to = tr.project(latlng).sub(offset); - - if (!options.noMoveStart) { - this.fire('movestart'); - } - - this._ease(function(k) { - tr.center = tr.unproject(from.add(to.sub(from).mult(k))); - this.fire('move'); - }, function() { - this.fire('moveend'); - }, options); - - return this; - }, - - - /** - * Get the current zoom - * @returns {number} - */ - getZoom: function() { return this.transform.zoom; }, - - /** - * Sets a map zoom. Equivalent to `jumpTo({zoom: zoom})`. - * - * @param {number} zoom Map zoom level - * @fires movestart - * @fires moveend - * @returns {Map} `this` - * @example - * // zoom the map to 5 - * map.setZoom(5); - */ - setZoom: function(zoom) { - this.jumpTo({zoom: zoom}); - return this; - }, - - /** - * Zooms to a certain zoom level with easing. - * - * @param {number} zoom - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - zoomTo: function(zoom, options) { - this.stop(); - - options = util.extend({ - duration: 500 - }, options); - - options.easing = this._updateEasing(options.duration, zoom, options.easing); - - var tr = this.transform, - around = tr.center, - startZoom = tr.zoom; - - if (options.around) { - around = LatLng.convert(options.around); - } else if (options.offset) { - around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset))); - } - - if (options.animate === false) options.duration = 0; - - if (!this.zooming) { - this.zooming = true; - this.fire('movestart'); - } - - this._ease(function(k) { - tr.setZoomAround(interpolate(startZoom, zoom, k), around); - this.fire('move').fire('zoom'); - }, function() { - this.ease = null; - if (options.duration >= 200) { - this.zooming = false; - this.fire('moveend'); - } - }, options); - - if (options.duration < 200) { - clearTimeout(this._onZoomEnd); - this._onZoomEnd = setTimeout(function() { - this.zooming = false; - this.fire('moveend'); - }.bind(this), 200); - } - - return this; - }, - - /** - * Zoom in by 1 level - * - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - zoomIn: function(options) { - this.zoomTo(this.getZoom() + 1, options); - return this; - }, - - /** - * Zoom out by 1 level - * - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - zoomOut: function(options) { - this.zoomTo(this.getZoom() - 1, options); - return this; - }, - - - /** - * Get the current bearing in degrees - * @returns {number} - */ - getBearing: function() { return this.transform.bearing; }, - - /** - * Sets a map rotation. Equivalent to `jumpTo({bearing: bearing})`. - * - * @param {number} bearing Map rotation bearing in degrees counter-clockwise from north - * @fires movestart - * @fires moveend - * @returns {Map} `this` - * @example - * // rotate the map to 90 degrees - * map.setBearing(90); - */ - setBearing: function(bearing) { - this.jumpTo({bearing: bearing}); - return this; - }, - - /** - * Rotate bearing by a certain number of degrees with easing - * - * @param {number} bearing - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - rotateTo: function(bearing, options) { - this.stop(); - - options = util.extend({ - duration: 500, - easing: util.ease - }, options); - - var tr = this.transform, - start = this.getBearing(), - around = tr.center; - - if (options.around) { - around = LatLng.convert(options.around); - } else if (options.offset) { - around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset))); - } - - bearing = this._normalizeBearing(bearing, start); - - this.rotating = true; - this.fire('movestart'); - - this._ease(function(k) { - tr.setBearingAround(interpolate(start, bearing, k), around); - this.fire('move').fire('rotate'); - }, function() { - this.rotating = false; - this.fire('moveend'); - }, options); - - return this; - }, - - /** - * Sets map bearing to 0 (north) with easing - * - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - resetNorth: function(options) { - this.rotateTo(0, util.extend({duration: 1000}, options)); - return this; - }, - - /** - * Animates map bearing to 0 (north) if it's already close to it. - * - * @param {AnimationOptions} [options] - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - snapToNorth: function(options) { - if (Math.abs(this.getBearing()) < this.options.bearingSnap) { - return this.resetNorth(options); - } - return this; - }, - - /** - * Get the current angle in degrees - * @returns {number} - */ - getPitch: function() { return this.transform.pitch; }, - - /** - * Sets a map angle. Equivalent to `jumpTo({pitch: pitch})`. - * - * @param {number} pitch The angle at which the camera is looking at the ground - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - setPitch: function(pitch) { - this.jumpTo({pitch: pitch}); - return this; - }, - - - /** - * Zoom to contain certain geographical bounds - * - * @param {Array} bounds [[minLat, minLng], [maxLat, maxLng]] - * @param {Object} options - * @param {number} [options.speed=1.2] How fast animation occurs - * @param {number} [options.curve=1.42] How much zooming out occurs during animation - * @param {Function} options.easing - * @param {number} options.padding how much padding there is around the given bounds on each side in pixels - * @param {number} options.maxZoom - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - fitBounds: function(bounds, options) { - - options = util.extend({ - padding: 0, - offset: [0, 0], - maxZoom: Infinity - }, options); - - bounds = LatLngBounds.convert(bounds); - - var offset = Point.convert(options.offset), - tr = this.transform, - nw = tr.project(bounds.getNorthWest()), - se = tr.project(bounds.getSouthEast()), - size = se.sub(nw), - scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x, - scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y; - - options.center = tr.unproject(nw.add(se).div(2)); - options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); - options.bearing = 0; - - return options.linear ? - this.easeTo(options) : - this.flyTo(options); - }, - - /** - * Change any combination of center, zoom, bearing, and pitch, without - * a transition. The map will retain the current values for any options - * not included in `options`. - * - * @param {CameraOptions} options map view options - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - jumpTo: function(options) { - this.stop(); - - var tr = this.transform, - zoomChanged = false, - bearingChanged = false, - pitchChanged = false; - - if ('center' in options) { - tr.center = LatLng.convert(options.center); - } - - if ('zoom' in options && tr.zoom !== +options.zoom) { - zoomChanged = true; - tr.zoom = +options.zoom; - } - - if ('bearing' in options && tr.bearing !== +options.bearing) { - bearingChanged = true; - tr.bearing = +options.bearing; - } - - if ('pitch' in options && tr.pitch !== +options.pitch) { - pitchChanged = true; - tr.pitch = +options.pitch; - } - - this.fire('movestart') - .fire('move'); - - if (zoomChanged) { - this.fire('zoom'); - } - - if (bearingChanged) { - this.fire('rotate'); - } - - if (pitchChanged) { - this.fire('pitch'); - } - - return this.fire('moveend'); - }, - - /** - * Easing animation to a specified location/zoom/bearing - * - * @param {CameraOptions~AnimationOptions} options map view and animation options - * @fires movestart - * @fires moveend - * @returns {Map} `this` - */ - easeTo: function(options) { - this.stop(); - - options = util.extend({ - offset: [0, 0], - duration: 500, - easing: util.ease - }, options); - - var tr = this.transform, - offset = Point.convert(options.offset).rotate(-tr.angle), - from = tr.point, - startZoom = this.getZoom(), - startBearing = this.getBearing(), - startPitch = this.getPitch(), - - zoom = 'zoom' in options ? +options.zoom : startZoom, - bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, - pitch = 'pitch' in options ? +options.pitch : startPitch, - - scale = tr.zoomScale(zoom - startZoom), - to = 'center' in options ? tr.project(LatLng.convert(options.center)).sub(offset.div(scale)) : from, - around = LatLng.convert(options.around); - - if (zoom !== startZoom) { - this.zooming = true; - } - if (startBearing !== bearing) { - this.rotating = true; - } - - if (this.zooming && !around) { - around = tr.pointLocation(tr.centerPoint.add(to.sub(from).div(1 - 1 / scale))); - } - - this.fire('movestart'); - - this._ease(function (k) { - if (this.zooming) { - tr.setZoomAround(interpolate(startZoom, zoom, k), around); - } else { - tr.center = tr.unproject(from.add(to.sub(from).mult(k))); - } - - if (this.rotating) { - tr.bearing = interpolate(startBearing, bearing, k); - } - - if (pitch !== startPitch) { - tr.pitch = interpolate(startPitch, pitch, k); - } - - this.fire('move'); - if (this.zooming) { - this.fire('zoom'); - } - if (this.rotating) { - this.fire('rotate'); - } - }, function() { - this.zooming = false; - this.rotating = false; - this.fire('moveend'); - }, options); - - return this; - }, - - /** - * Flying animation to a specified location/zoom/bearing with automatic curve - * - * @param {CameraOptions} options map view options - * @param {number} [options.speed=1.2] How fast animation occurs - * @param {number} [options.curve=1.42] How much zooming out occurs during animation - * @param {Function} [options.easing] - * @fires movestart - * @fires moveend - * @returns {this} - * @example - * // fly with default options to null island - * map.flyTo({center: [0, 0], zoom: 9}); - * // using flyTo options - * map.flyTo({ - * center: [0, 0], - * zoom: 9, - * speed: 0.2, - * curve: 1, - * easing: function(t) { - * return t; - * } - * }); - */ - flyTo: function(options) { - this.stop(); - - options = util.extend({ - offset: [0, 0], - speed: 1.2, - curve: 1.42, - easing: util.ease - }, options); - - var tr = this.transform, - offset = Point.convert(options.offset), - startZoom = this.getZoom(), - startBearing = this.getBearing(); - - var center = 'center' in options ? LatLng.convert(options.center) : this.getCenter(); - var zoom = 'zoom' in options ? +options.zoom : startZoom; - var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; - - var scale = tr.zoomScale(zoom - startZoom), - from = tr.point, - to = tr.project(center).sub(offset.div(scale)); - - var startWorldSize = tr.worldSize, - rho = options.curve, - V = options.speed, - - w0 = Math.max(tr.width, tr.height), - w1 = w0 / scale, - u1 = to.sub(from).mag(), - rho2 = rho * rho; - - function r(i) { - var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); - return Math.log(Math.sqrt(b * b + 1) - b); - } - - function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } - function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } - function tanh(n) { return sinh(n) / cosh(n); } - - var r0 = r(0), - w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }, - u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }, - S = (r(1) - r0) / rho; - - if (Math.abs(u1) < 0.000001) { - if (Math.abs(w0 - w1) < 0.000001) return this; - - var k = w1 < w0 ? -1 : 1; - S = Math.abs(Math.log(w1 / w0)) / rho; - - u = function() { return 0; }; - w = function(s) { return Math.exp(k * rho * s); }; - } - - options.duration = 1000 * S / V; - - this.zooming = true; - if (startBearing !== bearing) this.rotating = true; - - this.fire('movestart'); - - this._ease(function (k) { - var s = k * S, - us = u(s); - - tr.zoom = startZoom + tr.scaleZoom(1 / w(s)); - tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize); - - if (bearing !== startBearing) { - tr.bearing = interpolate(startBearing, bearing, k); - } - - this.fire('move').fire('zoom'); - if (bearing !== startBearing) { - this.fire('rotate'); - } - }, function() { - this.zooming = false; - this.rotating = false; - this.fire('moveend'); - }, options); - - return this; - }, - - isEasing: function() { - return !!this._abortFn; - }, - - /** - * Stop current animation - * - * @returns {Map} `this` - */ - stop: function() { - if (this._abortFn) { - this._abortFn.call(this); - this._finishEase(); - } - return this; - }, - - _ease: function(frame, finish, options) { - this._finishFn = finish; - this._abortFn = browser.timed(function (t) { - frame.call(this, options.easing(t)); - if (t === 1) { - this._finishEase(); - } - }, options.animate === false ? 0 : options.duration, this); - }, - - _finishEase: function() { - delete this._abortFn; - // The finish function might emit events which trigger new eases, which - // set a new _finishFn. Ensure we don't delete it unintentionally. - var finish = this._finishFn; - delete this._finishFn; - finish.call(this); - }, - - // convert bearing so that it's numerically close to the current one so that it interpolates properly - _normalizeBearing: function(bearing, currentBearing) { - bearing = util.wrap(bearing, -180, 180); - var diff = Math.abs(bearing - currentBearing); - if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360; - if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360; - return bearing; - }, - - _updateEasing: function(duration, zoom, bezier) { - var easing; - - if (this.ease) { - var ease = this.ease, - t = (Date.now() - ease.start) / ease.duration, - speed = ease.easing(t + 0.01) - ease.easing(t), - - // Quick hack to make new bezier that is continuous with last - x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, - y = Math.sqrt(0.27 * 0.27 - x * x); - - easing = util.bezier(x, y, 0.25, 1); - } else { - easing = bezier ? util.bezier.apply(util, bezier) : util.ease; - } - - // store information on current easing - this.ease = { - start: (new Date()).getTime(), - to: Math.pow(2, zoom), - duration: duration, - easing: easing - }; - - return easing; - } -}); - -},{"../geo/lat_lng":18,"../geo/lat_lng_bounds":19,"../util/browser":92,"../util/interpolate":99,"../util/util":103,"point-geometry":134}],76:[function(require,module,exports){ -'use strict'; - -var Control = require('./control'); -var DOM = require('../../util/dom'); -var util = require('../../util/util'); - -module.exports = Attribution; - -/** - * Creates an attribution control - * @class Attribution - * @example - * map.addControl(new mapboxgl.Attribution()); - */ -function Attribution() {} - -Attribution.prototype = util.inherit(Control, { - options: { - position: 'bottom-right' - }, - - onAdd: function(map) { - var className = 'mapboxgl-ctrl-attrib', - container = this._container = DOM.create('div', className, map.getContainer()); - - this._update(); - map.on('source.load', this._update.bind(this)); - map.on('source.change', this._update.bind(this)); - map.on('source.remove', this._update.bind(this)); - map.on('moveend', this._updateEditLink.bind(this)); - - return container; - }, - - _update: function() { - var attributions = []; - - if (this._map.style) { - for (var id in this._map.style.sources) { - var source = this._map.style.sources[id]; - if (source.attribution && attributions.indexOf(source.attribution) < 0) { - attributions.push(source.attribution); - } - } - } - - this._container.innerHTML = attributions.join(' | '); - this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0]; - this._updateEditLink(); - }, - - _updateEditLink: function() { - if (this._editLink) { - var center = this._map.getCenter(); - this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' + - center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1); - } - } -}); - -},{"../../util/dom":95,"../../util/util":103,"./control":77}],77:[function(require,module,exports){ -'use strict'; - -module.exports = Control; - -/** - * A base class for map-related interface elements. - * - * @class Control - */ -function Control() {} - -Control.prototype = { - /** - * Add this control to the map, returning the control itself - * for chaining. This will insert the control's DOM element into - * the map's DOM element if the control has a `position` specified. - * - * @param {Map} map - * @returns {Control} `this` - */ - addTo: function(map) { - this._map = map; - var container = this._container = this.onAdd(map); - if (this.options && this.options.position) { - var pos = this.options.position; - var corner = map._controlCorners[pos]; - container.className += ' mapboxgl-ctrl'; - if (pos.indexOf('bottom') !== -1) { - corner.insertBefore(container, corner.firstChild); - } else { - corner.appendChild(container); - } - } - - return this; - }, - - /** - * Remove this control from the map it has been added to. - * - * @returns {Control} `this` - */ - remove: function() { - this._container.parentNode.removeChild(this._container); - if (this.onRemove) this.onRemove(this._map); - this._map = null; - return this; - } -}; - -},{}],78:[function(require,module,exports){ -'use strict'; - -var Control = require('./control'); -var DOM = require('../../util/dom'); -var util = require('../../util/util'); - -module.exports = Navigation; - -/** - * Creates a navigation control with zoom buttons and a compass - * @class Navigation - * @param {Object} [options] - * @param {string} [options.position=top-right] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left` - * @example - * map.addControl(new mapboxgl.Navigation({position: 'top-left'})); // position is optional - */ -function Navigation(options) { - util.setOptions(this, options); -} - -Navigation.prototype = util.inherit(Control, { - options: { - position: 'top-right' - }, - - onAdd: function(map) { - var className = 'mapboxgl-ctrl'; - - var container = this._container = DOM.create('div', className + '-group', map.getContainer()); - - this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map)); - this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map)); - this._compass = this._createButton(className + '-compass', map.resetNorth.bind(map)); - - var compassCanvas = this._compassCanvas = DOM.create('canvas', className + '-compass-canvas', this._compass); - compassCanvas.style.cssText = 'width:30px; height:30px;'; - compassCanvas.width = 26 * 2; - compassCanvas.height = 26 * 2; - - this._compass.addEventListener('mousedown', this._onCompassDown.bind(this)); - this._onCompassMove = this._onCompassMove.bind(this); - this._onCompassUp = this._onCompassUp.bind(this); - - this._compassCtx = compassCanvas.getContext('2d'); - - map.on('rotate', this._drawNorth.bind(this)); - this._drawNorth(); - - return container; - }, - - _onCompassDown: function(e) { - DOM.disableDrag(); - - document.addEventListener('mousemove', this._onCompassMove); - document.addEventListener('mouseup', this._onCompassUp); - this._prevX = e.screenX; - - e.stopPropagation(); - }, - - _onCompassMove: function(e) { - var x = e.screenX, - d = x < 2 ? -5 : // left edge of the screen, continue rotating - x > window.screen.width - 2 ? 5 : // right edge - (x - this._prevX) / 4; - - this._map.setBearing(this._map.getBearing() - d); - this._prevX = e.screenX; - this._moved = true; - - e.preventDefault(); - }, - - _onCompassUp: function() { - document.removeEventListener('mousemove', this._onCompassMove); - document.removeEventListener('mouseup', this._onCompassUp); - DOM.enableDrag(); - - if (this._moved) { - this._moved = false; - DOM.suppressClick(); - } - - this._map.snapToNorth(); - }, - - _createButton: function(className, fn) { - var a = DOM.create('button', className, this._container); - a.addEventListener('click', function() { fn(); }); - return a; - }, - - _drawNorth: function() { - var rad = 20, - width = 8, - center = 26, - angle = this._map.transform.angle + (Math.PI / 2), - ctx = this._compassCtx; - - this._compassCanvas.width = this._compassCanvas.width; - - ctx.translate(center, center); - ctx.rotate(angle); - - ctx.beginPath(); - ctx.fillStyle = '#000'; - ctx.lineTo(0, -width); - ctx.lineTo(-rad, 0); - ctx.lineTo(0, width); - ctx.fill(); - - ctx.beginPath(); - ctx.fillStyle = '#bbb'; - ctx.moveTo(0, 0); - ctx.lineTo(0, width); - ctx.lineTo(rad, 0); - ctx.lineTo(0, -width); - ctx.fill(); - - ctx.beginPath(); - ctx.strokeStyle = '#fff'; - ctx.lineWidth = 4; - ctx.moveTo(0, -width); - ctx.lineTo(0, width); - ctx.stroke(); - } -}); - -},{"../../util/dom":95,"../../util/util":103,"./control":77}],79:[function(require,module,exports){ -'use strict'; - -var DOM = require('../../util/dom'), - LatLngBounds = require('../../geo/lat_lng_bounds'), - util = require('../../util/util'); - -module.exports = BoxZoom; - - -function BoxZoom(map) { - this._map = map; - this._el = map.getCanvasContainer(); - this._container = map.getContainer(); - - util.bindHandlers(this); -} - -BoxZoom.prototype = { - enable: function () { - this._el.addEventListener('mousedown', this._onMouseDown, false); - }, - - disable: function () { - this._el.removeEventListener('mousedown', this._onMouseDown); - }, - - _onMouseDown: function (e) { - if (e.shiftKey || (e.which === 1 && e.button === 1)) { - document.addEventListener('mousemove', this._onMouseMove, false); - document.addEventListener('keydown', this._onKeyDown, false); - document.addEventListener('mouseup', this._onMouseUp, false); - - this._startPos = DOM.mousePos(this._el, e); - this.active = true; - } - }, - - _onMouseMove: function (e) { - var p0 = this._startPos, - p1 = DOM.mousePos(this._el, e); - - if (!this._box) { - this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); - this._container.classList.add('mapboxgl-crosshair'); - - DOM.disableDrag(); - - this._map.fire('boxzoomstart'); - } - - var minX = Math.min(p0.x, p1.x), - maxX = Math.max(p0.x, p1.x), - minY = Math.min(p0.y, p1.y), - maxY = Math.max(p0.y, p1.y); - - DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)'); - - this._box.style.width = (maxX - minX) + 'px'; - this._box.style.height = (maxY - minY) + 'px'; - }, - - _onMouseUp: function (e) { - var p0 = this._startPos, - p1 = DOM.mousePos(this._el, e), - bounds = new LatLngBounds(this._map.unproject(p0), this._map.unproject(p1)); - - this._finish(); - - this._map - .fitBounds(bounds, {linear: true}) - .fire('boxzoomend', {boxZoomBounds: bounds}); - }, - - _onKeyDown: function (e) { - if (e.keyCode === 27) { - this._finish(); - this._map.fire('boxzoomcancel'); - } - }, - - _finish: function () { - if (!this._box) return; - - this.active = false; - - document.removeEventListener('mousemove', this._onMouseMove, false); - document.removeEventListener('keydown', this._onKeyDown, false); - document.removeEventListener('mouseup', this._onMouseUp, false); - - this._container.classList.remove('mapboxgl-crosshair'); - - this._box.parentNode.removeChild(this._box); - this._box = null; - - DOM.enableDrag(); - } -}; - -},{"../../geo/lat_lng_bounds":19,"../../util/dom":95,"../../util/util":103}],80:[function(require,module,exports){ -'use strict'; - -module.exports = DoubleClickZoom; - -function DoubleClickZoom(map) { - this._map = map; - this._onDblClick = this._onDblClick.bind(this); -} - -DoubleClickZoom.prototype = { - enable: function () { - this._map.on('dblclick', this._onDblClick); - }, - - disable: function () { - this._map.off('dblclick', this._onDblClick); - }, - - _onDblClick: function (e) { - this._map.zoomTo(Math.round(this._map.getZoom()) + 1, {around: e.latLng}); - } -}; - -},{}],81:[function(require,module,exports){ -'use strict'; - -var DOM = require('../../util/dom'), - util = require('../../util/util'); - -module.exports = DragPan; - - -var inertiaLinearity = 0.25, - inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), - inertiaMaxSpeed = 3000, // px/s - inertiaDeceleration = 4000; // px/s^2 - - -function DragPan(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - util.bindHandlers(this); -} - -DragPan.prototype = { - enable: function () { - this._el.addEventListener('mousedown', this._onDown, false); - this._el.addEventListener('touchstart', this._onDown, false); - }, - - disable: function () { - this._el.removeEventListener('mousedown', this._onDown); - this._el.removeEventListener('touchstart', this._onDown); - }, - - _onDown: function (e) { - this._startPos = this._pos = DOM.mousePos(this._el, e); - - this._inertia = [[Date.now(), this._pos]]; - - if (!e.touches) { - document.addEventListener('mousemove', this._onMove, false); - document.addEventListener('mouseup', this._onMouseUp, false); - - } else if (e.touches.length === 1) { - document.addEventListener('touchmove', this._onMove, false); - document.addEventListener('touchend', this._onTouchEnd, false); - } - }, - - _onMove: function (e) { - var map = this._map; - if (map.boxZoom.active || map.dragRotate.active || (e.touches && e.touches.length > 1)) return; - - var pos = DOM.mousePos(this._el, e), - inertia = this._inertia, - now = Date.now(); - - inertia.push([now, pos]); - while (inertia.length > 2 && now - inertia[0][0] > 50) inertia.shift(); - - map.stop(); - map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos); - map.fire('move'); - - this._pos = pos; - - e.preventDefault(); - }, - - _onUp: function () { - var inertia = this._inertia; - - if (inertia.length < 2) { - this._map.fire('moveend'); - return; - } - - var last = inertia[inertia.length - 1], - first = inertia[0], - flingOffset = last[1].sub(first[1]), - flingDuration = (last[0] - first[0]) / 1000, - - // calculate px/s velocity & adjust for increased initial animation speed when easing out - velocity = flingOffset.mult(inertiaLinearity / flingDuration), - speed = velocity.mag(); // px/s - - if (speed > inertiaMaxSpeed) { - speed = inertiaMaxSpeed; - velocity._unit()._mult(speed); - } - - var duration = speed / (inertiaDeceleration * inertiaLinearity), - offset = velocity.mult(-duration / 2); - - this._map.panBy(offset, { - duration: duration * 1000, - easing: inertiaEasing, - noMoveStart: true - }); - }, - - _onMouseUp: function () { - this._onUp(); - document.removeEventListener('mousemove', this._onMove, false); - document.removeEventListener('mouseup', this._onMouseUp, false); - }, - - _onTouchEnd: function () { - this._onUp(); - document.removeEventListener('touchmove', this._onMove); - document.removeEventListener('touchend', this._onTouchEnd); - } -}; - -},{"../../util/dom":95,"../../util/util":103}],82:[function(require,module,exports){ -'use strict'; - -var DOM = require('../../util/dom'), - Point = require('point-geometry'), - util = require('../../util/util'); - -module.exports = DragRotate; - - -function DragRotate(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - util.bindHandlers(this); -} - -DragRotate.prototype = { - enable: function () { - this._el.addEventListener('contextmenu', this._onContextMenu, false); - }, - - disable: function () { - this._el.removeEventListener('contextmenu', this._onContextMenu); - }, - - _onContextMenu: function (e) { - this._map.stop(); - this.active = true; - this._startPos = this._pos = DOM.mousePos(this._el, e); - - document.addEventListener('mousemove', this._onMouseMove, false); - document.addEventListener('mouseup', this._onMouseUp, false); - - e.preventDefault(); - }, - - _onMouseMove: function (e) { - - var p0 = this._startPos, - p1 = this._pos, - p2 = DOM.mousePos(this._el, e), - - map = this._map, - center = map.transform.centerPoint, // Center of rotation - startToCenter = p0.sub(center), - startToCenterDist = startToCenter.mag(); - - if (!map.rotating) { - map.fire('movestart'); - map.rotating = true; - } - - // If the first click was too close to the center, move the center of rotation by 200 pixels - // in the direction of the click. - if (startToCenterDist < 200) { - center = p0.add(new Point(-200, 0)._rotate(startToCenter.angle())); - } - - var bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180; - map.transform.bearing = map.getBearing() - bearingDiff; - - map.fire('move').fire('rotate'); - - clearTimeout(this._timeout); - this._timeout = setTimeout(this._onTimeout, 200); - - this._pos = p2; - }, - - _onTimeout: function () { - var map = this._map; - - map.rotating = false; - map.snapToNorth(); - - if (!map.rotating) { - map._rerender(); - map.fire('moveend'); - } - }, - - _onMouseUp: function () { - this.active = false; - - document.removeEventListener('mousemove', this._onMouseMove, false); - document.removeEventListener('mouseup', this._onMouseUp, false); - } -}; - -},{"../../util/dom":95,"../../util/util":103,"point-geometry":134}],83:[function(require,module,exports){ -'use strict'; - -module.exports = Keyboard; - - -var panDelta = 80, - rotateDelta = 2; - -/** - * The `Keyboard` handler responds to keyboard input by zooming, rotating, or panning the - * map. The following keyboard shortcuts are supported: - * * `=` / `+`: increase zoom level by 1 - * * `Shift-=` / `Shift-+`: increase zoom level by 2 - * * `-`: decrease zoom level by 1 - * * `Shift--`: decrease zoom level by 2 - * * Arrow keys: pan by 80 pixels - * * `Shift+⇢`: increase rotation by 2 degrees - * * `Shift+⇠`: decrease rotation by 2 degrees - * @class Keyboard - * @example - * // Disable the keyboard handler - * map.keyboard.disable(); - * @example - * // Enable the keyboard handler - * map.keyboard.enable(); - */ -function Keyboard(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - this._onKeyDown = this._onKeyDown.bind(this); -} - -Keyboard.prototype = { - enable: function () { - this._el.addEventListener('keydown', this._onKeyDown, false); - }, - - disable: function () { - this._el.removeEventListener('keydown', this._onKeyDown); - }, - - _onKeyDown: function (e) { - if (e.altKey || e.ctrlKey || e.metaKey) return; - - var map = this._map; - - switch (e.keyCode) { - case 61: - case 107: - case 171: - case 187: - map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1)); - break; - - case 189: - case 109: - case 173: - map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1)); - break; - - case 37: - if (e.shiftKey) { - map.setBearing(map.getBearing() - rotateDelta); - } else { - map.panBy([-panDelta, 0]); - } - break; - - case 39: - if (e.shiftKey) { - map.setBearing(map.getBearing() + rotateDelta); - } else { - map.panBy([panDelta, 0]); - } - break; - - case 38: - map.panBy([0, -panDelta]); - break; - - case 40: - map.panBy([0, panDelta]); - break; - } - } -}; - -},{}],84:[function(require,module,exports){ -'use strict'; - -var DOM = require('../../util/dom'), - util = require('../../util/util'); - -module.exports = Pinch; - - -function Pinch(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - util.bindHandlers(this); -} - -Pinch.prototype = { - enable: function () { - this._el.addEventListener('touchstart', this._onStart, false); - }, - - disable: function () { - this._el.removeEventListener('touchstart', this._onStart); - }, - - _onStart: function (e) { - if (e.touches.length !== 2) return; - - var p0 = DOM.mousePos(this._el, e.touches[0]), - p1 = DOM.mousePos(this._el, e.touches[1]); - - this._startVec = p0.sub(p1); - this._startScale = this._map.transform.scale; - this._startBearing = this._map.transform.bearing; - - document.addEventListener('touchmove', this._onMove, false); - document.addEventListener('touchend', this._onEnd, false); - }, - - _onMove: function (e) { - if (e.touches.length !== 2) return; - - var p0 = DOM.mousePos(this._el, e.touches[0]), - p1 = DOM.mousePos(this._el, e.touches[1]), - p = p0.add(p1).div(2), - vec = p0.sub(p1), - scale = vec.mag() / this._startVec.mag(), - bearing = vec.angleWith(this._startVec) * 180 / Math.PI, - map = this._map; - - map.easeTo({ - zoom: map.transform.scaleZoom(this._startScale * scale), - bearing: this._startBearing + bearing, - duration: 0, - around: map.unproject(p) - }); - - e.preventDefault(); - }, - - _onEnd: function () { - this._map.snapToNorth(); - - document.removeEventListener('touchmove', this._onMove); - document.removeEventListener('touchend', this._onEnd); - } -}; - -},{"../../util/dom":95,"../../util/util":103}],85:[function(require,module,exports){ -'use strict'; - -var DOM = require('../../util/dom'), - browser = require('../../util/browser'), - util = require('../../util/util'); - -module.exports = ScrollZoom; - - -var ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '', - firefox = ua.indexOf('firefox') !== -1, - safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1; - - -function ScrollZoom(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - util.bindHandlers(this); -} - -ScrollZoom.prototype = { - enable: function () { - this._el.addEventListener('wheel', this._onWheel, false); - this._el.addEventListener('mousewheel', this._onWheel, false); - }, - - disable: function () { - this._el.removeEventListener('wheel', this._onWheel); - this._el.removeEventListener('mousewheel', this._onWheel); - }, - - _onWheel: function (e) { - var value; - - if (e.type === 'wheel') { - value = e.deltaY; - // Firefox doubles the values on retina screens... - if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio; - if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40; - - } else if (e.type === 'mousewheel') { - value = -e.wheelDeltaY; - if (safari) value = value / 3; - } - - var now = (window.performance || Date).now(), - timeDelta = now - (this._time || 0); - - this._pos = DOM.mousePos(this._el, e); - this._time = now; - - if (value !== 0 && (value % 4.000244140625) === 0) { - // This one is definitely a mouse wheel event. - this._type = 'wheel'; - // Normalize this value to match trackpad. - value = Math.floor(value / 4); - - } else if (value !== 0 && Math.abs(value) < 4) { - // This one is definitely a trackpad event because it is so small. - this._type = 'trackpad'; - - } else if (timeDelta > 400) { - // This is likely a new scroll action. - this._type = null; - this._lastValue = value; - - // Start a timeout in case this was a singular event, and dely it by up to 40ms. - this._timeout = setTimeout(this._onTimeout, 40); - - } else if (!this._type) { - // This is a repeating event, but we don't know the type of event just yet. - // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. - this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; - - // Make sure our delayed event isn't fired again, because we accumulate - // the previous event (which was less than 40ms ago) into this event. - if (this._timeout) { - clearTimeout(this._timeout); - this._timeout = null; - value += this._lastValue; - } - } - - // Slow down zoom if shift key is held for more precise zooming - if (e.shiftKey && value) value = value / 4; - - // Only fire the callback if we actually know what type of scrolling device the user uses. - if (this._type) this._zoom(-value); - - e.preventDefault(); - }, - - _onTimeout: function () { - this._type = 'wheel'; - this._zoom(-this._lastValue); - }, - - _zoom: function (delta) { - var map = this._map; - - // Scale by sigmoid of scroll wheel delta. - var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100))); - if (delta < 0 && scale !== 0) scale = 1 / scale; - - var fromScale = map.ease ? map.ease.to : map.transform.scale, - targetZoom = map.transform.scaleZoom(fromScale * scale); - - map.zoomTo(targetZoom, { - duration: 0, - around: map.unproject(this._pos) - }); - } -}; - -},{"../../util/browser":92,"../../util/dom":95,"../../util/util":103}],86:[function(require,module,exports){ -'use strict'; - -/* - * Adds positional coordinates to URL hashes. Passed as an option to the map object - * - * @class mapboxgl.Hash - * @returns {Hash} `this` - */ -module.exports = Hash; - -var util = require('../util/util'); - -function Hash() { - util.bindAll([ - '_onHashChange', - '_updateHash' - ], this); -} - -Hash.prototype = { - /* Map element to listen for coordinate changes - * - * @param {Object} map - * @returns {Hash} `this` - */ - addTo: function(map) { - this._map = map; - window.addEventListener('hashchange', this._onHashChange, false); - this._map.on('moveend', this._updateHash); - return this; - }, - - /* Removes hash - * - * @returns {Popup} `this` - */ - remove: function() { - window.removeEventListener('hashchange', this._onHashChange, false); - this._map.off('moveend', this._updateHash); - delete this._map; - return this; - }, - - _onHashChange: function() { - var loc = location.hash.replace('#', '').split('/'); - if (loc.length >= 3) { - this._map.jumpTo({ - center: [+loc[1], +loc[2]], - zoom: +loc[0], - bearing: +(loc[3] || 0) - }); - return true; - } - return false; - }, - - _updateHash: function() { - var center = this._map.getCenter(), - zoom = this._map.getZoom(), - bearing = this._map.getBearing(), - precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)), - - hash = '#' + (Math.round(zoom * 100) / 100) + - '/' + center.lat.toFixed(precision) + - '/' + center.lng.toFixed(precision) + - (bearing ? '/' + (Math.round(bearing * 10) / 10) : ''); - - window.history.replaceState('', '', hash); - } -}; - -},{"../util/util":103}],87:[function(require,module,exports){ -'use strict'; - -var handlers = { - scrollZoom: require('./handler/scroll_zoom'), - boxZoom: require('./handler/box_zoom'), - dragRotate: require('./handler/drag_rotate'), - dragPan: require('./handler/drag_pan'), - keyboard: require('./handler/keyboard'), - doubleClickZoom: require('./handler/dblclick_zoom'), - pinch: require('./handler/pinch') -}; - -var DOM = require('../util/dom'), - util = require('../util/util'); - -module.exports = Interaction; - -/** - * Mouse move event. - * - * @event mousemove - * @memberof Map - * @type {Object} - * @property {Point} point the pixel location of the event - * @property {LatLng} point the geographic location of the event - * @property {Event} originalEvent the original DOM event - */ - -/** - * Click event. - * - * @event click - * @memberof Map - * @type {Object} - * @property {Point} point the pixel location of the event - * @property {LatLng} point the geographic location of the event - * @property {Event} originalEvent the original DOM event - */ - -/** - * Double click event. - * - * @event dblclick - * @memberof Map - * @type {Object} - * @property {Point} point the pixel location of the event - * @property {LatLng} point the geographic location of the event - * @property {Event} originalEvent the original DOM event - */ - -function Interaction(map) { - this._map = map; - this._el = map.getCanvasContainer(); - - for (var name in handlers) { - map[name] = new handlers[name](map); - } - - util.bindHandlers(this); -} - -Interaction.prototype = { - enable: function () { - var options = this._map.options, - el = this._el; - - for (var name in handlers) { - if (options[name]) this._map[name].enable(); - } - - el.addEventListener('mousedown', this._onMouseDown, false); - el.addEventListener('touchstart', this._onTouchStart, false); - el.addEventListener('click', this._onClick, false); - el.addEventListener('mousemove', this._onMouseMove, false); - el.addEventListener('dblclick', this._onDblClick, false); - }, - - disable: function () { - var options = this._map.options, - el = this._el; - - for (var name in handlers) { - if (options[name]) this._map[name].disable(); - } - - el.removeEventListener('mousedown', this._onMouseDown); - el.removeEventListener('touchstart', this._onTouchStart); - el.removeEventListener('click', this._onClick); - el.removeEventListener('mousemove', this._onMouseMove); - el.removeEventListener('dblclick', this._onDblClick); - }, - - _onMouseDown: function (e) { - this._startPos = DOM.mousePos(this._el, e); - }, - - _onTouchStart: function (e) { - if (!e.touches || e.touches.length > 1) return; - - if (!this._tapped) { - this._tapped = setTimeout(this._onTimeout, 300); - - } else { - clearTimeout(this._tapped); - this._tapped = null; - this._fireEvent('dblclick', e); - } - }, - - _onTimeout: function () { - this._tapped = null; - }, - - _onMouseMove: function (e) { - var map = this._map, - el = this._el; - - if (map.dragPan.active || map.dragRotate.active) return; - - var target = e.toElement || e.target; - while (target && target !== el) target = target.parentNode; - if (target !== el) return; - - this._fireEvent('mousemove', e); - }, - - _onClick: function (e) { - var pos = DOM.mousePos(this._el, e); - - if (pos.equals(this._startPos)) { - this._fireEvent('click', e); - } - }, - - _onDblClick: function (e) { - this._fireEvent('dblclick', e); - e.preventDefault(); - }, - - _fireEvent: function (type, e) { - var pos = DOM.mousePos(this._el, e); - - this._map.fire(type, { - latLng: this._map.unproject(pos), - point: pos, - originalEvent: e - }); - } -}; - -},{"../util/dom":95,"../util/util":103,"./handler/box_zoom":79,"./handler/dblclick_zoom":80,"./handler/drag_pan":81,"./handler/drag_rotate":82,"./handler/keyboard":83,"./handler/pinch":84,"./handler/scroll_zoom":85}],88:[function(require,module,exports){ -'use strict'; - -var Canvas = require('../util/canvas'); -var util = require('../util/util'); -var browser = require('../util/browser'); -var Evented = require('../util/evented'); -var DOM = require('../util/dom'); - -var Style = require('../style/style'); -var AnimationLoop = require('../style/animation_loop'); -var Painter = require('../render/painter'); - -var Transform = require('../geo/transform'); -var Hash = require('./hash'); - -var Interaction = require('./interaction'); - -var Camera = require('./camera'); -var LatLng = require('../geo/lat_lng'); -var LatLngBounds = require('../geo/lat_lng_bounds'); -var Point = require('point-geometry'); -var Attribution = require('./control/attribution'); - -/** - * Options common to Map#addClass, Map#removeClass, and Map#setClasses, controlling - * whether or not to smoothly transition property changes triggered by the class change. - * - * @typedef {Object} StyleOptions - * @property {boolean} transition - */ - -/** - * Creates a map instance. - * @class Map - * @param {Object} options - * @param {string} options.container HTML element to initialize the map in (or element id as string) - * @param {number} [options.minZoom=0] Minimum zoom of the map - * @param {number} [options.maxZoom=20] Maximum zoom of the map - * @param {Object} options.style Map style and data source definition (either a JSON object or a JSON URL), described in the [style reference](https://mapbox.com/mapbox-gl-style-spec/) - * @param {boolean} [options.hash=false] If `true`, the map will track and update the page URL according to map position - * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners are attached to the map, so it will not respond to input - * @param {number} [options.bearingSnap=7] Snap to north threshold in degrees. - * @param {Array} options.classes Style class names with which to initialize the map - * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected. - * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, The maps canvas can be exported to a PNG using `map.getCanvas().toDataURL();`. This is false by default as a performance optimization. - * @example - * var map = new mapboxgl.Map({ - * container: 'map', - * center: [37.772537, -122.420679], - * zoom: 13, - * style: style_object, - * hash: true - * }); - */ -var Map = module.exports = function(options) { - - options = this.options = util.inherit(this.options, options); - - this.animationLoop = new AnimationLoop(); - this.transform = new Transform(options.minZoom, options.maxZoom); - - if (options.maxBounds) { - var b = LatLngBounds.convert(options.maxBounds); - this.transform.latRange = [b.getSouth(), b.getNorth()]; - this.transform.lngRange = [b.getWest(), b.getEast()]; - } - - util.bindAll([ - '_forwardStyleEvent', - '_forwardSourceEvent', - '_forwardLayerEvent', - '_forwardTileEvent', - '_onStyleLoad', - '_onStyleChange', - '_onSourceAdd', - '_onSourceRemove', - '_onSourceUpdate', - 'update', - 'render' - ], this); - - this._setupContainer(); - this._setupPainter(); - - this.on('move', this.update); - this.on('zoom', this.update.bind(this, true)); - this.on('moveend', function() { - this.animationLoop.set(300); // text fading - this._rerender(); - }.bind(this)); - - if (typeof window !== 'undefined') { - window.addEventListener('resize', function () { - this.stop().resize().update(); - }.bind(this), false); - } - - this.interaction = new Interaction(this); - - if (options.interactive) { - this.interaction.enable(); - } - - this._hash = options.hash && (new Hash()).addTo(this); - // don't set position from options if set through hash - if (!this._hash || !this._hash._onHashChange()) { - this.jumpTo(options); - } - - this.sources = {}; - this.stacks = {}; - this._classes = {}; - - this.resize(); - - if (options.classes) this.setClasses(options.classes); - if (options.style) this.setStyle(options.style); - if (options.attributionControl) this.addControl(new Attribution()); -}; - -util.extend(Map.prototype, Evented); -util.extend(Map.prototype, Camera.prototype); -util.extend(Map.prototype, /** @lends Map.prototype */{ - - options: { - center: [0, 0], - zoom: 0, - bearing: 0, - pitch: 0, - - minZoom: 0, - maxZoom: 20, - - interactive: true, - - scrollZoom: true, - boxZoom: true, - dragRotate: true, - dragPan: true, - keyboard: true, - doubleClickZoom: true, - pinch: true, - - bearingSnap: 7, - - hash: false, - - attributionControl: true, - - failIfMajorPerformanceCaveat: false, - preserveDrawingBuffer: false - }, - - addControl: function(control) { - control.addTo(this); - return this; - }, - - /** - * Adds a style class to a map - * - * @param {string} klass name of style class - * @param {StyleOptions} [options] - * @fires change - * @returns {Map} `this` - */ - addClass: function(klass, options) { - if (this._classes[klass]) return; - this._classes[klass] = true; - if (this.style) this.style._cascade(this._classes, options); - }, - - /** - * Removes a style class from a map - * - * @param {string} klass name of style class - * @param {StyleOptions} [options] - * @fires change - * @returns {Map} `this` - */ - removeClass: function(klass, options) { - if (!this._classes[klass]) return; - delete this._classes[klass]; - if (this.style) this.style._cascade(this._classes, options); - }, - - /** - * Helper method to add more than one class - * - * @param {Array} klasses An array of class names - * @param {StyleOptions} [options] - * @fires change - * @returns {Map} `this` - */ - setClasses: function(klasses, options) { - this._classes = {}; - for (var i = 0; i < klasses.length; i++) { - this._classes[klasses[i]] = true; - } - if (this.style) this.style._cascade(this._classes, options); - }, - - /** - * Check whether a style class is active - * - * @param {string} klass Name of style class - * @returns {boolean} - */ - hasClass: function(klass) { - return !!this._classes[klass]; - }, - - /** - * Return an array of the current active style classes - * - * @returns {boolean} - */ - getClasses: function() { - return Object.keys(this._classes); - }, - - /** - * Detect the map's new width and height and resize it. - * - * @returns {Map} `this` - */ - resize: function() { - var width = 0, height = 0; - - if (this._container) { - width = this._container.offsetWidth || 400; - height = this._container.offsetHeight || 300; - } - - this._canvas.resize(width, height); - - this.transform.width = width; - this.transform.height = height; - this.transform._constrain(); - - this.painter.resize(width, height); - - return this - .fire('movestart') - .fire('move') - .fire('resize') - .fire('moveend'); - }, - - /** - * Get the map's geographical bounds - * - * @returns {LatLngBounds} - */ - getBounds: function() { - return new LatLngBounds( - this.transform.pointLocation(new Point(0, 0)), - this.transform.pointLocation(this.transform.size)); - }, - - /** - * Get pixel coordinates (relative to map container) given a geographical location - * - * @param {LatLng} latlng - * @returns {Object} `x` and `y` coordinates - */ - project: function(latlng) { - return this.transform.locationPoint(LatLng.convert(latlng)); - }, - - /** - * Get geographical coordinates given pixel coordinates - * - * @param {Array} point [x, y] pixel coordinates - * @returns {LatLng} - */ - unproject: function(point) { - return this.transform.pointLocation(Point.convert(point)); - }, - - /** - * Get all features at a point ([x, y]) - * - * @param {Array} point [x, y] pixel coordinates - * @param {Object} params - * @param {number} [params.radius=0] Optional. Radius in pixels to search in - * @param {string} params.layer Optional. Only return features from a given layer - * @param {string} params.type Optional. Either `raster` or `vector` - * @param {featuresAtCallback} callback function that returns the response - * - * @callback featuresAtCallback - * @param {Object|null} err Error _If any_ - * @param {Array} features Displays a JSON array of features given the passed parameters of `featuresAt` - * - * @returns {Map} `this` - * - * @example - * map.featuresAt([10, 20], { radius: 10 }, function(err, features) { - * console.log(features); - * }); - */ - featuresAt: function(point, params, callback) { - var coord = this.transform.pointCoordinate(Point.convert(point)); - this.style.featuresAt(coord, params, callback); - return this; - }, - - /** - * Apply multiple style mutations in a batch - * - * map.batch(function (batch) { - * batch.addLayer(layer1); - * batch.addLayer(layer2); - * ... - * batch.addLayer(layerN); - * }); - * - * @param {function} work Function which accepts the StyleBatch interface - */ - batch: function(work) { - this.style.batch(work); - - this.style._cascade(this._classes); - this.update(true); - }, - - /** - * Replaces the map's style object - * - * @param {Object} style A style object formatted as JSON - * @returns {Map} `this` - */ - setStyle: function(style) { - if (this.style) { - this.style - .off('load', this._onStyleLoad) - .off('error', this._forwardStyleEvent) - .off('change', this._onStyleChange) - .off('source.add', this._onSourceAdd) - .off('source.remove', this._onSourceRemove) - .off('source.load', this._onSourceUpdate) - .off('source.error', this._forwardSourceEvent) - .off('source.change', this._onSourceUpdate) - .off('layer.add', this._forwardLayerEvent) - .off('layer.remove', this._forwardLayerEvent) - .off('tile.add', this._forwardTileEvent) - .off('tile.remove', this._forwardTileEvent) - .off('tile.load', this.update) - .off('tile.error', this._forwardTileEvent) - ._remove(); - - this.off('rotate', this.style._redoPlacement); - this.off('pitch', this.style._redoPlacement); - } - - if (!style) { - this.style = null; - return this; - } else if (style instanceof Style) { - this.style = style; - } else { - this.style = new Style(style, this.animationLoop); - } - - this.style - .on('load', this._onStyleLoad) - .on('error', this._forwardStyleEvent) - .on('change', this._onStyleChange) - .on('source.add', this._onSourceAdd) - .on('source.remove', this._onSourceRemove) - .on('source.load', this._onSourceUpdate) - .on('source.error', this._forwardSourceEvent) - .on('source.change', this._onSourceUpdate) - .on('layer.add', this._forwardLayerEvent) - .on('layer.remove', this._forwardLayerEvent) - .on('tile.add', this._forwardTileEvent) - .on('tile.remove', this._forwardTileEvent) - .on('tile.load', this.update) - .on('tile.error', this._forwardTileEvent); - - this.on('rotate', this.style._redoPlacement); - this.on('pitch', this.style._redoPlacement); - - return this; - }, - - /** - * Add a source to the map style. - * - * @param {string} id ID of the source. Must not be used by any existing source. - * @param {Object} source source specification, following the - * [Mapbox GL Style Reference](https://www.mapbox.com/mapbox-gl-style-spec/#sources) - * @fires source.add - * @returns {Map} `this` - */ - addSource: function(id, source) { - this.style.addSource(id, source); - return this; - }, - - /** - * Remove an existing source from the map style. - * - * @param {string} id ID of the source to remove - * @fires source.remove - * @returns {Map} `this` - */ - removeSource: function(id) { - this.style.removeSource(id); - return this; - }, - - /** - * Return the style source object with the given `id`. - * - * @param {string} id source ID - * @returns {Object} - */ - getSource: function(id) { - return this.style.getSource(id); - }, - - /** - * Add a layer to the map style. The layer will be inserted before the layer with - * ID `before`, or appended if `before` is omitted. - * @param {StyleLayer|Object} layer - * @param {string=} before ID of an existing layer to insert before - * @fires layer.add - * @returns {Map} `this` - */ - addLayer: function(layer, before) { - this.style.addLayer(layer, before); - this.style._cascade(this._classes); - return this; - }, - - /** - * Remove the layer with the given `id` from the map. Any layers which refer to the - * specified layer via a `ref` property are also removed. - * - * @param {string} id layer id - * @fires layer.remove - * @returns {Map} this - */ - removeLayer: function(id) { - this.style.removeLayer(id); - this.style._cascade(this._classes); - return this; - }, - - /** - * Set the filter for a given style layer. - * - * @param {string} layer ID of a layer - * @param {Array} filter filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter) - * @returns {Map} `this` - */ - setFilter: function(layer, filter) { - this.style.setFilter(layer, filter); - return this; - }, - - /** - * Set the zoom extent for a given style layer. - * - * @param {string} layerId ID of a layer - * @param {number} minzoom minimum zoom extent - * @param {number} maxzoom maximum zoom extent - * @returns {Map} `this` - */ - setLayerZoomRange: function(layerId, minzoom, maxzoom) { - this.style.setLayerZoomRange(layerId, minzoom, maxzoom); - return this; - }, - - /** - * Get the filter for a given style layer. - * - * @param {string} layer ID of a layer - * @returns {Array} filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter) - */ - getFilter: function(layer) { - return this.style.getFilter(layer); - }, - - /** - * Set the value of a paint property in a given style layer. - * - * @param {string} layer ID of a layer - * @param {string} name name of a paint property - * @param {*} value value for the paint propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/) - * @param {string=} klass optional class specifier for the property - * @returns {Map} `this` - */ - setPaintProperty: function(layer, name, value, klass) { - this.style.setPaintProperty(layer, name, value, klass); - this.style._cascade(this._classes); - this.update(true); - return this; - }, - - /** - * Get the value of a paint property in a given style layer. - * - * @param {string} layer ID of a layer - * @param {string} name name of a paint property - * @param {string=} klass optional class specifier for the property - * @returns {*} value for the paint propery - */ - getPaintProperty: function(layer, name, klass) { - return this.style.getPaintProperty(layer, name, klass); - }, - - /** - * Set the value of a layout property in a given style layer. - * - * @param {string} layer ID of a layer - * @param {string} name name of a layout property - * @param {*} value value for the layout propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/) - * @returns {Map} `this` - */ - setLayoutProperty: function(layer, name, value) { - this.style.setLayoutProperty(layer, name, value); - return this; - }, - - /** - * Get the value of a layout property in a given style layer. - * - * @param {string} layer ID of a layer - * @param {string} name name of a layout property - * @param {string=} klass optional class specifier for the property - * @returns {*} value for the layout propery - */ - getLayoutProperty: function(layer, name) { - return this.style.getLayoutProperty(layer, name); - }, - - /** - * Get the Map's container as an HTML element - * @returns {HTMLElement} container - */ - getContainer: function() { - return this._container; - }, - - /** - * Get the container for the map `canvas` element. - * - * If you want to add non-GL overlays to the map, you should append them to this element. This - * is the element to which event bindings for map interactivity such as panning and zooming are - * attached. It will receive bubbled events for child elements such as the `canvas`, but not for - * map controls. - * - * @returns {HTMLElement} container - */ - getCanvasContainer: function() { - return this._canvasContainer; - }, - - /** - * Get the Map's canvas as an HTML canvas - * @returns {HTMLElement} canvas - */ - getCanvas: function() { - return this._canvas.getElement(); - }, - - _setupContainer: function() { - var id = this.options.container; - - var container = this._container = typeof id === 'string' ? document.getElementById(id) : id; - container.classList.add('mapboxgl-map'); - - var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); - if (this.options.interactive) { - canvasContainer.classList.add('mapboxgl-interactive'); - } - this._canvas = new Canvas(this, canvasContainer); - - var controlContainer = DOM.create('div', 'mapboxgl-control-container', container); - var corners = this._controlCorners = {}; - ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) { - corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer); - }); - }, - - _setupPainter: function() { - var gl = this._canvas.getWebGLContext({ - failIfMajorPerformanceCaveat: this.options.failIfMajorPerformanceCaveat, - preserveDrawingBuffer: this.options.preserveDrawingBuffer - }); - - if (!gl) { - console.error('Failed to initialize WebGL'); - return; - } - - this.painter = new Painter(gl, this.transform); - }, - - _contextLost: function(event) { - event.preventDefault(); - if (this._frameId) { - browser.cancelFrame(this._frameId); - } - }, - - _contextRestored: function() { - this._setupPainter(); - this.resize(); - this.update(); - }, - - /** - * Is this map fully loaded? If the style isn't loaded - * or it has a change to the sources or style that isn't - * propagated to its style, return false. - * - * @returns {boolean} whether the map is loaded - */ - loaded: function() { - if (this._styleDirty || this._sourcesDirty) - return false; - if (this.style && !this.style.loaded()) - return false; - return true; - }, - - /** - * Update this map's style and re-render the map. - * - * @param {Object} updateStyle new style - * @returns {Map} this - */ - update: function(updateStyle) { - if (!this.style) return this; - - this._styleDirty = this._styleDirty || updateStyle; - this._sourcesDirty = true; - - this._rerender(); - - return this; - }, - - /** - * Call when a (re-)render of the map is required, e.g. when the - * user panned or zoomed,f or new data is available. - * @returns {Map} this - */ - render: function() { - if (this.style && this._styleDirty) { - this._styleDirty = false; - this.style._recalculate(this.transform.zoom); - } - - if (this.style && this._sourcesDirty && !this._sourcesDirtyTimeout) { - this._sourcesDirty = false; - this._sourcesDirtyTimeout = setTimeout(function() { - this._sourcesDirtyTimeout = null; - }.bind(this), 50); - this.style._updateSources(this.transform); - } - - this.painter.render(this.style, { - debug: this.debug, - vertices: this.vertices, - rotating: this.rotating, - zooming: this.zooming - }); - - this.fire('render'); - - if (this.loaded() && !this._loaded) { - this._loaded = true; - this.fire('load'); - } - - this._frameId = null; - - if (!this.animationLoop.stopped()) { - this._styleDirty = true; - } - - if (this._sourcesDirty || this._repaint || !this.animationLoop.stopped()) { - this._rerender(); - } - - return this; - }, - - /** - * Destroys the map's underlying resources, including web workers. - * @returns {Map} this - */ - remove: function() { - if (this._hash) this._hash.remove(); - browser.cancelFrame(this._frameId); - clearTimeout(this._sourcesDirtyTimeout); - this.setStyle(null); - return this; - }, - - _rerender: function() { - if (this.style && !this._frameId) { - this._frameId = browser.frame(this.render); - } - }, - - _forwardStyleEvent: function(e) { - this.fire('style.' + e.type, util.extend({style: e.target}, e)); - }, - - _forwardSourceEvent: function(e) { - this.fire(e.type, util.extend({style: e.target}, e)); - }, - - _forwardLayerEvent: function(e) { - this.fire(e.type, util.extend({style: e.target}, e)); - }, - - _forwardTileEvent: function(e) { - this.fire(e.type, util.extend({style: e.target}, e)); - }, - - _onStyleLoad: function(e) { - this.style._cascade(this._classes, {transition: false}); - this._forwardStyleEvent(e); - }, - - _onStyleChange: function(e) { - this.update(true); - this._forwardStyleEvent(e); - }, - - _onSourceAdd: function(e) { - var source = e.source; - if (source.onAdd) - source.onAdd(this); - this._forwardSourceEvent(e); - }, - - _onSourceRemove: function(e) { - var source = e.source; - if (source.onRemove) - source.onRemove(this); - this._forwardSourceEvent(e); - }, - - _onSourceUpdate: function(e) { - this.update(); - this._forwardSourceEvent(e); - } -}); - -util.extendAll(Map.prototype, /** @lends Map.prototype */{ - - /** - * Enable debugging mode - * - * @name debug - * @type {boolean} - */ - _debug: false, - get debug() { return this._debug; }, - set debug(value) { this._debug = value; this.update(); }, - - /** - * Show collision boxes: useful for debugging label placement - * in styles. - * - * @name collisionDebug - * @type {boolean} - */ - _collisionDebug: false, - get collisionDebug() { return this._collisionDebug; }, - set collisionDebug(value) { - this._collisionDebug = value; - for (var i in this.style.sources) { - this.style.sources[i].reload(); - } - this.update(); - }, - - /** - * Enable continuous repaint to analyze performance - * - * @name repaint - * @type {boolean} - */ - _repaint: false, - get repaint() { return this._repaint; }, - set repaint(value) { this._repaint = value; this.update(); }, - - // show vertices - _vertices: false, - get vertices() { return this._vertices; }, - set vertices(value) { this._vertices = value; this.update(); } -}); - -},{"../geo/lat_lng":18,"../geo/lat_lng_bounds":19,"../geo/transform":20,"../render/painter":34,"../style/animation_loop":47,"../style/style":52,"../util/browser":92,"../util/canvas":93,"../util/dom":95,"../util/evented":97,"../util/util":103,"./camera":75,"./control/attribution":76,"./hash":86,"./interaction":87,"point-geometry":134}],89:[function(require,module,exports){ -'use strict'; - -module.exports = Popup; - -var util = require('../util/util'); -var Evented = require('../util/evented'); -var DOM = require('../util/dom'); -var LatLng = require('../geo/lat_lng'); - -/** - * Creates a popup component - * @class Popup - * @param {Object} options - * @param {boolean} options.closeButton - * @param {boolean} options.closeOnClick - * @example - * var tooltip = new mapboxgl.Popup() - * .setLatLng(map.unproject(e.point)) - * .setHTML("

Hello World!

") - * .addTo(map); - */ -function Popup(options) { - util.setOptions(this, options); - util.bindAll([ - '_updatePosition', - '_onClickClose'], - this); -} - -Popup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{ - options: { - closeButton: true, - closeOnClick: true - }, - - /** - * Attaches the popup to a map - * @param {Map} map - * @returns {Popup} `this` - */ - addTo: function(map) { - this._map = map; - this._map.on('move', this._updatePosition); - if (this.options.closeOnClick) { - this._map.on('click', this._onClickClose); - } - this._update(); - return this; - }, - - /** - * Removes the popup from the map - * @example - * var popup = new mapboxgl.Popup().addTo(map); - * popup.remove(); - * @returns {Popup} `this` - */ - remove: function() { - if (this._container) { - this._container.parentNode.removeChild(this._container); - } - - if (this._map) { - this._map.off('move', this._updatePosition); - this._map.off('click', this._onClickClose); - delete this._map; - } - - return this; - }, - - /** - * Get the current coordinates of popup element relative to map - * @returns {LatLng} - */ - getLatLng: function() { - return this._latLng; - }, - - /** - * Set the coordinates of a popup element to a map - * @param {LatLng} latlng - * @returns {Popup} `this` - */ - setLatLng: function(latlng) { - this._latLng = LatLng.convert(latlng); - this._update(); - return this; - }, - - /** - * Fill a popup element with text only content - * @param {string} text - * @returns {Popup} `this` - */ - setText: function(text) { - this._content = document.createTextNode(text); - this._updateContent(); - return this; - }, - - /** - * Fill a popup element with HTML content - * @param {string} html - * @returns {Popup} `this` - */ - setHTML: function(html) { - this._content = document.createDocumentFragment(); - - var temp = document.createElement('body'), child; - temp.innerHTML = html; - while (true) { - child = temp.firstChild; - if (!child) break; - this._content.appendChild(child); - } - - this._updateContent(); - return this; - }, - - _update: function() { - if (!this._map) { return; } - - if (!this._container) { - this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); - - this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); - this._wrapper = DOM.create('div', 'mapboxgl-popup-content', this._container); - - if (this.options.closeButton) { - this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._wrapper); - this._closeButton.innerHTML = '×'; - this._closeButton.addEventListener('click', this._onClickClose); - } - } - - this._updateContent(); - this._updatePosition(); - }, - - _updateContent: function() { - if (!this._content || !this._container) { return; } - - var node = this._wrapper; - - while (node.hasChildNodes()) { - node.removeChild(node.firstChild); - } - - if (this.options.closeButton) { - node.appendChild(this._closeButton); - } - - node.appendChild(this._content); - }, - - _updatePosition: function() { - if (!this._latLng || !this._container) { return; } - - var pos = this._map.project(this._latLng).round(), - anchor = this.options.anchor; - - if (!anchor) { - var width = this._container.offsetWidth, - height = this._container.offsetHeight; - - if (pos.y < height) { - anchor = ['top']; - } else if (pos.y > this._map.transform.height - height) { - anchor = ['bottom']; - } else { - anchor = []; - } - - if (pos.x < width / 2) { - anchor.push('left'); - } else if (pos.x > this._map.transform.width - width / 2) { - anchor.push('right'); - } - - if (anchor.length === 0) { - anchor = 'bottom'; - } else { - anchor = anchor.join('-'); - } - - this.options.anchor = anchor; - } - - var anchorTranslate = { - 'top': 'translate(-50%,0)', - 'top-left': 'translate(0,0)', - 'top-right': 'translate(-100%,0)', - 'bottom': 'translate(-50%,-100%)', - 'bottom-left': 'translate(0,-100%)', - 'bottom-right': 'translate(-100%,-100%)', - 'left': 'translate(0,-50%)', - 'right': 'translate(-100%,-50%)' - }; - - var classList = this._container.classList; - for (var key in anchorTranslate) { - classList.remove('mapboxgl-popup-anchor-' + key); - } - classList.add('mapboxgl-popup-anchor-' + anchor); - - DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + pos.x + 'px,' + pos.y + 'px)'); - }, - - _onClickClose: function() { - this.remove(); - } -}); - -},{"../geo/lat_lng":18,"../util/dom":95,"../util/evented":97,"../util/util":103}],90:[function(require,module,exports){ -'use strict'; - -module.exports = Actor; - -/** - * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) - * that maintains the relationship between asynchronous tasks and the objects - * that spin them off - in this case, tasks like parsing parts of styles, - * owned by the styles - * - * @param {WebWorker} target - * @param {WebWorker} parent - * @private - */ -function Actor(target, parent) { - this.target = target; - this.parent = parent; - this.callbacks = {}; - this.callbackID = 0; - this.receive = this.receive.bind(this); - this.target.addEventListener('message', this.receive, false); -} - -Actor.prototype.receive = function(message) { - var data = message.data, - callback; - - if (data.type === '') { - callback = this.callbacks[data.id]; - delete this.callbacks[data.id]; - callback(data.error || null, data.data); - } else if (typeof data.id !== 'undefined') { - var id = data.id; - this.parent[data.type](data.data, function(err, data, buffers) { - this.postMessage({ - type: '', - id: String(id), - error: err ? String(err) : null, - data: data - }, buffers); - }.bind(this)); - } else { - this.parent[data.type](data.data); - } -}; - -Actor.prototype.send = function(type, data, callback, buffers) { - var id = null; - if (callback) this.callbacks[id = this.callbackID++] = callback; - this.postMessage({ type: type, id: String(id), data: data }, buffers); -}; - -/** - * Wrapped postMessage API that abstracts around IE's lack of - * `transferList` support. - * - * @param {Object} message - * @param {Object} transferList - * @private - */ -Actor.prototype.postMessage = function(message, transferList) { - try { - this.target.postMessage(message, transferList); - } catch (e) { - this.target.postMessage(message); // No support for transferList on IE - } -}; - -},{}],91:[function(require,module,exports){ -'use strict'; - -exports.getJSON = function(url, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.onerror = function(e) { - callback(e); - }; - xhr.onload = function() { - if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { - var data; - try { - data = JSON.parse(xhr.response); - } catch (err) { - return callback(err); - } - callback(null, data); - } else { - callback(new Error(xhr.statusText)); - } - }; - xhr.send(); - return xhr; -}; - -exports.getArrayBuffer = function(url, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onerror = function(e) { - callback(e); - }; - xhr.onload = function() { - if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { - callback(null, xhr.response); - } else { - callback(new Error(xhr.statusText)); - } - }; - xhr.send(); - return xhr; -}; - -function sameOrigin(url) { - var a = document.createElement('a'); - a.href = url; - return a.protocol === document.location.protocol && a.host === document.location.host; -} - -exports.getImage = function(url, callback) { - var img = new Image(); - if (!sameOrigin(url)) { - img.crossOrigin = 'Anonymous'; - } - img.onload = function() { - callback(null, img); - }; - img.src = url; - img.getData = function() { - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); - canvas.width = img.width; - canvas.height = img.height; - context.drawImage(img, 0, 0); - return context.getImageData(0, 0, img.width, img.height).data; - }; - return img; -}; - -exports.getVideo = function(urls, callback) { - var video = document.createElement('video'); - video.onloadstart = function() { - callback(null, video); - }; - for (var i = 0; i < urls.length; i++) { - var s = document.createElement('source'); - if (!sameOrigin(urls[i])) { - video.crossOrigin = 'Anonymous'; - } - s.src = urls[i]; - video.appendChild(s); - } - video.getData = function() { return video; }; - return video; -}; - -},{}],92:[function(require,module,exports){ -'use strict'; - -var Canvas = require('./canvas'); - -var frame = window.requestAnimationFrame || - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - window.msRequestAnimationFrame; - -exports.frame = function(fn) { - return frame(fn); -}; - -var cancel = window.cancelAnimationFrame || - window.mozCancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.msCancelAnimationFrame; - -exports.cancelFrame = function(id) { - cancel(id); -}; - -exports.timed = function (fn, dur, ctx) { - if (!dur) { - fn.call(ctx, 1); - return null; - } - - var abort = false, - start = window.performance ? window.performance.now() : Date.now(); - - function tick(now) { - if (abort) return; - if (!window.performance) now = Date.now(); - - if (now >= start + dur) { - fn.call(ctx, 1); - } else { - fn.call(ctx, (now - start) / dur); - exports.frame(tick); - } - } - - exports.frame(tick); - - return function() { abort = true; }; -}; - -/** - * Test whether the basic JavaScript and DOM features required for Mapbox GL are present. - * @param {Object} options - * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected. - * @return {boolean} Returns true if Mapbox GL should be expected to work, and false if not. - * @memberof mapboxgl - * @static - */ -exports.supported = function(options) { - - var supports = [ - - function() { return typeof window !== 'undefined'; }, - - function() { return typeof document !== 'undefined'; }, - - function () { - return !!(Array.prototype && - Array.prototype.every && - Array.prototype.filter && - Array.prototype.forEach && - Array.prototype.indexOf && - Array.prototype.lastIndexOf && - Array.prototype.map && - Array.prototype.some && - Array.prototype.reduce && - Array.prototype.reduceRight && - Array.isArray); - }, - - function() { - return !!(Function.prototype && Function.prototype.bind) && - !!(Object.keys && - Object.create && - Object.getPrototypeOf && - Object.getOwnPropertyNames && - Object.isSealed && - Object.isFrozen && - Object.isExtensible && - Object.getOwnPropertyDescriptor && - Object.defineProperty && - Object.defineProperties && - Object.seal && - Object.freeze && - Object.preventExtensions); - }, - - function() { - return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; - }, - - function() { - return new Canvas().supportsWebGLContext((options && options.failIfMajorPerformanceCaveat) || false); - }, - - function() { return 'Worker' in window; } - ]; - - for (var i = 0; i < supports.length; i++) { - if (!supports[i]()) return false; - } - return true; -}; - -exports.hardwareConcurrency = navigator.hardwareConcurrency || 8; - -Object.defineProperty(exports, 'devicePixelRatio', { - get: function() { return window.devicePixelRatio; } -}); - -},{"./canvas":93}],93:[function(require,module,exports){ -'use strict'; - -var util = require('../util'); - -module.exports = Canvas; - -function Canvas(parent, container) { - this.canvas = document.createElement('canvas'); - - if (parent && container) { - this.canvas.style.position = 'absolute'; - this.canvas.classList.add('mapboxgl-canvas'); - this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false); - this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false); - this.canvas.setAttribute('tabindex', 0); - container.appendChild(this.canvas); - } -} - -Canvas.prototype.resize = function(width, height) { - var pixelRatio = window.devicePixelRatio || 1; - - // Request the required canvas size taking the pixelratio into account. - this.canvas.width = pixelRatio * width; - this.canvas.height = pixelRatio * height; - - // Maintain the same canvas size, potentially downscaling it for HiDPI displays - this.canvas.style.width = width + 'px'; - this.canvas.style.height = height + 'px'; -}; - -var requiredContextAttributes = { - antialias: false, - alpha: true, - stencil: true, - depth: false -}; - -Canvas.prototype.getWebGLContext = function(attributes) { - attributes = util.extend({}, attributes, requiredContextAttributes); - - return this.canvas.getContext('webgl', attributes) || - this.canvas.getContext('experimental-webgl', attributes); -}; - -Canvas.prototype.supportsWebGLContext = function(failIfMajorPerformanceCaveat) { - var attributes = util.extend({ - failIfMajorPerformanceCaveat: failIfMajorPerformanceCaveat - }, requiredContextAttributes); - - if ('probablySupportsContext' in this.canvas) { - return this.canvas.probablySupportsContext('webgl', attributes) || - this.canvas.probablySupportsContext('experimental-webgl', attributes); - } else if ('supportsContext' in this.canvas) { - return this.canvas.supportsContext('webgl', attributes) || - this.canvas.supportsContext('experimental-webgl', attributes); - } - - return !!window.WebGLRenderingContext && !!this.getWebGLContext(failIfMajorPerformanceCaveat); -}; - -Canvas.prototype.getElement = function() { - return this.canvas; -}; - -},{"../util":103}],94:[function(require,module,exports){ -'use strict'; - -var Actor = require('../actor'); -var WebWorkify = require('webworkify'); - -module.exports = Dispatcher; - -function Dispatcher(length, parent) { - this.actors = []; - this.currentActor = 0; - for (var i = 0; i < length; i++) { - var worker = new WebWorkify(require('../../source/worker')); - var actor = new Actor(worker, parent); - actor.name = "Worker " + i; - this.actors.push(actor); - } -} - -Dispatcher.prototype = { - broadcast: function(type, data) { - for (var i = 0; i < this.actors.length; i++) { - this.actors[i].send(type, data); - } - }, - - send: function(type, data, callback, targetID, buffers) { - if (typeof targetID !== 'number' || isNaN(targetID)) { - // Use round robin to send requests to web workers. - targetID = this.currentActor = (this.currentActor + 1) % this.actors.length; - } - - this.actors[targetID].send(type, data, callback, buffers); - return targetID; - }, - - remove: function() { - for (var i = 0; i < this.actors.length; i++) { - this.actors[i].target.terminate(); - } - this.actors = []; - } -}; - -},{"../../source/worker":45,"../actor":90,"webworkify":142}],95:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); - -exports.create = function (tagName, className, container) { - var el = document.createElement(tagName); - if (className) el.className = className; - if (container) container.appendChild(el); - return el; -}; - -var docStyle = document.documentElement.style; - -function testProp(props) { - for (var i = 0; i < props.length; i++) { - if (props[i] in docStyle) { - return props[i]; - } - } -} - -var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']), - userSelect; -exports.disableDrag = function () { - if (selectProp) { - userSelect = docStyle[selectProp]; - docStyle[selectProp] = 'none'; - } -}; -exports.enableDrag = function () { - if (selectProp) { - docStyle[selectProp] = userSelect; - } -}; - -var transformProp = testProp(['transform', 'WebkitTransform']); -exports.setTransform = function(el, value) { - el.style[transformProp] = value; -}; - -// Suppress the next click, but only if it's immediate. -function suppressClick(e) { - e.preventDefault(); - e.stopPropagation(); - window.removeEventListener('click', suppressClick, true); -} -exports.suppressClick = function() { - window.addEventListener('click', suppressClick, true); - window.setTimeout(function() { - window.removeEventListener('click', suppressClick, true); - }, 0); -}; - -exports.mousePos = function (el, e) { - var rect = el.getBoundingClientRect(); - e = e.touches ? e.touches[0] : e; - return new Point( - e.clientX - rect.left - el.clientLeft, - e.clientY - rect.top - el.clientTop); -}; - -},{"point-geometry":134}],96:[function(require,module,exports){ -'use strict'; - -module.exports = { - HTTP_URL: 'http://a.tiles.mapbox.com', - HTTPS_URL: 'https://a.tiles.mapbox.com', - FORCE_HTTPS: true, - REQUIRE_ACCESS_TOKEN: true -}; - -},{}],97:[function(require,module,exports){ -'use strict'; - -var util = require('./util'); - -/** - * Methods mixed in to other classes for event capabilities. - * @mixin Evented - */ -var Evented = { - - /** - * Subscribe to a specified event with a listener function the latter gets the data object that was passed to `fire` and additionally `target` and `type` properties - * - * @param {string} type Event type - * @param {Function} listener Function to be called when the event is fired - */ - on: function(type, fn) { - this._events = this._events || {}; - this._events[type] = this._events[type] || []; - this._events[type].push(fn); - - return this; - }, - - /** - * Remove a event listener - * - * @param {string} [type] Event type. If none is specified, remove all listeners - * @param {Function} [listener] Function to be called when the event is fired. If none is specified all listeners are removed - */ - off: function(type, fn) { - if (!type) { - // clear all listeners if no arguments specified - delete this._events; - return this; - } - - if (!this.listens(type)) return this; - - if (fn) { - var idx = this._events[type].indexOf(fn); - if (idx >= 0) { - this._events[type].splice(idx, 1); - } - if (!this._events[type].length) { - delete this._events[type]; - } - } else { - delete this._events[type]; - } - - return this; - }, - - /** - * Call a function once when an event has fired - * - * @param {string} type Event type. - * @param {Function} listener Function to be called once when the event is fired - */ - once: function(type, fn) { - var wrapper = function(data) { - this.off(type, wrapper); - fn.call(this, data); - }.bind(this); - this.on(type, wrapper); - return this; - }, - - /** - * Fire event of a given string type with the given data object - * - * @param {string} type Event type - * @param {Object} [data] Optional data passed down to the event object - * @returns {Object} `this` - */ - fire: function(type, data) { - if (!this.listens(type)) return this; - - data = util.extend({}, data); - util.extend(data, {type: type, target: this}); - - // make sure adding/removing listeners inside other listeners won't cause infinite loop - var listeners = this._events[type].slice(); - - for (var i = 0; i < listeners.length; i++) { - listeners[i].call(this, data); - } - - return this; - }, - - /** - * Check if an event is registered to a type - * @param {string} type Event type - * @returns {boolean} `true` if there is at least one registered listener for events of type `type` - */ - listens: function(type) { - return !!(this._events && this._events[type]); - } -}; - -module.exports = Evented; - -},{"./util":103}],98:[function(require,module,exports){ -'use strict'; - -module.exports = Glyphs; - -function Glyphs(pbf, end) { - this.stacks = pbf.readFields(readFontstacks, [], end); -} - -function readFontstacks(tag, stacks, pbf) { - if (tag === 1) { - var fontstack = pbf.readMessage(readFontstack, {glyphs: {}}); - stacks.push(fontstack); - } -} - -function readFontstack(tag, fontstack, pbf) { - if (tag === 1) fontstack.name = pbf.readString(); - else if (tag === 2) fontstack.range = pbf.readString(); - else if (tag === 3) { - var glyph = pbf.readMessage(readGlyph, {}); - fontstack.glyphs[glyph.id] = glyph; - } -} - -function readGlyph(tag, glyph, pbf) { - if (tag === 1) glyph.id = pbf.readVarint(); - else if (tag === 2) glyph.bitmap = pbf.readBytes(); - else if (tag === 3) glyph.width = pbf.readVarint(); - else if (tag === 4) glyph.height = pbf.readVarint(); - else if (tag === 5) glyph.left = pbf.readSVarint(); - else if (tag === 6) glyph.top = pbf.readSVarint(); - else if (tag === 7) glyph.advance = pbf.readVarint(); -} - -},{}],99:[function(require,module,exports){ -'use strict'; - -module.exports = interpolate; - -function interpolate(a, b, t) { - return (a * (1 - t)) + (b * t); -} - -interpolate.number = interpolate; - -interpolate.vec2 = function(from, to, t) { - return [ - interpolate(from[0], to[0], t), - interpolate(from[1], to[1], t) - ]; -}; - -/* - * Interpolate between two colors given as 4-element arrays. - * - * @param {Color} from - * @param {Color} to - * @param {number} t interpolation factor between 0 and 1 - * @returns {Color} interpolated color - */ -interpolate.color = function(from, to, t) { - return [ - interpolate(from[0], to[0], t), - interpolate(from[1], to[1], t), - interpolate(from[2], to[2], t), - interpolate(from[3], to[3], t) - ]; -}; - -interpolate.array = function(from, to, t) { - return from.map(function(d, i) { - return interpolate(d, to[i], t); - }); -}; - -},{}],100:[function(require,module,exports){ -'use strict'; - -var config = require('./config'); -var browser = require('./browser'); - -function normalizeURL(url, pathPrefix, accessToken) { - accessToken = accessToken || config.ACCESS_TOKEN; - - if (!accessToken && config.REQUIRE_ACCESS_TOKEN) { - throw new Error('An API access token is required to use Mapbox GL. ' + - 'See https://www.mapbox.com/developers/api/#access-tokens'); - } - - var https = config.FORCE_HTTPS || - (typeof document !== 'undefined' && document.location.protocol === 'https:'); - - url = url.replace(/^mapbox:\/\//, (https ? config.HTTPS_URL : config.HTTP_URL) + pathPrefix); - url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token='; - - if (config.REQUIRE_ACCESS_TOKEN) { - if (accessToken[0] === 's') { - throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' + - 'See https://www.mapbox.com/developers/api/#access-tokens'); - } - - url += accessToken; - } - - return url; -} - -module.exports.normalizeStyleURL = function(url, accessToken) { - var user = url.match(/^mapbox:\/\/([^.]+)/); - if (!user) - return url; - - return normalizeURL(url, '/styles/v1/' + user[1] + '/', accessToken); -}; - -module.exports.normalizeSourceURL = function(url, accessToken) { - if (!url.match(/^mapbox:\/\//)) - return url; - - url = normalizeURL(url + '.json', '/v4/', accessToken); - - // TileJSON requests need a secure flag appended to their URLs so - // that the server knows to send SSL-ified resource references. - if (url.indexOf('https') === 0) - url += '&secure'; - - return url; -}; - -module.exports.normalizeGlyphsURL = function(url, accessToken) { - if (!url.match(/^mapbox:\/\//)) - return url; - - return normalizeURL(url, '/v4/', accessToken); -}; - -module.exports.normalizeTileURL = function(url, sourceUrl) { - if (!sourceUrl || !sourceUrl.match(/^mapbox:\/\//)) - return url; - return url.replace(/\.((?:png|jpg)\d*)(?=$|\?)/, browser.devicePixelRatio >= 2 ? '@2x.$1' : '.$1'); -}; - -},{"./browser":92,"./config":96}],101:[function(require,module,exports){ -'use strict'; - -/** - * A [most-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) - * with hash lookup made possible by keeping a list of keys in parallel to - * an array of dictionary of values - * - * @param {number} max number of permitted values - * @param {Function} onRemove callback called with items when they expire - * @private - */ -module.exports = MRUCache; -function MRUCache(max, onRemove) { - this.max = max; - this.onRemove = onRemove; - this.reset(); -} - -/** - * Clear the cache - * - * @returns {MRUCache} this cache - * @private - */ -MRUCache.prototype.reset = function() { - for (var key in this.list) { - this.onRemove(this.list[key]); - } - - this.list = {}; - this.order = []; - - return this; -}; - -/** - * Add a key, value combination to the cache, trimming its size if this pushes - * it over max length. - * - * @param {string} key lookup key for the item - * @param {*} data any value - * - * @returns {MRUCache} this cache - * @private - */ -MRUCache.prototype.add = function(key, data) { - this.list[key] = data; - this.order.push(key); - - if (this.order.length > this.max) { - var removedData = this.get(this.order[0]); - if (removedData) this.onRemove(removedData); - } - - return this; -}; - -/** - * Determine whether the value attached to `key` is present - * - * @param {string} key the key to be looked-up - * @returns {boolean} whether the cache has this value - * @private - */ -MRUCache.prototype.has = function(key) { - return key in this.list; -}; - -/** - * List all keys in the cache - * - * @returns {Array} an array of keys in this cache. - * @private - */ -MRUCache.prototype.keys = function() { - return this.order; -}; - -/** - * Get the value attached to a specific key. If the key is not found, - * returns `null` - * - * @param {string} key the key to look up - * @returns {*} the data, or null if it isn't found - * @private - */ -MRUCache.prototype.get = function(key) { - if (!this.has(key)) { return null; } - - var data = this.list[key]; - - delete this.list[key]; - this.order.splice(this.order.indexOf(key), 1); - - return data; -}; - -},{}],102:[function(require,module,exports){ -'use strict'; - -module.exports = resolveTokens; - -/** - * Replace tokens in a string template with values in an object - * - * @param {Object} properties a key/value relationship between tokens and replacements - * @param {string} text the template string - * @returns {string} the template with tokens replaced - * @private - */ -function resolveTokens(properties, text) { - return text.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g, function(match, key) { - return key in properties ? properties[key] : ''; - }); -} - -},{}],103:[function(require,module,exports){ -'use strict'; - -var UnitBezier = require('unitbezier'); - -/** - * Given a value `t` that varies between 0 and 1, return - * an interpolation function that eases between 0 and 1 in a pleasing - * cubic in-out fashion. - * - * @param {number} t input - * @returns {number} input - * @private - */ -exports.easeCubicInOut = function (t) { - if (t <= 0) return 0; - if (t >= 1) return 1; - var t2 = t * t, - t3 = t2 * t; - return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); -}; - -/** - * Given given (x, y), (x1, y1) control points for a bezier curve, - * return a function that interpolates along that curve. - * - * @param {number} p1x control point 1 x coordinate - * @param {number} p1y control point 1 y coordinate - * @param {number} p2x control point 2 x coordinate - * @param {number} p2y control point 2 y coordinate - * @returns {Function} interpolator: receives number value, returns - * number value. - * @private - */ -exports.bezier = function(p1x, p1y, p2x, p2y) { - var bezier = new UnitBezier(p1x, p1y, p2x, p2y); - return function(t) { - return bezier.solve(t); - }; -}; - -/** - * A default bezier-curve powered easing function with - * control points (0.25, 0.1) and (0.25, 1) - * - * @param {number} t - * @returns {number} output - * @private - */ -exports.ease = exports.bezier(0.25, 0.1, 0.25, 1); - -/** - * Given a four-element array of numbers that represents a color in - * RGBA, return a version for which the RGB components are multiplied - * by the A (alpha) component - * - * @param {Array} c color array - * @returns {Array} premultiplied color array - * @private - */ -exports.premultiply = function (c) { - c[0] *= c[3]; - c[1] *= c[3]; - c[2] *= c[3]; - return c; -}; - -/** - * constrain n to the given range via min + max - * - * @param {number} n value - * @param {number} min the minimum value to be returned - * @param {number} max the maximum value to be returned - * @returns {number} the clamped value - * @private - */ -exports.clamp = function (n, min, max) { - return Math.min(max, Math.max(min, n)); -}; - -/* - * constrain n to the given range via modular arithmetic - * @param {number} n - * @param {number} min - * @param {number} max - * @returns {number} constrained number - * @private - */ -exports.wrap = function (n, min, max) { - var d = max - min; - return n === max ? n : ((n - min) % d + d) % d + min; -}; - -/* - * return the first non-null and non-undefined argument to this function. - * @returns {*} argument - * @private - */ -exports.coalesce = function() { - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg !== null && arg !== undefined) - return arg; - } -}; - -/* - * Call an asynchronous function on an array of arguments, - * calling `callback` once all calls complete. - * - * @param {Array<*>} array input to each call of the async function. - * @param {Function} fn an async function with signature (data, callback) - * @param {Function} callback a callback run after all async work is done. - * called with no arguments - * @returns {undefined} - * @private - */ -exports.asyncEach = function (array, fn, callback) { - var remaining = array.length; - if (remaining === 0) return callback(); - function check() { if (--remaining === 0) callback(); } - for (var i = 0; i < array.length; i++) fn(array[i], check); -}; - -/* - * Compute the difference between the keys in one object and the keys - * in another object. - * - * @param {Object} obj - * @param {Object} other - * @returns {Array} keys difference - * @private - */ -exports.keysDifference = function (obj, other) { - var difference = []; - for (var i in obj) { - if (!(i in other)) { - difference.push(i); - } - } - return difference; -}; - -/** - * Given a destination object and optionally many source objects, - * copy all properties from the source objects into the destination. - * The last source object given overrides properties from previous - * source objects. - * @param {Object} dest destination object - * @param {...Object} sources sources from which properties are pulled - * @returns {Object} dest - * @private - */ -exports.extend = function (dest) { - for (var i = 1; i < arguments.length; i++) { - var src = arguments[i]; - for (var k in src) { - dest[k] = src[k]; - } - } - return dest; -}; - -/** - * Extend a destination object with all properties of the src object, - * using defineProperty instead of simple assignment. - * @param {Object} dest - * @param {Object} src - * @returns {Object} dest - * @private - */ -exports.extendAll = function (dest, src) { - for (var i in src) { - Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i)); - } - return dest; -}; - -/** - * Extend a parent's prototype with all properties in a properties - * object. - * - * @param {Object} parent - * @param {Object} props - * @returns {Object} - * @private - */ -exports.inherit = function (parent, props) { - var parentProto = typeof parent === 'function' ? parent.prototype : parent, - proto = Object.create(parentProto); - exports.extendAll(proto, props); - return proto; -}; - -/** - * Given an object and a number of properties as strings, return version - * of that object with only those properties. - * - * @param {Object} src the object - * @param {Array} properties an array of property names chosen - * to appear on the resulting object. - * @returns {Object} object with limited properties. - * @example - * var foo = { name: 'Charlie', age: 10 }; - * var justName = pick(foo, ['name']); - * // justName = { name: 'Charlie' } - * @private - */ -exports.pick = function (src, properties) { - var result = {}; - for (var i = 0; i < properties.length; i++) { - var k = properties[i]; - if (k in src) { - result[k] = src[k]; - } - } - return result; -}; - -var id = 1; - -/** - * Return a unique numeric id, starting at 1 and incrementing with - * each call. - * - * @returns {number} unique numeric id. - * @private - */ -exports.uniqueId = function () { - return id++; -}; - -/** - * Create a version of `fn` that only fires once every `time` millseconds. - * - * @param {Function} fn the function to be throttled - * @param {number} time millseconds required between function calls - * @param {*} context the value of `this` with which the function is called - * @returns {Function} debounced function - * @private - */ -exports.throttle = function (fn, time, context) { - var lock, args, wrapperFn, later; - - later = function () { - // reset lock and call if queued - lock = false; - if (args) { - wrapperFn.apply(context, args); - args = false; - } - }; - - wrapperFn = function () { - if (lock) { - // called too soon, queue to call later - args = arguments; - - } else { - // call and lock until later - fn.apply(context, arguments); - setTimeout(later, time); - lock = true; - } - }; - - return wrapperFn; -}; - -/** - * Create a version of `fn` that is only called `time` milliseconds - * after its last invocation - * - * @param {Function} fn the function to be debounced - * @param {number} time millseconds after which the function will be invoked - * @returns {Function} debounced function - * @private - */ -exports.debounce = function(fn, time) { - var timer, args; - - return function() { - args = arguments; - clearTimeout(timer); - - timer = setTimeout(function() { - fn.apply(null, args); - }, time); - }; -}; - -/** - * Given an array of member function names as strings, replace all of them - * with bound versions that will always refer to `context` as `this`. This - * is useful for classes where otherwise event bindings would reassign - * `this` to the evented object or some other value: this lets you ensure - * the `this` value always. - * - * @param {Array} fns list of member function names - * @param {*} context the context value - * @returns {undefined} changes functions in-place - * @example - * function MyClass() { - * bindAll(['ontimer'], this); - * this.name = 'Tom'; - * } - * MyClass.prototype.ontimer = function() { - * alert(this.name); - * }; - * var myClass = new MyClass(); - * setTimeout(myClass.ontimer, 100); - * @private - */ -exports.bindAll = function(fns, context) { - fns.forEach(function(fn) { - context[fn] = context[fn].bind(context); - }); -}; - -exports.bindHandlers = function(context) { - for (var i in context) { - if (typeof context[i] === 'function' && i.indexOf('_on') === 0) { - context[i] = context[i].bind(context); - } - } -}; - -/** - * Set the 'options' property on `obj` with properties - * from the `options` argument. Properties in the `options` - * object will override existing properties. - * - * @param {Object} obj destination object - * @param {Object} options object of override options - * @returns {Object} derived options object. - * @private - */ -exports.setOptions = function(obj, options) { - if (!obj.hasOwnProperty('options')) { - obj.options = obj.options ? Object.create(obj.options) : {}; - } - for (var i in options) { - obj.options[i] = options[i]; - } - return obj.options; -}; - -},{"unitbezier":137}],104:[function(require,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],105:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = setTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - currentQueue[queueIndex].run(); - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - clearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -// TODO(shtylman) -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],106:[function(require,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} -},{}],107:[function(require,module,exports){ -(function (process,global){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = require('./support/isBuffer'); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = require('inherits'); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./support/isBuffer":106,"_process":105,"inherits":104}],108:[function(require,module,exports){ -// (c) Dean McNamee , 2012. -// -// https://github.com/deanm/css-color-parser-js -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. - -// http://www.w3.org/TR/css3-color/ -var kCSSColorTable = { - "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], - "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], - "aquamarine": [127,255,212,1], "azure": [240,255,255,1], - "beige": [245,245,220,1], "bisque": [255,228,196,1], - "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], - "blue": [0,0,255,1], "blueviolet": [138,43,226,1], - "brown": [165,42,42,1], "burlywood": [222,184,135,1], - "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], - "chocolate": [210,105,30,1], "coral": [255,127,80,1], - "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], - "crimson": [220,20,60,1], "cyan": [0,255,255,1], - "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], - "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], - "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], - "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], - "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], - "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], - "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], - "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], - "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], - "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], - "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], - "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], - "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], - "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], - "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], - "gold": [255,215,0,1], "goldenrod": [218,165,32,1], - "gray": [128,128,128,1], "green": [0,128,0,1], - "greenyellow": [173,255,47,1], "grey": [128,128,128,1], - "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], - "indianred": [205,92,92,1], "indigo": [75,0,130,1], - "ivory": [255,255,240,1], "khaki": [240,230,140,1], - "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], - "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], - "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], - "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], - "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], - "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], - "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], - "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], - "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], - "lightyellow": [255,255,224,1], "lime": [0,255,0,1], - "limegreen": [50,205,50,1], "linen": [250,240,230,1], - "magenta": [255,0,255,1], "maroon": [128,0,0,1], - "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], - "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], - "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], - "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], - "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], - "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], - "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], - "navy": [0,0,128,1], "oldlace": [253,245,230,1], - "olive": [128,128,0,1], "olivedrab": [107,142,35,1], - "orange": [255,165,0,1], "orangered": [255,69,0,1], - "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], - "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], - "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], - "peachpuff": [255,218,185,1], "peru": [205,133,63,1], - "pink": [255,192,203,1], "plum": [221,160,221,1], - "powderblue": [176,224,230,1], "purple": [128,0,128,1], - "red": [255,0,0,1], "rosybrown": [188,143,143,1], - "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], - "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], - "seagreen": [46,139,87,1], "seashell": [255,245,238,1], - "sienna": [160,82,45,1], "silver": [192,192,192,1], - "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], - "slategray": [112,128,144,1], "slategrey": [112,128,144,1], - "snow": [255,250,250,1], "springgreen": [0,255,127,1], - "steelblue": [70,130,180,1], "tan": [210,180,140,1], - "teal": [0,128,128,1], "thistle": [216,191,216,1], - "tomato": [255,99,71,1], "turquoise": [64,224,208,1], - "violet": [238,130,238,1], "wheat": [245,222,179,1], - "white": [255,255,255,1], "whitesmoke": [245,245,245,1], - "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} - -function clamp_css_byte(i) { // Clamp to integer 0 .. 255. - i = Math.round(i); // Seems to be what Chrome does (vs truncation). - return i < 0 ? 0 : i > 255 ? 255 : i; -} - -function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. - return f < 0 ? 0 : f > 1 ? 1 : f; -} - -function parse_css_int(str) { // int or percentage. - if (str[str.length - 1] === '%') - return clamp_css_byte(parseFloat(str) / 100 * 255); - return clamp_css_byte(parseInt(str)); -} - -function parse_css_float(str) { // float or percentage. - if (str[str.length - 1] === '%') - return clamp_css_float(parseFloat(str) / 100); - return clamp_css_float(parseFloat(str)); -} - -function css_hue_to_rgb(m1, m2, h) { - if (h < 0) h += 1; - else if (h > 1) h -= 1; - - if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; - if (h * 2 < 1) return m2; - if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; - return m1; -} - -function parseCSSColor(css_str) { - // Remove all whitespace, not compliant, but should just be more accepting. - var str = css_str.replace(/ /g, '').toLowerCase(); - - // Color keywords (and transparent) lookup. - if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. - - // #abc and #abc123 syntax. - if (str[0] === '#') { - if (str.length === 4) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. - return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), - (iv & 0xf0) | ((iv & 0xf0) >> 4), - (iv & 0xf) | ((iv & 0xf) << 4), - 1]; - } else if (str.length === 7) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. - return [(iv & 0xff0000) >> 16, - (iv & 0xff00) >> 8, - iv & 0xff, - 1]; - } - - return null; - } - - var op = str.indexOf('('), ep = str.indexOf(')'); - if (op !== -1 && ep + 1 === str.length) { - var fname = str.substr(0, op); - var params = str.substr(op+1, ep-(op+1)).split(','); - var alpha = 1; // To allow case fallthrough. - switch (fname) { - case 'rgba': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'rgb': - if (params.length !== 3) return null; - return [parse_css_int(params[0]), - parse_css_int(params[1]), - parse_css_int(params[2]), - alpha]; - case 'hsla': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'hsl': - if (params.length !== 3) return null; - var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 - // NOTE(deanm): According to the CSS spec s/l should only be - // percentages, but we don't bother and let float or percentage. - var s = parse_css_float(params[1]); - var l = parse_css_float(params[2]); - var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - var m1 = l * 2 - m2; - return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), - alpha]; - default: - return null; - } - } - - return null; -} - -try { exports.parseCSSColor = parseCSSColor } catch(e) { } - -},{}],109:[function(require,module,exports){ -'use strict'; - -var VectorTileFeatureTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; - -function infix(operator) { - return function(_, key, value) { - if (key === '$type') { - return 't' + operator + VectorTileFeatureTypes.indexOf(value); - } else { - return 'p[' + JSON.stringify(key) + ']' + operator + JSON.stringify(value); - } - }; -} - -function strictInfix(operator) { - var nonstrictInfix = infix(operator); - return function(_, key, value) { - if (key === '$type') { - return nonstrictInfix(_, key, value); - } else { - return 'typeof(p[' + JSON.stringify(key) + ']) === typeof(' + JSON.stringify(value) + ') && ' + - nonstrictInfix(_, key, value); - } - }; -} - -var operators = { - '==': infix('==='), - '!=': infix('!=='), - '>': strictInfix('>'), - '<': strictInfix('<'), - '<=': strictInfix('<='), - '>=': strictInfix('>='), - 'in': function(_, key) { - return Array.prototype.slice.call(arguments, 2).map(function(value) { - return '(' + operators['=='](_, key, value) + ')'; - }).join('||') || 'false'; - }, - '!in': function() { - return '!(' + operators.in.apply(this, arguments) + ')'; - }, - 'any': function() { - return Array.prototype.slice.call(arguments, 1).map(function(filter) { - return '(' + compile(filter) + ')'; - }).join('||') || 'false'; - }, - 'all': function() { - return Array.prototype.slice.call(arguments, 1).map(function(filter) { - return '(' + compile(filter) + ')'; - }).join('&&') || 'true'; - }, - 'none': function() { - return '!(' + operators.any.apply(this, arguments) + ')'; - } -}; - -function compile(filter) { - return operators[filter[0]].apply(filter, filter); -} - -function truth() { - return true; -} - -/** - * Given a filter expressed as nested arrays, return a new function - * that evaluates whether a given feature (with a .properties or .tags property) - * passes its test. - * - * @param {Array} filter mapbox gl filter - * @returns {Function} filter-evaluating function - */ -module.exports = function (filter) { - if (!filter) return truth; - var filterStr = 'var p = f.properties || f.tags || {}, t = f.type; return ' + compile(filter) + ';'; - // jshint evil: true - return new Function('f', filterStr); -}; - -},{}],110:[function(require,module,exports){ -'use strict'; - -module.exports = clip; - -/* clip features between two axis-parallel lines: - * | | - * ___|___ | / - * / | \____|____/ - * | | - */ - -function clip(features, scale, k1, k2, axis, intersect, minAll, maxAll) { - - k1 /= scale; - k2 /= scale; - - if (minAll >= k1 && maxAll <= k2) return features; // trivial accept - else if (minAll > k2 || maxAll < k1) return null; // trivial reject - - var clipped = []; - - for (var i = 0; i < features.length; i++) { - - var feature = features[i], - geometry = feature.geometry, - type = feature.type, - min, max; - - min = feature.min[axis]; - max = feature.max[axis]; - - if (min >= k1 && max <= k2) { // trivial accept - clipped.push(feature); - continue; - } else if (min > k2 || max < k1) continue; // trivial reject - - var slices = type === 1 ? - clipPoints(geometry, k1, k2, axis) : - clipGeometry(geometry, k1, k2, axis, intersect, type === 3); - - if (slices.length) { - // if a feature got clipped, it will likely get clipped on the next zoom level as well, - // so there's no need to recalculate bboxes - clipped.push({ - geometry: slices, - type: type, - tags: features[i].tags || null, - min: feature.min, - max: feature.max - }); - } - } - - return clipped.length ? clipped : null; -} - -function clipPoints(geometry, k1, k2, axis) { - var slice = []; - - for (var i = 0; i < geometry.length; i++) { - var a = geometry[i], - ak = a[axis]; - - if (ak >= k1 && ak <= k2) slice.push(a); - } - return slice; -} - -function clipGeometry(geometry, k1, k2, axis, intersect, closed) { - - var slices = []; - - for (var i = 0; i < geometry.length; i++) { - - var ak = 0, - bk = 0, - b = null, - points = geometry[i], - area = points.area, - dist = points.dist, - len = points.length, - a, j, last; - - var slice = []; - - for (j = 0; j < len - 1; j++) { - a = b || points[j]; - b = points[j + 1]; - ak = bk || a[axis]; - bk = b[axis]; - - if (ak < k1) { - - if ((bk > k2)) { // ---|-----|--> - slice.push(intersect(a, b, k1), intersect(a, b, k2)); - if (!closed) slice = newSlice(slices, slice, area, dist); - - } else if (bk >= k1) slice.push(intersect(a, b, k1)); // ---|--> | - - } else if (ak > k2) { - - if ((bk < k1)) { // <--|-----|--- - slice.push(intersect(a, b, k2), intersect(a, b, k1)); - if (!closed) slice = newSlice(slices, slice, area, dist); - - } else if (bk <= k2) slice.push(intersect(a, b, k2)); // | <--|--- - - } else { - - slice.push(a); - - if (bk < k1) { // <--|--- | - slice.push(intersect(a, b, k1)); - if (!closed) slice = newSlice(slices, slice, area, dist); - - } else if (bk > k2) { // | ---|--> - slice.push(intersect(a, b, k2)); - if (!closed) slice = newSlice(slices, slice, area, dist); - } - // | --> | - } - } - - // add the last point - a = points[len - 1]; - ak = a[axis]; - if (ak >= k1 && ak <= k2) slice.push(a); - - // close the polygon if its endpoints are not the same after clipping - - last = slice[slice.length - 1]; - if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) slice.push(slice[0]); - - // add the final slice - newSlice(slices, slice, area, dist); - } - - return slices; -} - -function newSlice(slices, slice, area, dist) { - if (slice.length) { - // we don't recalculate the area/length of the unclipped geometry because the case where it goes - // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work - slice.area = area; - slice.dist = dist; - - slices.push(slice); - } - return []; -} - -},{}],111:[function(require,module,exports){ -'use strict'; - -module.exports = convert; - -var simplify = require('./simplify'); - -// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data - -function convert(data, tolerance) { - var features = []; - - if (data.type === 'FeatureCollection') { - for (var i = 0; i < data.features.length; i++) { - convertFeature(features, data.features[i], tolerance); - } - } else if (data.type === 'Feature') { - convertFeature(features, data, tolerance); - - } else { - // single geometry or a geometry collection - convertFeature(features, {geometry: data}, tolerance); - } - return features; -} - -function convertFeature(features, feature, tolerance) { - var geom = feature.geometry, - type = geom.type, - coords = geom.coordinates, - tags = feature.properties, - i, j, rings; - - if (type === 'Point') { - features.push(create(tags, 1, [projectPoint(coords)])); - - } else if (type === 'MultiPoint') { - features.push(create(tags, 1, project(coords))); - - } else if (type === 'LineString') { - features.push(create(tags, 2, [project(coords, tolerance)])); - - } else if (type === 'MultiLineString' || type === 'Polygon') { - rings = []; - for (i = 0; i < coords.length; i++) { - rings.push(project(coords[i], tolerance)); - } - features.push(create(tags, type === 'Polygon' ? 3 : 2, rings)); - - } else if (type === 'MultiPolygon') { - rings = []; - for (i = 0; i < coords.length; i++) { - for (j = 0; j < coords[i].length; j++) { - rings.push(project(coords[i][j], tolerance)); - } - } - features.push(create(tags, 3, rings)); - - } else if (type === 'GeometryCollection') { - for (i = 0; i < geom.geometries.length; i++) { - convertFeature(features, { - geometry: geom.geometries[i], - properties: tags - }, tolerance); - } - - } else { - throw new Error('Input data is not a valid GeoJSON object.'); - } -} - -function create(tags, type, geometry) { - var feature = { - geometry: geometry, - type: type, - tags: tags || null, - min: [2, 1], // initial bbox values; - max: [-1, 0] // note that coords are usually in [0..1] range - }; - calcBBox(feature); - return feature; -} - -function project(lonlats, tolerance) { - var projected = []; - for (var i = 0; i < lonlats.length; i++) { - projected.push(projectPoint(lonlats[i])); - } - if (tolerance) { - simplify(projected, tolerance); - calcSize(projected); - } - return projected; -} - -function projectPoint(p) { - var sin = Math.sin(p[1] * Math.PI / 180), - x = (p[0] / 360 + 0.5), - y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); - - y = y < -1 ? -1 : - y > 1 ? 1 : y; - - return [x, y, 0]; -} - -// calculate area and length of the poly -function calcSize(points) { - var area = 0, - dist = 0; - - for (var i = 0, a, b; i < points.length - 1; i++) { - a = b || points[i]; - b = points[i + 1]; - - area += a[0] * b[1] - b[0] * a[1]; - - // use Manhattan distance instead of Euclidian one to avoid expensive square root computation - dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]); - } - points.area = Math.abs(area / 2); - points.dist = dist; -} - -// calculate the feature bounding box for faster clipping later -function calcBBox(feature) { - var geometry = feature.geometry, - min = feature.min, - max = feature.max; - - if (feature.type === 1) calcRingBBox(min, max, geometry); - else for (var i = 0; i < geometry.length; i++) calcRingBBox(min, max, geometry[i]); - - return feature; -} - -function calcRingBBox(min, max, points) { - for (var i = 0, p; i < points.length; i++) { - p = points[i]; - min[0] = Math.min(p[0], min[0]); - max[0] = Math.max(p[0], max[0]); - min[1] = Math.min(p[1], min[1]); - max[1] = Math.max(p[1], max[1]); - } -} - -},{"./simplify":113}],112:[function(require,module,exports){ -'use strict'; - -module.exports = geojsonvt; - -var convert = require('./convert'), // GeoJSON conversion and preprocessing - clip = require('./clip'), // stripe clipping algorithm - wrap = require('./wrap'), // date line processing - createTile = require('./tile'); // final simplified tile generation - - -function geojsonvt(data, options) { - return new GeoJSONVT(data, options); -} - -function GeoJSONVT(data, options) { - options = this.options = extend(Object.create(this.options), options); - - var debug = options.debug; - - if (debug) console.time('preprocess data'); - - var z2 = 1 << options.maxZoom, // 2^z - features = convert(data, options.tolerance / (z2 * options.extent)); - - this.tiles = {}; - - if (debug) { - console.timeEnd('preprocess data'); - console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); - console.time('generate tiles'); - this.stats = {}; - this.total = 0; - } - - features = wrap(features, options.buffer / options.extent, intersectX); - - // start slicing from the top tile down - this.splitTile(features, 0, 0, 0); - - if (debug) { - console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); - console.timeEnd('generate tiles'); - console.log('tiles generated:', this.total, JSON.stringify(this.stats)); - } -} - -GeoJSONVT.prototype.options = { - maxZoom: 14, // max zoom to preserve detail on - indexMaxZoom: 5, // max zoom in the tile index - indexMaxPoints: 100000, // max number of points per tile in the tile index - tolerance: 3, // simplification tolerance (higher means simpler) - extent: 4096, // tile extent - buffer: 64, // tile buffer on each side - debug: 0 // logging level (0, 1 or 2) -}; - -GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { - - var stack = [features, z, x, y], - options = this.options, - debug = options.debug, - extent = options.extent, - buffer = options.buffer; - - // avoid recursion by using a processing queue - while (stack.length) { - features = stack.shift(); - z = stack.shift(); - x = stack.shift(); - y = stack.shift(); - - var z2 = 1 << z, - id = toID(z, x, y), - tile = this.tiles[id], - tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * extent); - - if (!tile) { - if (debug > 1) console.time('creation'); - - tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom); - - if (debug) { - if (debug > 1) { - console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', - z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); - console.timeEnd('creation'); - } - var key = 'z' + z; - this.stats[key] = (this.stats[key] || 0) + 1; - this.total++; - } - } - - // save reference to original geometry in tile so that we can drill down later if we stop now - tile.source = features; - - // stop tiling if the tile is degenerate - if (isClippedSquare(tile.features, extent, buffer)) continue; - - // if it's the first-pass tiling - if (!cz) { - // stop tiling if we reached max zoom, or if the tile is too simple - if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue; - - // if a drilldown to a specific tile - } else { - // stop tiling if we reached base zoom or our target tile zoom - if (z === options.maxZoom || z === cz) continue; - - // stop tiling if it's not an ancestor of the target tile - var m = 1 << (cz - z); - if (x !== Math.floor(cx / m) && y !== Math.floor(cy / m)) continue; - } - - // if we slice further down, no need to keep source geometry - tile.source = null; - - if (debug > 1) console.time('clipping'); - - // values we'll use for clipping - var k1 = 0.5 * buffer / extent, - k2 = 0.5 - k1, - k3 = 0.5 + k1, - k4 = 1 + k1, - tl, bl, tr, br, left, right; - - tl = bl = tr = br = null; - - left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]); - right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]); - - if (left) { - tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); - bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); - } - - if (right) { - tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); - br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); - } - - if (debug > 1) console.timeEnd('clipping'); - - if (tl) stack.push(tl, z + 1, x * 2, y * 2); - if (bl) stack.push(bl, z + 1, x * 2, y * 2 + 1); - if (tr) stack.push(tr, z + 1, x * 2 + 1, y * 2); - if (br) stack.push(br, z + 1, x * 2 + 1, y * 2 + 1); - } -}; - -GeoJSONVT.prototype.getTile = function (z, x, y) { - var options = this.options, - extent = options.extent, - debug = options.debug; - - var z2 = 1 << z; - x = ((x % z2) + z2) % z2; // wrap tile x coordinate - - var id = toID(z, x, y); - if (this.tiles[id]) return transformTile(this.tiles[id], extent); - - if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y); - - var z0 = z, - x0 = x, - y0 = y, - parent; - - while (!parent && z0 > 0) { - z0--; - x0 = Math.floor(x0 / 2); - y0 = Math.floor(y0 / 2); - parent = this.tiles[toID(z0, x0, y0)]; - } - - if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0); - - // if we found a parent tile containing the original geometry, we can drill down from it - if (parent.source) { - if (isClippedSquare(parent.features, options.extent, options.buffer)) return transformTile(parent, extent); - - if (debug > 1) console.time('drilling down'); - this.splitTile(parent.source, z0, x0, y0, z, x, y); - if (debug > 1) console.timeEnd('drilling down'); - } - - return transformTile(this.tiles[id], extent); -}; - -function transformTile(tile, extent) { - if (!tile || tile.transformed) return tile; - - var z2 = tile.z2, - tx = tile.x, - ty = tile.y, - i, j, k; - - for (i = 0; i < tile.features.length; i++) { - var feature = tile.features[i], - geom = feature.geometry, - type = feature.type; - - if (type === 1) { - for (j = 0; j < geom.length; j++) geom[j] = transformPoint(geom[j], extent, z2, tx, ty); - - } else { - for (j = 0; j < geom.length; j++) { - var ring = geom[j]; - for (k = 0; k < ring.length; k++) ring[k] = transformPoint(ring[k], extent, z2, tx, ty); - } - } - } - - tile.transformed = true; - - return tile; -} - -function transformPoint(p, extent, z2, tx, ty) { - var x = Math.round(extent * (p[0] * z2 - tx)), - y = Math.round(extent * (p[1] * z2 - ty)); - return [x, y]; -} - -// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further -function isClippedSquare(features, extent, buffer) { - if (features.length !== 1) return false; - - var feature = features[0]; - if (feature.type !== 3 || feature.geometry.length > 1) return false; - - for (var i = 0; i < feature.geometry[0].length; i++) { - var p = feature.geometry[0][i]; - if ((p[0] !== -buffer && p[0] !== extent + buffer) || - (p[1] !== -buffer && p[1] !== extent + buffer)) return false; - } - return true; -} - -function toID(z, x, y) { - return (((1 << z) * y + x) * 32) + z; -} - -function intersectX(a, b, x) { - return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1]; -} -function intersectY(a, b, y) { - return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1]; -} - -function extend(dest, src) { - for (var i in src) dest[i] = src[i]; - return dest; -} - -},{"./clip":110,"./convert":111,"./tile":114,"./wrap":115}],113:[function(require,module,exports){ -'use strict'; - -module.exports = simplify; - -// calculate simplification data using optimized Douglas-Peucker algorithm - -function simplify(points, tolerance) { - - var sqTolerance = tolerance * tolerance, - len = points.length, - first = 0, - last = len - 1, - stack = [], - i, maxSqDist, sqDist, index; - - // always retain the endpoints (1 is the max value) - points[first][2] = 1; - points[last][2] = 1; - - // avoid recursion by using a stack - while (last) { - - maxSqDist = 0; - - for (i = first + 1; i < last; i++) { - sqDist = getSqSegDist(points[i], points[first], points[last]); - - if (sqDist > maxSqDist) { - index = i; - maxSqDist = sqDist; - } - } - - if (maxSqDist > sqTolerance) { - points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate - stack.push(first); - stack.push(index); - first = index; - - } else { - last = stack.pop(); - first = stack.pop(); - } - } -} - -// square distance from a point to a segment -function getSqSegDist(p, a, b) { - - var x = a[0], y = a[1], - bx = b[0], by = b[1], - px = p[0], py = p[1], - dx = bx - x, - dy = by - y; - - if (dx !== 0 || dy !== 0) { - - var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); - - if (t > 1) { - x = bx; - y = by; - - } else if (t > 0) { - x += dx * t; - y += dy * t; - } - } - - dx = px - x; - dy = py - y; - - return dx * dx + dy * dy; -} - -},{}],114:[function(require,module,exports){ -'use strict'; - -module.exports = createTile; - -function createTile(features, z2, tx, ty, tolerance, noSimplify) { - var tile = { - features: [], - numPoints: 0, - numSimplified: 0, - numFeatures: 0, - source: null, - x: tx, - y: ty, - z2: z2, - transformed: false, - min: [2, 1], - max: [-1, 0] - }; - for (var i = 0; i < features.length; i++) { - tile.numFeatures++; - addFeature(tile, features[i], tolerance, noSimplify); - - var min = features[i].min, - max = features[i].max; - - if (min[0] < tile.min[0]) tile.min[0] = min[0]; - if (min[1] < tile.min[1]) tile.min[1] = min[1]; - if (max[0] > tile.max[0]) tile.max[0] = max[0]; - if (max[1] > tile.max[1]) tile.max[1] = max[1]; - } - return tile; -} - -function addFeature(tile, feature, tolerance, noSimplify) { - - var geom = feature.geometry, - type = feature.type, - simplified = [], - sqTolerance = tolerance * tolerance, - i, j, ring, p; - - if (type === 1) { - for (i = 0; i < geom.length; i++) { - simplified.push(geom[i]); - tile.numPoints++; - tile.numSimplified++; - } - - } else { - - // simplify and transform projected coordinates for tile geometry - for (i = 0; i < geom.length; i++) { - ring = geom[i]; - - // filter out tiny polylines & polygons - if (!noSimplify && ((type === 2 && ring.dist < tolerance) || - (type === 3 && ring.area < sqTolerance))) { - tile.numPoints += ring.length; - continue; - } - - var simplifiedRing = []; - - for (j = 0; j < ring.length; j++) { - p = ring[j]; - // keep points with importance > tolerance - if (noSimplify || p[2] > sqTolerance) { - simplifiedRing.push(p); - tile.numSimplified++; - } - tile.numPoints++; - } - - simplified.push(simplifiedRing); - } - } - - if (simplified.length) { - tile.features.push({ - geometry: simplified, - type: type, - tags: feature.tags || null - }); - } -} - -},{}],115:[function(require,module,exports){ -'use strict'; - -var clip = require('./clip'); - -module.exports = wrap; - -function wrap(features, buffer, intersectX) { - var merged = features, - left = clip(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy - right = clip(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy - - if (left || right) { - merged = clip(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2); // center world copy - - if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center - if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center - } - - return merged; -} - -function shiftFeatureCoords(features, offset) { - var newFeatures = []; - - for (var i = 0; i < features.length; i++) { - var feature = features[i], - type = feature.type; - - var newGeometry; - - if (type === 1) { - newGeometry = shiftCoords(feature.geometry, offset); - } else { - newGeometry = []; - for (var j = 0; j < feature.geometry.length; j++) { - newGeometry.push(shiftCoords(feature.geometry[j], offset)); - } - } - - newFeatures.push({ - geometry: newGeometry, - type: type, - tags: feature.tags, - min: [feature.min[0] + offset, feature.min[1]], - max: [feature.max[0] + offset, feature.max[1]] - }); - } - - return newFeatures; -} - -function shiftCoords(points, offset) { - var newPoints = []; - newPoints.area = points.area; - newPoints.dist = points.dist; - - for (var i = 0; i < points.length; i++) { - newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]); - } - return newPoints; -} - -},{"./clip":110}],116:[function(require,module,exports){ -/** - * @fileoverview gl-matrix - High performance matrix and vector operations - * @author Brandon Jones - * @author Colin MacKenzie IV - * @version 2.3.0 - */ - -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ -// END HEADER - -exports.glMatrix = require("./gl-matrix/common.js"); -exports.mat2 = require("./gl-matrix/mat2.js"); -exports.mat2d = require("./gl-matrix/mat2d.js"); -exports.mat3 = require("./gl-matrix/mat3.js"); -exports.mat4 = require("./gl-matrix/mat4.js"); -exports.quat = require("./gl-matrix/quat.js"); -exports.vec2 = require("./gl-matrix/vec2.js"); -exports.vec3 = require("./gl-matrix/vec3.js"); -exports.vec4 = require("./gl-matrix/vec4.js"); -},{"./gl-matrix/common.js":117,"./gl-matrix/mat2.js":118,"./gl-matrix/mat2d.js":119,"./gl-matrix/mat3.js":120,"./gl-matrix/mat4.js":121,"./gl-matrix/quat.js":122,"./gl-matrix/vec2.js":123,"./gl-matrix/vec3.js":124,"./gl-matrix/vec4.js":125}],117:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -/** - * @class Common utilities - * @name glMatrix - */ -var glMatrix = {}; - -// Constants -glMatrix.EPSILON = 0.000001; -glMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array; -glMatrix.RANDOM = Math.random; - -/** - * Sets the type of array used when creating new vectors and matrices - * - * @param {Type} type Array type, such as Float32Array or Array - */ -glMatrix.setMatrixArrayType = function(type) { - GLMAT_ARRAY_TYPE = type; -} - -var degree = Math.PI / 180; - -/** -* Convert Degree To Radian -* -* @param {Number} Angle in Degrees -*/ -glMatrix.toRadian = function(a){ - return a * degree; -} - -module.exports = glMatrix; - -},{}],118:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 2x2 Matrix - * @name mat2 - */ -var mat2 = {}; - -/** - * Creates a new identity mat2 - * - * @returns {mat2} a new 2x2 matrix - */ -mat2.create = function() { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; -}; - -/** - * Creates a new mat2 initialized with values from an existing matrix - * - * @param {mat2} a matrix to clone - * @returns {mat2} a new 2x2 matrix - */ -mat2.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -}; - -/** - * Copy the values from one mat2 to another - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the source matrix - * @returns {mat2} out - */ -mat2.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -}; - -/** - * Set a mat2 to the identity matrix - * - * @param {mat2} out the receiving matrix - * @returns {mat2} out - */ -mat2.identity = function(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; -}; - -/** - * Transpose the values of a mat2 - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the source matrix - * @returns {mat2} out - */ -mat2.transpose = function(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } - - return out; -}; - -/** - * Inverts a mat2 - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the source matrix - * @returns {mat2} out - */ -mat2.invert = function(out, a) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], - - // Calculate the determinant - det = a0 * a3 - a2 * a1; - - if (!det) { - return null; - } - det = 1.0 / det; - - out[0] = a3 * det; - out[1] = -a1 * det; - out[2] = -a2 * det; - out[3] = a0 * det; - - return out; -}; - -/** - * Calculates the adjugate of a mat2 - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the source matrix - * @returns {mat2} out - */ -mat2.adjoint = function(out, a) { - // Caching this value is nessecary if out == a - var a0 = a[0]; - out[0] = a[3]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = a0; - - return out; -}; - -/** - * Calculates the determinant of a mat2 - * - * @param {mat2} a the source matrix - * @returns {Number} determinant of a - */ -mat2.determinant = function (a) { - return a[0] * a[3] - a[2] * a[1]; -}; - -/** - * Multiplies two mat2's - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the first operand - * @param {mat2} b the second operand - * @returns {mat2} out - */ -mat2.multiply = function (out, a, b) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; - var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; - out[0] = a0 * b0 + a2 * b1; - out[1] = a1 * b0 + a3 * b1; - out[2] = a0 * b2 + a2 * b3; - out[3] = a1 * b2 + a3 * b3; - return out; -}; - -/** - * Alias for {@link mat2.multiply} - * @function - */ -mat2.mul = mat2.multiply; - -/** - * Rotates a mat2 by the given angle - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2} out - */ -mat2.rotate = function (out, a, rad) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], - s = Math.sin(rad), - c = Math.cos(rad); - out[0] = a0 * c + a2 * s; - out[1] = a1 * c + a3 * s; - out[2] = a0 * -s + a2 * c; - out[3] = a1 * -s + a3 * c; - return out; -}; - -/** - * Scales the mat2 by the dimensions in the given vec2 - * - * @param {mat2} out the receiving matrix - * @param {mat2} a the matrix to rotate - * @param {vec2} v the vec2 to scale the matrix by - * @returns {mat2} out - **/ -mat2.scale = function(out, a, v) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], - v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; - return out; -}; - -/** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat2.identity(dest); - * mat2.rotate(dest, dest, rad); - * - * @param {mat2} out mat2 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2} out - */ -mat2.fromRotation = function(out, rad) { - var s = Math.sin(rad), - c = Math.cos(rad); - out[0] = c; - out[1] = s; - out[2] = -s; - out[3] = c; - return out; -} - -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat2.identity(dest); - * mat2.scale(dest, dest, vec); - * - * @param {mat2} out mat2 receiving operation result - * @param {vec2} v Scaling vector - * @returns {mat2} out - */ -mat2.fromScaling = function(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = v[1]; - return out; -} - -/** - * Returns a string representation of a mat2 - * - * @param {mat2} mat matrix to represent as a string - * @returns {String} string representation of the matrix - */ -mat2.str = function (a) { - return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; -}; - -/** - * Returns Frobenius norm of a mat2 - * - * @param {mat2} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ -mat2.frob = function (a) { - return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2))) -}; - -/** - * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix - * @param {mat2} L the lower triangular matrix - * @param {mat2} D the diagonal matrix - * @param {mat2} U the upper triangular matrix - * @param {mat2} a the input matrix to factorize - */ - -mat2.LDU = function (L, D, U, a) { - L[2] = a[2]/a[0]; - U[0] = a[0]; - U[1] = a[1]; - U[3] = a[3] - L[2] * U[1]; - return [L, D, U]; -}; - - -module.exports = mat2; - -},{"./common.js":117}],119:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 2x3 Matrix - * @name mat2d - * - * @description - * A mat2d contains six elements defined as: - *
- * [a, c, tx,
- *  b, d, ty]
- * 
- * This is a short form for the 3x3 matrix: - *
- * [a, c, tx,
- *  b, d, ty,
- *  0, 0, 1]
- * 
- * The last row is ignored so the array is shorter and operations are faster. - */ -var mat2d = {}; - -/** - * Creates a new identity mat2d - * - * @returns {mat2d} a new 2x3 matrix - */ -mat2d.create = function() { - var out = new glMatrix.ARRAY_TYPE(6); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = 0; - out[5] = 0; - return out; -}; - -/** - * Creates a new mat2d initialized with values from an existing matrix - * - * @param {mat2d} a matrix to clone - * @returns {mat2d} a new 2x3 matrix - */ -mat2d.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(6); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - return out; -}; - -/** - * Copy the values from one mat2d to another - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the source matrix - * @returns {mat2d} out - */ -mat2d.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - return out; -}; - -/** - * Set a mat2d to the identity matrix - * - * @param {mat2d} out the receiving matrix - * @returns {mat2d} out - */ -mat2d.identity = function(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = 0; - out[5] = 0; - return out; -}; - -/** - * Inverts a mat2d - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the source matrix - * @returns {mat2d} out - */ -mat2d.invert = function(out, a) { - var aa = a[0], ab = a[1], ac = a[2], ad = a[3], - atx = a[4], aty = a[5]; - - var det = aa * ad - ab * ac; - if(!det){ - return null; - } - det = 1.0 / det; - - out[0] = ad * det; - out[1] = -ab * det; - out[2] = -ac * det; - out[3] = aa * det; - out[4] = (ac * aty - ad * atx) * det; - out[5] = (ab * atx - aa * aty) * det; - return out; -}; - -/** - * Calculates the determinant of a mat2d - * - * @param {mat2d} a the source matrix - * @returns {Number} determinant of a - */ -mat2d.determinant = function (a) { - return a[0] * a[3] - a[1] * a[2]; -}; - -/** - * Multiplies two mat2d's - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the first operand - * @param {mat2d} b the second operand - * @returns {mat2d} out - */ -mat2d.multiply = function (out, a, b) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], - b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; - out[0] = a0 * b0 + a2 * b1; - out[1] = a1 * b0 + a3 * b1; - out[2] = a0 * b2 + a2 * b3; - out[3] = a1 * b2 + a3 * b3; - out[4] = a0 * b4 + a2 * b5 + a4; - out[5] = a1 * b4 + a3 * b5 + a5; - return out; -}; - -/** - * Alias for {@link mat2d.multiply} - * @function - */ -mat2d.mul = mat2d.multiply; - -/** - * Rotates a mat2d by the given angle - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2d} out - */ -mat2d.rotate = function (out, a, rad) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], - s = Math.sin(rad), - c = Math.cos(rad); - out[0] = a0 * c + a2 * s; - out[1] = a1 * c + a3 * s; - out[2] = a0 * -s + a2 * c; - out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; - return out; -}; - -/** - * Scales the mat2d by the dimensions in the given vec2 - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the matrix to translate - * @param {vec2} v the vec2 to scale the matrix by - * @returns {mat2d} out - **/ -mat2d.scale = function(out, a, v) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], - v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; - out[4] = a4; - out[5] = a5; - return out; -}; - -/** - * Translates the mat2d by the dimensions in the given vec2 - * - * @param {mat2d} out the receiving matrix - * @param {mat2d} a the matrix to translate - * @param {vec2} v the vec2 to translate the matrix by - * @returns {mat2d} out - **/ -mat2d.translate = function(out, a, v) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], - v0 = v[0], v1 = v[1]; - out[0] = a0; - out[1] = a1; - out[2] = a2; - out[3] = a3; - out[4] = a0 * v0 + a2 * v1 + a4; - out[5] = a1 * v0 + a3 * v1 + a5; - return out; -}; - -/** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.rotate(dest, dest, rad); - * - * @param {mat2d} out mat2d receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2d} out - */ -mat2d.fromRotation = function(out, rad) { - var s = Math.sin(rad), c = Math.cos(rad); - out[0] = c; - out[1] = s; - out[2] = -s; - out[3] = c; - out[4] = 0; - out[5] = 0; - return out; -} - -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.scale(dest, dest, vec); - * - * @param {mat2d} out mat2d receiving operation result - * @param {vec2} v Scaling vector - * @returns {mat2d} out - */ -mat2d.fromScaling = function(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = v[1]; - out[4] = 0; - out[5] = 0; - return out; -} - -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.translate(dest, dest, vec); - * - * @param {mat2d} out mat2d receiving operation result - * @param {vec2} v Translation vector - * @returns {mat2d} out - */ -mat2d.fromTranslation = function(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = v[0]; - out[5] = v[1]; - return out; -} - -/** - * Returns a string representation of a mat2d - * - * @param {mat2d} a matrix to represent as a string - * @returns {String} string representation of the matrix - */ -mat2d.str = function (a) { - return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + - a[3] + ', ' + a[4] + ', ' + a[5] + ')'; -}; - -/** - * Returns Frobenius norm of a mat2d - * - * @param {mat2d} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ -mat2d.frob = function (a) { - return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1)) -}; - -module.exports = mat2d; - -},{"./common.js":117}],120:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 3x3 Matrix - * @name mat3 - */ -var mat3 = {}; - -/** - * Creates a new identity mat3 - * - * @returns {mat3} a new 3x3 matrix - */ -mat3.create = function() { - var out = new glMatrix.ARRAY_TYPE(9); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 1; - out[5] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 1; - return out; -}; - -/** - * Copies the upper-left 3x3 values into the given mat3. - * - * @param {mat3} out the receiving 3x3 matrix - * @param {mat4} a the source 4x4 matrix - * @returns {mat3} out - */ -mat3.fromMat4 = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[4]; - out[4] = a[5]; - out[5] = a[6]; - out[6] = a[8]; - out[7] = a[9]; - out[8] = a[10]; - return out; -}; - -/** - * Creates a new mat3 initialized with values from an existing matrix - * - * @param {mat3} a matrix to clone - * @returns {mat3} a new 3x3 matrix - */ -mat3.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(9); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -}; - -/** - * Copy the values from one mat3 to another - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the source matrix - * @returns {mat3} out - */ -mat3.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -}; - -/** - * Set a mat3 to the identity matrix - * - * @param {mat3} out the receiving matrix - * @returns {mat3} out - */ -mat3.identity = function(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 1; - out[5] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 1; - return out; -}; - -/** - * Transpose the values of a mat3 - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the source matrix - * @returns {mat3} out - */ -mat3.transpose = function(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], a02 = a[2], a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } - - return out; -}; - -/** - * Inverts a mat3 - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the source matrix - * @returns {mat3} out - */ -mat3.invert = function(out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8], - - b01 = a22 * a11 - a12 * a21, - b11 = -a22 * a10 + a12 * a20, - b21 = a21 * a10 - a11 * a20, - - // Calculate the determinant - det = a00 * b01 + a01 * b11 + a02 * b21; - - if (!det) { - return null; - } - det = 1.0 / det; - - out[0] = b01 * det; - out[1] = (-a22 * a01 + a02 * a21) * det; - out[2] = (a12 * a01 - a02 * a11) * det; - out[3] = b11 * det; - out[4] = (a22 * a00 - a02 * a20) * det; - out[5] = (-a12 * a00 + a02 * a10) * det; - out[6] = b21 * det; - out[7] = (-a21 * a00 + a01 * a20) * det; - out[8] = (a11 * a00 - a01 * a10) * det; - return out; -}; - -/** - * Calculates the adjugate of a mat3 - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the source matrix - * @returns {mat3} out - */ -mat3.adjoint = function(out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8]; - - out[0] = (a11 * a22 - a12 * a21); - out[1] = (a02 * a21 - a01 * a22); - out[2] = (a01 * a12 - a02 * a11); - out[3] = (a12 * a20 - a10 * a22); - out[4] = (a00 * a22 - a02 * a20); - out[5] = (a02 * a10 - a00 * a12); - out[6] = (a10 * a21 - a11 * a20); - out[7] = (a01 * a20 - a00 * a21); - out[8] = (a00 * a11 - a01 * a10); - return out; -}; - -/** - * Calculates the determinant of a mat3 - * - * @param {mat3} a the source matrix - * @returns {Number} determinant of a - */ -mat3.determinant = function (a) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8]; - - return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); -}; - -/** - * Multiplies two mat3's - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the first operand - * @param {mat3} b the second operand - * @returns {mat3} out - */ -mat3.multiply = function (out, a, b) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8], - - b00 = b[0], b01 = b[1], b02 = b[2], - b10 = b[3], b11 = b[4], b12 = b[5], - b20 = b[6], b21 = b[7], b22 = b[8]; - - out[0] = b00 * a00 + b01 * a10 + b02 * a20; - out[1] = b00 * a01 + b01 * a11 + b02 * a21; - out[2] = b00 * a02 + b01 * a12 + b02 * a22; - - out[3] = b10 * a00 + b11 * a10 + b12 * a20; - out[4] = b10 * a01 + b11 * a11 + b12 * a21; - out[5] = b10 * a02 + b11 * a12 + b12 * a22; - - out[6] = b20 * a00 + b21 * a10 + b22 * a20; - out[7] = b20 * a01 + b21 * a11 + b22 * a21; - out[8] = b20 * a02 + b21 * a12 + b22 * a22; - return out; -}; - -/** - * Alias for {@link mat3.multiply} - * @function - */ -mat3.mul = mat3.multiply; - -/** - * Translate a mat3 by the given vector - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the matrix to translate - * @param {vec2} v vector to translate by - * @returns {mat3} out - */ -mat3.translate = function(out, a, v) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8], - x = v[0], y = v[1]; - - out[0] = a00; - out[1] = a01; - out[2] = a02; - - out[3] = a10; - out[4] = a11; - out[5] = a12; - - out[6] = x * a00 + y * a10 + a20; - out[7] = x * a01 + y * a11 + a21; - out[8] = x * a02 + y * a12 + a22; - return out; -}; - -/** - * Rotates a mat3 by the given angle - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat3} out - */ -mat3.rotate = function (out, a, rad) { - var a00 = a[0], a01 = a[1], a02 = a[2], - a10 = a[3], a11 = a[4], a12 = a[5], - a20 = a[6], a21 = a[7], a22 = a[8], - - s = Math.sin(rad), - c = Math.cos(rad); - - out[0] = c * a00 + s * a10; - out[1] = c * a01 + s * a11; - out[2] = c * a02 + s * a12; - - out[3] = c * a10 - s * a00; - out[4] = c * a11 - s * a01; - out[5] = c * a12 - s * a02; - - out[6] = a20; - out[7] = a21; - out[8] = a22; - return out; -}; - -/** - * Scales the mat3 by the dimensions in the given vec2 - * - * @param {mat3} out the receiving matrix - * @param {mat3} a the matrix to rotate - * @param {vec2} v the vec2 to scale the matrix by - * @returns {mat3} out - **/ -mat3.scale = function(out, a, v) { - var x = v[0], y = v[1]; - - out[0] = x * a[0]; - out[1] = x * a[1]; - out[2] = x * a[2]; - - out[3] = y * a[3]; - out[4] = y * a[4]; - out[5] = y * a[5]; - - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -}; - -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.translate(dest, dest, vec); - * - * @param {mat3} out mat3 receiving operation result - * @param {vec2} v Translation vector - * @returns {mat3} out - */ -mat3.fromTranslation = function(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 1; - out[5] = 0; - out[6] = v[0]; - out[7] = v[1]; - out[8] = 1; - return out; -} - -/** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.rotate(dest, dest, rad); - * - * @param {mat3} out mat3 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat3} out - */ -mat3.fromRotation = function(out, rad) { - var s = Math.sin(rad), c = Math.cos(rad); - - out[0] = c; - out[1] = s; - out[2] = 0; - - out[3] = -s; - out[4] = c; - out[5] = 0; - - out[6] = 0; - out[7] = 0; - out[8] = 1; - return out; -} - -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.scale(dest, dest, vec); - * - * @param {mat3} out mat3 receiving operation result - * @param {vec2} v Scaling vector - * @returns {mat3} out - */ -mat3.fromScaling = function(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - - out[3] = 0; - out[4] = v[1]; - out[5] = 0; - - out[6] = 0; - out[7] = 0; - out[8] = 1; - return out; -} - -/** - * Copies the values from a mat2d into a mat3 - * - * @param {mat3} out the receiving matrix - * @param {mat2d} a the matrix to copy - * @returns {mat3} out - **/ -mat3.fromMat2d = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = 0; - - out[3] = a[2]; - out[4] = a[3]; - out[5] = 0; - - out[6] = a[4]; - out[7] = a[5]; - out[8] = 1; - return out; -}; - -/** -* Calculates a 3x3 matrix from the given quaternion -* -* @param {mat3} out mat3 receiving operation result -* @param {quat} q Quaternion to create matrix from -* -* @returns {mat3} out -*/ -mat3.fromQuat = function (out, q) { - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - yx = y * x2, - yy = y * y2, - zx = z * x2, - zy = z * y2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2; - - out[0] = 1 - yy - zz; - out[3] = yx - wz; - out[6] = zx + wy; - - out[1] = yx + wz; - out[4] = 1 - xx - zz; - out[7] = zy - wx; - - out[2] = zx - wy; - out[5] = zy + wx; - out[8] = 1 - xx - yy; - - return out; -}; - -/** -* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix -* -* @param {mat3} out mat3 receiving operation result -* @param {mat4} a Mat4 to derive the normal matrix from -* -* @returns {mat3} out -*/ -mat3.normalFromMat4 = function (out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], - - b00 = a00 * a11 - a01 * a10, - b01 = a00 * a12 - a02 * a10, - b02 = a00 * a13 - a03 * a10, - b03 = a01 * a12 - a02 * a11, - b04 = a01 * a13 - a03 * a11, - b05 = a02 * a13 - a03 * a12, - b06 = a20 * a31 - a21 * a30, - b07 = a20 * a32 - a22 * a30, - b08 = a20 * a33 - a23 * a30, - b09 = a21 * a32 - a22 * a31, - b10 = a21 * a33 - a23 * a31, - b11 = a22 * a33 - a23 * a32, - - // Calculate the determinant - det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - - if (!det) { - return null; - } - det = 1.0 / det; - - out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; - out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - - out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - - out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - - return out; -}; - -/** - * Returns a string representation of a mat3 - * - * @param {mat3} mat matrix to represent as a string - * @returns {String} string representation of the matrix - */ -mat3.str = function (a) { - return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + - a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + - a[6] + ', ' + a[7] + ', ' + a[8] + ')'; -}; - -/** - * Returns Frobenius norm of a mat3 - * - * @param {mat3} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ -mat3.frob = function (a) { - return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))) -}; - - -module.exports = mat3; - -},{"./common.js":117}],121:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 4x4 Matrix - * @name mat4 - */ -var mat4 = {}; - -/** - * Creates a new identity mat4 - * - * @returns {mat4} a new 4x4 matrix - */ -mat4.create = function() { - var out = new glMatrix.ARRAY_TYPE(16); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -}; - -/** - * Creates a new mat4 initialized with values from an existing matrix - * - * @param {mat4} a matrix to clone - * @returns {mat4} a new 4x4 matrix - */ -mat4.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(16); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -}; - -/** - * Copy the values from one mat4 to another - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -mat4.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -}; - -/** - * Set a mat4 to the identity matrix - * - * @param {mat4} out the receiving matrix - * @returns {mat4} out - */ -mat4.identity = function(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -}; - -/** - * Transpose the values of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -mat4.transpose = function(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], a02 = a[2], a03 = a[3], - a12 = a[6], a13 = a[7], - a23 = a[11]; - - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } - - return out; -}; - -/** - * Inverts a mat4 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -mat4.invert = function(out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], - - b00 = a00 * a11 - a01 * a10, - b01 = a00 * a12 - a02 * a10, - b02 = a00 * a13 - a03 * a10, - b03 = a01 * a12 - a02 * a11, - b04 = a01 * a13 - a03 * a11, - b05 = a02 * a13 - a03 * a12, - b06 = a20 * a31 - a21 * a30, - b07 = a20 * a32 - a22 * a30, - b08 = a20 * a33 - a23 * a30, - b09 = a21 * a32 - a22 * a31, - b10 = a21 * a33 - a23 * a31, - b11 = a22 * a33 - a23 * a32, - - // Calculate the determinant - det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - - if (!det) { - return null; - } - det = 1.0 / det; - - out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; - out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; - out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; - out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; - out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; - out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; - out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; - out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; - - return out; -}; - -/** - * Calculates the adjugate of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -mat4.adjoint = function(out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; - - out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22)); - out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); - out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12)); - out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); - out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); - out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22)); - out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); - out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12)); - out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21)); - out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); - out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11)); - out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); - out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); - out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21)); - out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); - out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11)); - return out; -}; - -/** - * Calculates the determinant of a mat4 - * - * @param {mat4} a the source matrix - * @returns {Number} determinant of a - */ -mat4.determinant = function (a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], - - b00 = a00 * a11 - a01 * a10, - b01 = a00 * a12 - a02 * a10, - b02 = a00 * a13 - a03 * a10, - b03 = a01 * a12 - a02 * a11, - b04 = a01 * a13 - a03 * a11, - b05 = a02 * a13 - a03 * a12, - b06 = a20 * a31 - a21 * a30, - b07 = a20 * a32 - a22 * a30, - b08 = a20 * a33 - a23 * a30, - b09 = a21 * a32 - a22 * a31, - b10 = a21 * a33 - a23 * a31, - b11 = a22 * a33 - a23 * a32; - - // Calculate the determinant - return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; -}; - -/** - * Multiplies two mat4's - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the first operand - * @param {mat4} b the second operand - * @returns {mat4} out - */ -mat4.multiply = function (out, a, b) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; - - // Cache only the current line of the second matrix - var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; - out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; - out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; - out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; - out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - return out; -}; - -/** - * Alias for {@link mat4.multiply} - * @function - */ -mat4.mul = mat4.multiply; - -/** - * Translate a mat4 by the given vector - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to translate - * @param {vec3} v vector to translate by - * @returns {mat4} out - */ -mat4.translate = function (out, a, v) { - var x = v[0], y = v[1], z = v[2], - a00, a01, a02, a03, - a10, a11, a12, a13, - a20, a21, a22, a23; - - if (a === out) { - out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; - out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; - out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; - out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; - } else { - a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; - a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; - a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; - - out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; - out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; - out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; - - out[12] = a00 * x + a10 * y + a20 * z + a[12]; - out[13] = a01 * x + a11 * y + a21 * z + a[13]; - out[14] = a02 * x + a12 * y + a22 * z + a[14]; - out[15] = a03 * x + a13 * y + a23 * z + a[15]; - } - - return out; -}; - -/** - * Scales the mat4 by the dimensions in the given vec3 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to scale - * @param {vec3} v the vec3 to scale the matrix by - * @returns {mat4} out - **/ -mat4.scale = function(out, a, v) { - var x = v[0], y = v[1], z = v[2]; - - out[0] = a[0] * x; - out[1] = a[1] * x; - out[2] = a[2] * x; - out[3] = a[3] * x; - out[4] = a[4] * y; - out[5] = a[5] * y; - out[6] = a[6] * y; - out[7] = a[7] * y; - out[8] = a[8] * z; - out[9] = a[9] * z; - out[10] = a[10] * z; - out[11] = a[11] * z; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -}; - -/** - * Rotates a mat4 by the given angle around the given axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @param {vec3} axis the axis to rotate around - * @returns {mat4} out - */ -mat4.rotate = function (out, a, rad, axis) { - var x = axis[0], y = axis[1], z = axis[2], - len = Math.sqrt(x * x + y * y + z * z), - s, c, t, - a00, a01, a02, a03, - a10, a11, a12, a13, - a20, a21, a22, a23, - b00, b01, b02, - b10, b11, b12, - b20, b21, b22; - - if (Math.abs(len) < glMatrix.EPSILON) { return null; } - - len = 1 / len; - x *= len; - y *= len; - z *= len; - - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; - - a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; - a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; - a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; - - // Construct the elements of the rotation matrix - b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; - b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; - b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; - - // Perform rotation-specific matrix multiplication - out[0] = a00 * b00 + a10 * b01 + a20 * b02; - out[1] = a01 * b00 + a11 * b01 + a21 * b02; - out[2] = a02 * b00 + a12 * b01 + a22 * b02; - out[3] = a03 * b00 + a13 * b01 + a23 * b02; - out[4] = a00 * b10 + a10 * b11 + a20 * b12; - out[5] = a01 * b10 + a11 * b11 + a21 * b12; - out[6] = a02 * b10 + a12 * b11 + a22 * b12; - out[7] = a03 * b10 + a13 * b11 + a23 * b12; - out[8] = a00 * b20 + a10 * b21 + a20 * b22; - out[9] = a01 * b20 + a11 * b21 + a21 * b22; - out[10] = a02 * b20 + a12 * b21 + a22 * b22; - out[11] = a03 * b20 + a13 * b21 + a23 * b22; - - if (a !== out) { // If the source and destination differ, copy the unchanged last row - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - return out; -}; - -/** - * Rotates a matrix by the given angle around the X axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.rotateX = function (out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7], - a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - - if (a !== out) { // If the source and destination differ, copy the unchanged rows - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[4] = a10 * c + a20 * s; - out[5] = a11 * c + a21 * s; - out[6] = a12 * c + a22 * s; - out[7] = a13 * c + a23 * s; - out[8] = a20 * c - a10 * s; - out[9] = a21 * c - a11 * s; - out[10] = a22 * c - a12 * s; - out[11] = a23 * c - a13 * s; - return out; -}; - -/** - * Rotates a matrix by the given angle around the Y axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.rotateY = function (out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3], - a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - - if (a !== out) { // If the source and destination differ, copy the unchanged rows - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[0] = a00 * c - a20 * s; - out[1] = a01 * c - a21 * s; - out[2] = a02 * c - a22 * s; - out[3] = a03 * c - a23 * s; - out[8] = a00 * s + a20 * c; - out[9] = a01 * s + a21 * c; - out[10] = a02 * s + a22 * c; - out[11] = a03 * s + a23 * c; - return out; -}; - -/** - * Rotates a matrix by the given angle around the Z axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.rotateZ = function (out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3], - a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - - if (a !== out) { // If the source and destination differ, copy the unchanged last row - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[0] = a00 * c + a10 * s; - out[1] = a01 * c + a11 * s; - out[2] = a02 * c + a12 * s; - out[3] = a03 * c + a13 * s; - out[4] = a10 * c - a00 * s; - out[5] = a11 * c - a01 * s; - out[6] = a12 * c - a02 * s; - out[7] = a13 * c - a03 * s; - return out; -}; - -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {vec3} v Translation vector - * @returns {mat4} out - */ -mat4.fromTranslation = function(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.scale(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {vec3} v Scaling vector - * @returns {mat4} out - */ -mat4.fromScaling = function(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = v[1]; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = v[2]; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from a given angle around a given axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotate(dest, dest, rad, axis); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @param {vec3} axis the axis to rotate around - * @returns {mat4} out - */ -mat4.fromRotation = function(out, rad, axis) { - var x = axis[0], y = axis[1], z = axis[2], - len = Math.sqrt(x * x + y * y + z * z), - s, c, t; - - if (Math.abs(len) < glMatrix.EPSILON) { return null; } - - len = 1 / len; - x *= len; - y *= len; - z *= len; - - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; - - // Perform rotation-specific matrix multiplication - out[0] = x * x * t + c; - out[1] = y * x * t + z * s; - out[2] = z * x * t - y * s; - out[3] = 0; - out[4] = x * y * t - z * s; - out[5] = y * y * t + c; - out[6] = z * y * t + x * s; - out[7] = 0; - out[8] = x * z * t + y * s; - out[9] = y * z * t - x * s; - out[10] = z * z * t + c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from the given angle around the X axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateX(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.fromXRotation = function(out, rad) { - var s = Math.sin(rad), - c = Math.cos(rad); - - // Perform axis-specific matrix multiplication - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = c; - out[6] = s; - out[7] = 0; - out[8] = 0; - out[9] = -s; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from the given angle around the Y axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateY(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.fromYRotation = function(out, rad) { - var s = Math.sin(rad), - c = Math.cos(rad); - - // Perform axis-specific matrix multiplication - out[0] = c; - out[1] = 0; - out[2] = -s; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = s; - out[9] = 0; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from the given angle around the Z axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateZ(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -mat4.fromZRotation = function(out, rad) { - var s = Math.sin(rad), - c = Math.cos(rad); - - // Perform axis-specific matrix multiplication - out[0] = c; - out[1] = s; - out[2] = 0; - out[3] = 0; - out[4] = -s; - out[5] = c; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} - -/** - * Creates a matrix from a quaternion rotation and vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * var quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {vec3} v Translation vector - * @returns {mat4} out - */ -mat4.fromRotationTranslation = function (out, q, v) { - // Quaternion math - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - xy = x * y2, - xz = x * z2, - yy = y * y2, - yz = y * z2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2; - - out[0] = 1 - (yy + zz); - out[1] = xy + wz; - out[2] = xz - wy; - out[3] = 0; - out[4] = xy - wz; - out[5] = 1 - (xx + zz); - out[6] = yz + wx; - out[7] = 0; - out[8] = xz + wy; - out[9] = yz - wx; - out[10] = 1 - (xx + yy); - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - - return out; -}; - -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * var quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {vec3} v Translation vector - * @param {vec3} s Scaling vector - * @returns {mat4} out - */ -mat4.fromRotationTranslationScale = function (out, q, v, s) { - // Quaternion math - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - xy = x * y2, - xz = x * z2, - yy = y * y2, - yz = y * z2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2, - sx = s[0], - sy = s[1], - sz = s[2]; - - out[0] = (1 - (yy + zz)) * sx; - out[1] = (xy + wz) * sx; - out[2] = (xz - wy) * sx; - out[3] = 0; - out[4] = (xy - wz) * sy; - out[5] = (1 - (xx + zz)) * sy; - out[6] = (yz + wx) * sy; - out[7] = 0; - out[8] = (xz + wy) * sz; - out[9] = (yz - wx) * sz; - out[10] = (1 - (xx + yy)) * sz; - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - - return out; -}; - -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * mat4.translate(dest, origin); - * var quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * mat4.translate(dest, negativeOrigin); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {vec3} v Translation vector - * @param {vec3} s Scaling vector - * @param {vec3} o The origin vector around which to scale and rotate - * @returns {mat4} out - */ -mat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) { - // Quaternion math - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - xy = x * y2, - xz = x * z2, - yy = y * y2, - yz = y * z2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2, - - sx = s[0], - sy = s[1], - sz = s[2], - - ox = o[0], - oy = o[1], - oz = o[2]; - - out[0] = (1 - (yy + zz)) * sx; - out[1] = (xy + wz) * sx; - out[2] = (xz - wy) * sx; - out[3] = 0; - out[4] = (xy - wz) * sy; - out[5] = (1 - (xx + zz)) * sy; - out[6] = (yz + wx) * sy; - out[7] = 0; - out[8] = (xz + wy) * sz; - out[9] = (yz - wx) * sz; - out[10] = (1 - (xx + yy)) * sz; - out[11] = 0; - out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz); - out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz); - out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz); - out[15] = 1; - - return out; -}; - -mat4.fromQuat = function (out, q) { - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - yx = y * x2, - yy = y * y2, - zx = z * x2, - zy = z * y2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2; - - out[0] = 1 - yy - zz; - out[1] = yx + wz; - out[2] = zx - wy; - out[3] = 0; - - out[4] = yx - wz; - out[5] = 1 - xx - zz; - out[6] = zy + wx; - out[7] = 0; - - out[8] = zx + wy; - out[9] = zy - wx; - out[10] = 1 - xx - yy; - out[11] = 0; - - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - - return out; -}; - -/** - * Generates a frustum matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {Number} left Left bound of the frustum - * @param {Number} right Right bound of the frustum - * @param {Number} bottom Bottom bound of the frustum - * @param {Number} top Top bound of the frustum - * @param {Number} near Near bound of the frustum - * @param {Number} far Far bound of the frustum - * @returns {mat4} out - */ -mat4.frustum = function (out, left, right, bottom, top, near, far) { - var rl = 1 / (right - left), - tb = 1 / (top - bottom), - nf = 1 / (near - far); - out[0] = (near * 2) * rl; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = (near * 2) * tb; - out[6] = 0; - out[7] = 0; - out[8] = (right + left) * rl; - out[9] = (top + bottom) * tb; - out[10] = (far + near) * nf; - out[11] = -1; - out[12] = 0; - out[13] = 0; - out[14] = (far * near * 2) * nf; - out[15] = 0; - return out; -}; - -/** - * Generates a perspective projection matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} fovy Vertical field of view in radians - * @param {number} aspect Aspect ratio. typically viewport width/height - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ -mat4.perspective = function (out, fovy, aspect, near, far) { - var f = 1.0 / Math.tan(fovy / 2), - nf = 1 / (near - far); - out[0] = f / aspect; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = f; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = (far + near) * nf; - out[11] = -1; - out[12] = 0; - out[13] = 0; - out[14] = (2 * far * near) * nf; - out[15] = 0; - return out; -}; - -/** - * Generates a perspective projection matrix with the given field of view. - * This is primarily useful for generating projection matrices to be used - * with the still experiemental WebVR API. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ -mat4.perspectiveFromFieldOfView = function (out, fov, near, far) { - var upTan = Math.tan(fov.upDegrees * Math.PI/180.0), - downTan = Math.tan(fov.downDegrees * Math.PI/180.0), - leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0), - rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0), - xScale = 2.0 / (leftTan + rightTan), - yScale = 2.0 / (upTan + downTan); - - out[0] = xScale; - out[1] = 0.0; - out[2] = 0.0; - out[3] = 0.0; - out[4] = 0.0; - out[5] = yScale; - out[6] = 0.0; - out[7] = 0.0; - out[8] = -((leftTan - rightTan) * xScale * 0.5); - out[9] = ((upTan - downTan) * yScale * 0.5); - out[10] = far / (near - far); - out[11] = -1.0; - out[12] = 0.0; - out[13] = 0.0; - out[14] = (far * near) / (near - far); - out[15] = 0.0; - return out; -} - -/** - * Generates a orthogonal projection matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} left Left bound of the frustum - * @param {number} right Right bound of the frustum - * @param {number} bottom Bottom bound of the frustum - * @param {number} top Top bound of the frustum - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ -mat4.ortho = function (out, left, right, bottom, top, near, far) { - var lr = 1 / (left - right), - bt = 1 / (bottom - top), - nf = 1 / (near - far); - out[0] = -2 * lr; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = -2 * bt; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 2 * nf; - out[11] = 0; - out[12] = (left + right) * lr; - out[13] = (top + bottom) * bt; - out[14] = (far + near) * nf; - out[15] = 1; - return out; -}; - -/** - * Generates a look-at matrix with the given eye position, focal point, and up axis - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {vec3} eye Position of the viewer - * @param {vec3} center Point the viewer is looking at - * @param {vec3} up vec3 pointing up - * @returns {mat4} out - */ -mat4.lookAt = function (out, eye, center, up) { - var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, - eyex = eye[0], - eyey = eye[1], - eyez = eye[2], - upx = up[0], - upy = up[1], - upz = up[2], - centerx = center[0], - centery = center[1], - centerz = center[2]; - - if (Math.abs(eyex - centerx) < glMatrix.EPSILON && - Math.abs(eyey - centery) < glMatrix.EPSILON && - Math.abs(eyez - centerz) < glMatrix.EPSILON) { - return mat4.identity(out); - } - - z0 = eyex - centerx; - z1 = eyey - centery; - z2 = eyez - centerz; - - len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); - z0 *= len; - z1 *= len; - z2 *= len; - - x0 = upy * z2 - upz * z1; - x1 = upz * z0 - upx * z2; - x2 = upx * z1 - upy * z0; - len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); - if (!len) { - x0 = 0; - x1 = 0; - x2 = 0; - } else { - len = 1 / len; - x0 *= len; - x1 *= len; - x2 *= len; - } - - y0 = z1 * x2 - z2 * x1; - y1 = z2 * x0 - z0 * x2; - y2 = z0 * x1 - z1 * x0; - - len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); - if (!len) { - y0 = 0; - y1 = 0; - y2 = 0; - } else { - len = 1 / len; - y0 *= len; - y1 *= len; - y2 *= len; - } - - out[0] = x0; - out[1] = y0; - out[2] = z0; - out[3] = 0; - out[4] = x1; - out[5] = y1; - out[6] = z1; - out[7] = 0; - out[8] = x2; - out[9] = y2; - out[10] = z2; - out[11] = 0; - out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); - out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); - out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); - out[15] = 1; - - return out; -}; - -/** - * Returns a string representation of a mat4 - * - * @param {mat4} mat matrix to represent as a string - * @returns {String} string representation of the matrix - */ -mat4.str = function (a) { - return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + - a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + - a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + - a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; -}; - -/** - * Returns Frobenius norm of a mat4 - * - * @param {mat4} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ -mat4.frob = function (a) { - return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) )) -}; - - -module.exports = mat4; - -},{"./common.js":117}],122:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); -var mat3 = require("./mat3.js"); -var vec3 = require("./vec3.js"); -var vec4 = require("./vec4.js"); - -/** - * @class Quaternion - * @name quat - */ -var quat = {}; - -/** - * Creates a new identity quat - * - * @returns {quat} a new quaternion - */ -quat.create = function() { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; -}; - -/** - * Sets a quaternion to represent the shortest rotation from one - * vector to another. - * - * Both vectors are assumed to be unit length. - * - * @param {quat} out the receiving quaternion. - * @param {vec3} a the initial vector - * @param {vec3} b the destination vector - * @returns {quat} out - */ -quat.rotationTo = (function() { - var tmpvec3 = vec3.create(); - var xUnitVec3 = vec3.fromValues(1,0,0); - var yUnitVec3 = vec3.fromValues(0,1,0); - - return function(out, a, b) { - var dot = vec3.dot(a, b); - if (dot < -0.999999) { - vec3.cross(tmpvec3, xUnitVec3, a); - if (vec3.length(tmpvec3) < 0.000001) - vec3.cross(tmpvec3, yUnitVec3, a); - vec3.normalize(tmpvec3, tmpvec3); - quat.setAxisAngle(out, tmpvec3, Math.PI); - return out; - } else if (dot > 0.999999) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; - } else { - vec3.cross(tmpvec3, a, b); - out[0] = tmpvec3[0]; - out[1] = tmpvec3[1]; - out[2] = tmpvec3[2]; - out[3] = 1 + dot; - return quat.normalize(out, out); - } - }; -})(); - -/** - * Sets the specified quaternion with values corresponding to the given - * axes. Each axis is a vec3 and is expected to be unit length and - * perpendicular to all other specified axes. - * - * @param {vec3} view the vector representing the viewing direction - * @param {vec3} right the vector representing the local "right" direction - * @param {vec3} up the vector representing the local "up" direction - * @returns {quat} out - */ -quat.setAxes = (function() { - var matr = mat3.create(); - - return function(out, view, right, up) { - matr[0] = right[0]; - matr[3] = right[1]; - matr[6] = right[2]; - - matr[1] = up[0]; - matr[4] = up[1]; - matr[7] = up[2]; - - matr[2] = -view[0]; - matr[5] = -view[1]; - matr[8] = -view[2]; - - return quat.normalize(out, quat.fromMat3(out, matr)); - }; -})(); - -/** - * Creates a new quat initialized with values from an existing quaternion - * - * @param {quat} a quaternion to clone - * @returns {quat} a new quaternion - * @function - */ -quat.clone = vec4.clone; - -/** - * Creates a new quat initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {quat} a new quaternion - * @function - */ -quat.fromValues = vec4.fromValues; - -/** - * Copy the values from one quat to another - * - * @param {quat} out the receiving quaternion - * @param {quat} a the source quaternion - * @returns {quat} out - * @function - */ -quat.copy = vec4.copy; - -/** - * Set the components of a quat to the given values - * - * @param {quat} out the receiving quaternion - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {quat} out - * @function - */ -quat.set = vec4.set; - -/** - * Set a quat to the identity quaternion - * - * @param {quat} out the receiving quaternion - * @returns {quat} out - */ -quat.identity = function(out) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; -}; - -/** - * Sets a quat from the given angle and rotation axis, - * then returns it. - * - * @param {quat} out the receiving quaternion - * @param {vec3} axis the axis around which to rotate - * @param {Number} rad the angle in radians - * @returns {quat} out - **/ -quat.setAxisAngle = function(out, axis, rad) { - rad = rad * 0.5; - var s = Math.sin(rad); - out[0] = s * axis[0]; - out[1] = s * axis[1]; - out[2] = s * axis[2]; - out[3] = Math.cos(rad); - return out; -}; - -/** - * Adds two quat's - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @returns {quat} out - * @function - */ -quat.add = vec4.add; - -/** - * Multiplies two quat's - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @returns {quat} out - */ -quat.multiply = function(out, a, b) { - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - bx = b[0], by = b[1], bz = b[2], bw = b[3]; - - out[0] = ax * bw + aw * bx + ay * bz - az * by; - out[1] = ay * bw + aw * by + az * bx - ax * bz; - out[2] = az * bw + aw * bz + ax * by - ay * bx; - out[3] = aw * bw - ax * bx - ay * by - az * bz; - return out; -}; - -/** - * Alias for {@link quat.multiply} - * @function - */ -quat.mul = quat.multiply; - -/** - * Scales a quat by a scalar number - * - * @param {quat} out the receiving vector - * @param {quat} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {quat} out - * @function - */ -quat.scale = vec4.scale; - -/** - * Rotates a quaternion by the given angle about the X axis - * - * @param {quat} out quat receiving operation result - * @param {quat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ -quat.rotateX = function (out, a, rad) { - rad *= 0.5; - - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - bx = Math.sin(rad), bw = Math.cos(rad); - - out[0] = ax * bw + aw * bx; - out[1] = ay * bw + az * bx; - out[2] = az * bw - ay * bx; - out[3] = aw * bw - ax * bx; - return out; -}; - -/** - * Rotates a quaternion by the given angle about the Y axis - * - * @param {quat} out quat receiving operation result - * @param {quat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ -quat.rotateY = function (out, a, rad) { - rad *= 0.5; - - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - by = Math.sin(rad), bw = Math.cos(rad); - - out[0] = ax * bw - az * by; - out[1] = ay * bw + aw * by; - out[2] = az * bw + ax * by; - out[3] = aw * bw - ay * by; - return out; -}; - -/** - * Rotates a quaternion by the given angle about the Z axis - * - * @param {quat} out quat receiving operation result - * @param {quat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ -quat.rotateZ = function (out, a, rad) { - rad *= 0.5; - - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - bz = Math.sin(rad), bw = Math.cos(rad); - - out[0] = ax * bw + ay * bz; - out[1] = ay * bw - ax * bz; - out[2] = az * bw + aw * bz; - out[3] = aw * bw - az * bz; - return out; -}; - -/** - * Calculates the W component of a quat from the X, Y, and Z components. - * Assumes that quaternion is 1 unit in length. - * Any existing W component will be ignored. - * - * @param {quat} out the receiving quaternion - * @param {quat} a quat to calculate W component of - * @returns {quat} out - */ -quat.calculateW = function (out, a) { - var x = a[0], y = a[1], z = a[2]; - - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); - return out; -}; - -/** - * Calculates the dot product of two quat's - * - * @param {quat} a the first operand - * @param {quat} b the second operand - * @returns {Number} dot product of a and b - * @function - */ -quat.dot = vec4.dot; - -/** - * Performs a linear interpolation between two quat's - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {quat} out - * @function - */ -quat.lerp = vec4.lerp; - -/** - * Performs a spherical linear interpolation between two quat - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {quat} out - */ -quat.slerp = function (out, a, b, t) { - // benchmarks: - // http://jsperf.com/quaternion-slerp-implementations - - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - bx = b[0], by = b[1], bz = b[2], bw = b[3]; - - var omega, cosom, sinom, scale0, scale1; - - // calc cosine - cosom = ax * bx + ay * by + az * bz + aw * bw; - // adjust signs (if necessary) - if ( cosom < 0.0 ) { - cosom = -cosom; - bx = - bx; - by = - by; - bz = - bz; - bw = - bw; - } - // calculate coefficients - if ( (1.0 - cosom) > 0.000001 ) { - // standard case (slerp) - omega = Math.acos(cosom); - sinom = Math.sin(omega); - scale0 = Math.sin((1.0 - t) * omega) / sinom; - scale1 = Math.sin(t * omega) / sinom; - } else { - // "from" and "to" quaternions are very close - // ... so we can do a linear interpolation - scale0 = 1.0 - t; - scale1 = t; - } - // calculate final values - out[0] = scale0 * ax + scale1 * bx; - out[1] = scale0 * ay + scale1 * by; - out[2] = scale0 * az + scale1 * bz; - out[3] = scale0 * aw + scale1 * bw; - - return out; -}; - -/** - * Performs a spherical linear interpolation with two control points - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @param {quat} c the third operand - * @param {quat} d the fourth operand - * @param {Number} t interpolation amount - * @returns {quat} out - */ -quat.sqlerp = (function () { - var temp1 = quat.create(); - var temp2 = quat.create(); - - return function (out, a, b, c, d, t) { - quat.slerp(temp1, a, d, t); - quat.slerp(temp2, b, c, t); - quat.slerp(out, temp1, temp2, 2 * t * (1 - t)); - - return out; - }; -}()); - -/** - * Calculates the inverse of a quat - * - * @param {quat} out the receiving quaternion - * @param {quat} a quat to calculate inverse of - * @returns {quat} out - */ -quat.invert = function(out, a) { - var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], - dot = a0*a0 + a1*a1 + a2*a2 + a3*a3, - invDot = dot ? 1.0/dot : 0; - - // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 - - out[0] = -a0*invDot; - out[1] = -a1*invDot; - out[2] = -a2*invDot; - out[3] = a3*invDot; - return out; -}; - -/** - * Calculates the conjugate of a quat - * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. - * - * @param {quat} out the receiving quaternion - * @param {quat} a quat to calculate conjugate of - * @returns {quat} out - */ -quat.conjugate = function (out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = a[3]; - return out; -}; - -/** - * Calculates the length of a quat - * - * @param {quat} a vector to calculate length of - * @returns {Number} length of a - * @function - */ -quat.length = vec4.length; - -/** - * Alias for {@link quat.length} - * @function - */ -quat.len = quat.length; - -/** - * Calculates the squared length of a quat - * - * @param {quat} a vector to calculate squared length of - * @returns {Number} squared length of a - * @function - */ -quat.squaredLength = vec4.squaredLength; - -/** - * Alias for {@link quat.squaredLength} - * @function - */ -quat.sqrLen = quat.squaredLength; - -/** - * Normalize a quat - * - * @param {quat} out the receiving quaternion - * @param {quat} a quaternion to normalize - * @returns {quat} out - * @function - */ -quat.normalize = vec4.normalize; - -/** - * Creates a quaternion from the given 3x3 rotation matrix. - * - * NOTE: The resultant quaternion is not normalized, so you should be sure - * to renormalize the quaternion yourself where necessary. - * - * @param {quat} out the receiving quaternion - * @param {mat3} m rotation matrix - * @returns {quat} out - * @function - */ -quat.fromMat3 = function(out, m) { - // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes - // article "Quaternion Calculus and Fast Animation". - var fTrace = m[0] + m[4] + m[8]; - var fRoot; - - if ( fTrace > 0.0 ) { - // |w| > 1/2, may as well choose w > 1/2 - fRoot = Math.sqrt(fTrace + 1.0); // 2w - out[3] = 0.5 * fRoot; - fRoot = 0.5/fRoot; // 1/(4w) - out[0] = (m[5]-m[7])*fRoot; - out[1] = (m[6]-m[2])*fRoot; - out[2] = (m[1]-m[3])*fRoot; - } else { - // |w| <= 1/2 - var i = 0; - if ( m[4] > m[0] ) - i = 1; - if ( m[8] > m[i*3+i] ) - i = 2; - var j = (i+1)%3; - var k = (i+2)%3; - - fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0); - out[i] = 0.5 * fRoot; - fRoot = 0.5 / fRoot; - out[3] = (m[j*3+k] - m[k*3+j]) * fRoot; - out[j] = (m[j*3+i] + m[i*3+j]) * fRoot; - out[k] = (m[k*3+i] + m[i*3+k]) * fRoot; - } - - return out; -}; - -/** - * Returns a string representation of a quatenion - * - * @param {quat} vec vector to represent as a string - * @returns {String} string representation of the vector - */ -quat.str = function (a) { - return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; -}; - -module.exports = quat; - -},{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 2 Dimensional Vector - * @name vec2 - */ -var vec2 = {}; - -/** - * Creates a new, empty vec2 - * - * @returns {vec2} a new 2D vector - */ -vec2.create = function() { - var out = new glMatrix.ARRAY_TYPE(2); - out[0] = 0; - out[1] = 0; - return out; -}; - -/** - * Creates a new vec2 initialized with values from an existing vector - * - * @param {vec2} a vector to clone - * @returns {vec2} a new 2D vector - */ -vec2.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(2); - out[0] = a[0]; - out[1] = a[1]; - return out; -}; - -/** - * Creates a new vec2 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @returns {vec2} a new 2D vector - */ -vec2.fromValues = function(x, y) { - var out = new glMatrix.ARRAY_TYPE(2); - out[0] = x; - out[1] = y; - return out; -}; - -/** - * Copy the values from one vec2 to another - * - * @param {vec2} out the receiving vector - * @param {vec2} a the source vector - * @returns {vec2} out - */ -vec2.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - return out; -}; - -/** - * Set the components of a vec2 to the given values - * - * @param {vec2} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @returns {vec2} out - */ -vec2.set = function(out, x, y) { - out[0] = x; - out[1] = y; - return out; -}; - -/** - * Adds two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.add = function(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - return out; -}; - -/** - * Subtracts vector b from vector a - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.subtract = function(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - return out; -}; - -/** - * Alias for {@link vec2.subtract} - * @function - */ -vec2.sub = vec2.subtract; - -/** - * Multiplies two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.multiply = function(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - return out; -}; - -/** - * Alias for {@link vec2.multiply} - * @function - */ -vec2.mul = vec2.multiply; - -/** - * Divides two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.divide = function(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - return out; -}; - -/** - * Alias for {@link vec2.divide} - * @function - */ -vec2.div = vec2.divide; - -/** - * Returns the minimum of two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.min = function(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - return out; -}; - -/** - * Returns the maximum of two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec2} out - */ -vec2.max = function(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - return out; -}; - -/** - * Scales a vec2 by a scalar number - * - * @param {vec2} out the receiving vector - * @param {vec2} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec2} out - */ -vec2.scale = function(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - return out; -}; - -/** - * Adds two vec2's after scaling the second operand by a scalar value - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec2} out - */ -vec2.scaleAndAdd = function(out, a, b, scale) { - out[0] = a[0] + (b[0] * scale); - out[1] = a[1] + (b[1] * scale); - return out; -}; - -/** - * Calculates the euclidian distance between two vec2's - * - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {Number} distance between a and b - */ -vec2.distance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x*x + y*y); -}; - -/** - * Alias for {@link vec2.distance} - * @function - */ -vec2.dist = vec2.distance; - -/** - * Calculates the squared euclidian distance between two vec2's - * - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {Number} squared distance between a and b - */ -vec2.squaredDistance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return x*x + y*y; -}; - -/** - * Alias for {@link vec2.squaredDistance} - * @function - */ -vec2.sqrDist = vec2.squaredDistance; - -/** - * Calculates the length of a vec2 - * - * @param {vec2} a vector to calculate length of - * @returns {Number} length of a - */ -vec2.length = function (a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x*x + y*y); -}; - -/** - * Alias for {@link vec2.length} - * @function - */ -vec2.len = vec2.length; - -/** - * Calculates the squared length of a vec2 - * - * @param {vec2} a vector to calculate squared length of - * @returns {Number} squared length of a - */ -vec2.squaredLength = function (a) { - var x = a[0], - y = a[1]; - return x*x + y*y; -}; - -/** - * Alias for {@link vec2.squaredLength} - * @function - */ -vec2.sqrLen = vec2.squaredLength; - -/** - * Negates the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {vec2} a vector to negate - * @returns {vec2} out - */ -vec2.negate = function(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - return out; -}; - -/** - * Returns the inverse of the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {vec2} a vector to invert - * @returns {vec2} out - */ -vec2.inverse = function(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - return out; -}; - -/** - * Normalize a vec2 - * - * @param {vec2} out the receiving vector - * @param {vec2} a vector to normalize - * @returns {vec2} out - */ -vec2.normalize = function(out, a) { - var x = a[0], - y = a[1]; - var len = x*x + y*y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - out[0] = a[0] * len; - out[1] = a[1] * len; - } - return out; -}; - -/** - * Calculates the dot product of two vec2's - * - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {Number} dot product of a and b - */ -vec2.dot = function (a, b) { - return a[0] * b[0] + a[1] * b[1]; -}; - -/** - * Computes the cross product of two vec2's - * Note that the cross product must by definition produce a 3D vector - * - * @param {vec3} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @returns {vec3} out - */ -vec2.cross = function(out, a, b) { - var z = a[0] * b[1] - a[1] * b[0]; - out[0] = out[1] = 0; - out[2] = z; - return out; -}; - -/** - * Performs a linear interpolation between two vec2's - * - * @param {vec2} out the receiving vector - * @param {vec2} a the first operand - * @param {vec2} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec2} out - */ -vec2.lerp = function (out, a, b, t) { - var ax = a[0], - ay = a[1]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - return out; -}; - -/** - * Generates a random vector with the given scale - * - * @param {vec2} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec2} out - */ -vec2.random = function (out, scale) { - scale = scale || 1.0; - var r = glMatrix.RANDOM() * 2.0 * Math.PI; - out[0] = Math.cos(r) * scale; - out[1] = Math.sin(r) * scale; - return out; -}; - -/** - * Transforms the vec2 with a mat2 - * - * @param {vec2} out the receiving vector - * @param {vec2} a the vector to transform - * @param {mat2} m matrix to transform with - * @returns {vec2} out - */ -vec2.transformMat2 = function(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[2] * y; - out[1] = m[1] * x + m[3] * y; - return out; -}; - -/** - * Transforms the vec2 with a mat2d - * - * @param {vec2} out the receiving vector - * @param {vec2} a the vector to transform - * @param {mat2d} m matrix to transform with - * @returns {vec2} out - */ -vec2.transformMat2d = function(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[2] * y + m[4]; - out[1] = m[1] * x + m[3] * y + m[5]; - return out; -}; - -/** - * Transforms the vec2 with a mat3 - * 3rd vector component is implicitly '1' - * - * @param {vec2} out the receiving vector - * @param {vec2} a the vector to transform - * @param {mat3} m matrix to transform with - * @returns {vec2} out - */ -vec2.transformMat3 = function(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[3] * y + m[6]; - out[1] = m[1] * x + m[4] * y + m[7]; - return out; -}; - -/** - * Transforms the vec2 with a mat4 - * 3rd vector component is implicitly '0' - * 4th vector component is implicitly '1' - * - * @param {vec2} out the receiving vector - * @param {vec2} a the vector to transform - * @param {mat4} m matrix to transform with - * @returns {vec2} out - */ -vec2.transformMat4 = function(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[4] * y + m[12]; - out[1] = m[1] * x + m[5] * y + m[13]; - return out; -}; - -/** - * Perform some operation over an array of vec2s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ -vec2.forEach = (function() { - var vec = vec2.create(); - - return function(a, stride, offset, count, fn, arg) { - var i, l; - if(!stride) { - stride = 2; - } - - if(!offset) { - offset = 0; - } - - if(count) { - l = Math.min((count * stride) + offset, a.length); - } else { - l = a.length; - } - - for(i = offset; i < l; i += stride) { - vec[0] = a[i]; vec[1] = a[i+1]; - fn(vec, vec, arg); - a[i] = vec[0]; a[i+1] = vec[1]; - } - - return a; - }; -})(); - -/** - * Returns a string representation of a vector - * - * @param {vec2} vec vector to represent as a string - * @returns {String} string representation of the vector - */ -vec2.str = function (a) { - return 'vec2(' + a[0] + ', ' + a[1] + ')'; -}; - -module.exports = vec2; - -},{"./common.js":117}],124:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 3 Dimensional Vector - * @name vec3 - */ -var vec3 = {}; - -/** - * Creates a new, empty vec3 - * - * @returns {vec3} a new 3D vector - */ -vec3.create = function() { - var out = new glMatrix.ARRAY_TYPE(3); - out[0] = 0; - out[1] = 0; - out[2] = 0; - return out; -}; - -/** - * Creates a new vec3 initialized with values from an existing vector - * - * @param {vec3} a vector to clone - * @returns {vec3} a new 3D vector - */ -vec3.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(3); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -}; - -/** - * Creates a new vec3 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} a new 3D vector - */ -vec3.fromValues = function(x, y, z) { - var out = new glMatrix.ARRAY_TYPE(3); - out[0] = x; - out[1] = y; - out[2] = z; - return out; -}; - -/** - * Copy the values from one vec3 to another - * - * @param {vec3} out the receiving vector - * @param {vec3} a the source vector - * @returns {vec3} out - */ -vec3.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -}; - -/** - * Set the components of a vec3 to the given values - * - * @param {vec3} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} out - */ -vec3.set = function(out, x, y, z) { - out[0] = x; - out[1] = y; - out[2] = z; - return out; -}; - -/** - * Adds two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.add = function(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - return out; -}; - -/** - * Subtracts vector b from vector a - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.subtract = function(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - return out; -}; - -/** - * Alias for {@link vec3.subtract} - * @function - */ -vec3.sub = vec3.subtract; - -/** - * Multiplies two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.multiply = function(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - return out; -}; - -/** - * Alias for {@link vec3.multiply} - * @function - */ -vec3.mul = vec3.multiply; - -/** - * Divides two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.divide = function(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - return out; -}; - -/** - * Alias for {@link vec3.divide} - * @function - */ -vec3.div = vec3.divide; - -/** - * Returns the minimum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.min = function(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - return out; -}; - -/** - * Returns the maximum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.max = function(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - return out; -}; - -/** - * Scales a vec3 by a scalar number - * - * @param {vec3} out the receiving vector - * @param {vec3} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec3} out - */ -vec3.scale = function(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - return out; -}; - -/** - * Adds two vec3's after scaling the second operand by a scalar value - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec3} out - */ -vec3.scaleAndAdd = function(out, a, b, scale) { - out[0] = a[0] + (b[0] * scale); - out[1] = a[1] + (b[1] * scale); - out[2] = a[2] + (b[2] * scale); - return out; -}; - -/** - * Calculates the euclidian distance between two vec3's - * - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {Number} distance between a and b - */ -vec3.distance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1], - z = b[2] - a[2]; - return Math.sqrt(x*x + y*y + z*z); -}; - -/** - * Alias for {@link vec3.distance} - * @function - */ -vec3.dist = vec3.distance; - -/** - * Calculates the squared euclidian distance between two vec3's - * - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {Number} squared distance between a and b - */ -vec3.squaredDistance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1], - z = b[2] - a[2]; - return x*x + y*y + z*z; -}; - -/** - * Alias for {@link vec3.squaredDistance} - * @function - */ -vec3.sqrDist = vec3.squaredDistance; - -/** - * Calculates the length of a vec3 - * - * @param {vec3} a vector to calculate length of - * @returns {Number} length of a - */ -vec3.length = function (a) { - var x = a[0], - y = a[1], - z = a[2]; - return Math.sqrt(x*x + y*y + z*z); -}; - -/** - * Alias for {@link vec3.length} - * @function - */ -vec3.len = vec3.length; - -/** - * Calculates the squared length of a vec3 - * - * @param {vec3} a vector to calculate squared length of - * @returns {Number} squared length of a - */ -vec3.squaredLength = function (a) { - var x = a[0], - y = a[1], - z = a[2]; - return x*x + y*y + z*z; -}; - -/** - * Alias for {@link vec3.squaredLength} - * @function - */ -vec3.sqrLen = vec3.squaredLength; - -/** - * Negates the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {vec3} a vector to negate - * @returns {vec3} out - */ -vec3.negate = function(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - return out; -}; - -/** - * Returns the inverse of the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {vec3} a vector to invert - * @returns {vec3} out - */ -vec3.inverse = function(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - return out; -}; - -/** - * Normalize a vec3 - * - * @param {vec3} out the receiving vector - * @param {vec3} a vector to normalize - * @returns {vec3} out - */ -vec3.normalize = function(out, a) { - var x = a[0], - y = a[1], - z = a[2]; - var len = x*x + y*y + z*z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; - } - return out; -}; - -/** - * Calculates the dot product of two vec3's - * - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {Number} dot product of a and b - */ -vec3.dot = function (a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -}; - -/** - * Computes the cross product of two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -vec3.cross = function(out, a, b) { - var ax = a[0], ay = a[1], az = a[2], - bx = b[0], by = b[1], bz = b[2]; - - out[0] = ay * bz - az * by; - out[1] = az * bx - ax * bz; - out[2] = ax * by - ay * bx; - return out; -}; - -/** - * Performs a linear interpolation between two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec3} out - */ -vec3.lerp = function (out, a, b, t) { - var ax = a[0], - ay = a[1], - az = a[2]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - return out; -}; - -/** - * Performs a hermite interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @param {vec3} c the third operand - * @param {vec3} d the fourth operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec3} out - */ -vec3.hermite = function (out, a, b, c, d, t) { - var factorTimes2 = t * t, - factor1 = factorTimes2 * (2 * t - 3) + 1, - factor2 = factorTimes2 * (t - 2) + t, - factor3 = factorTimes2 * (t - 1), - factor4 = factorTimes2 * (3 - 2 * t); - - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - - return out; -}; - -/** - * Performs a bezier interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @param {vec3} c the third operand - * @param {vec3} d the fourth operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec3} out - */ -vec3.bezier = function (out, a, b, c, d, t) { - var inverseFactor = 1 - t, - inverseFactorTimesTwo = inverseFactor * inverseFactor, - factorTimes2 = t * t, - factor1 = inverseFactorTimesTwo * inverseFactor, - factor2 = 3 * t * inverseFactorTimesTwo, - factor3 = 3 * factorTimes2 * inverseFactor, - factor4 = factorTimes2 * t; - - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - - return out; -}; - -/** - * Generates a random vector with the given scale - * - * @param {vec3} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec3} out - */ -vec3.random = function (out, scale) { - scale = scale || 1.0; - - var r = glMatrix.RANDOM() * 2.0 * Math.PI; - var z = (glMatrix.RANDOM() * 2.0) - 1.0; - var zScale = Math.sqrt(1.0-z*z) * scale; - - out[0] = Math.cos(r) * zScale; - out[1] = Math.sin(r) * zScale; - out[2] = z * scale; - return out; -}; - -/** - * Transforms the vec3 with a mat4. - * 4th vector component is implicitly '1' - * - * @param {vec3} out the receiving vector - * @param {vec3} a the vector to transform - * @param {mat4} m matrix to transform with - * @returns {vec3} out - */ -vec3.transformMat4 = function(out, a, m) { - var x = a[0], y = a[1], z = a[2], - w = m[3] * x + m[7] * y + m[11] * z + m[15]; - w = w || 1.0; - out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; - out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; - out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; - return out; -}; - -/** - * Transforms the vec3 with a mat3. - * - * @param {vec3} out the receiving vector - * @param {vec3} a the vector to transform - * @param {mat4} m the 3x3 matrix to transform with - * @returns {vec3} out - */ -vec3.transformMat3 = function(out, a, m) { - var x = a[0], y = a[1], z = a[2]; - out[0] = x * m[0] + y * m[3] + z * m[6]; - out[1] = x * m[1] + y * m[4] + z * m[7]; - out[2] = x * m[2] + y * m[5] + z * m[8]; - return out; -}; - -/** - * Transforms the vec3 with a quat - * - * @param {vec3} out the receiving vector - * @param {vec3} a the vector to transform - * @param {quat} q quaternion to transform with - * @returns {vec3} out - */ -vec3.transformQuat = function(out, a, q) { - // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations - - var x = a[0], y = a[1], z = a[2], - qx = q[0], qy = q[1], qz = q[2], qw = q[3], - - // calculate quat * vec - ix = qw * x + qy * z - qz * y, - iy = qw * y + qz * x - qx * z, - iz = qw * z + qx * y - qy * x, - iw = -qx * x - qy * y - qz * z; - - // calculate result * inverse quat - out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; - out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; - out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; - return out; -}; - -/** - * Rotate a 3D vector around the x-axis - * @param {vec3} out The receiving vec3 - * @param {vec3} a The vec3 point to rotate - * @param {vec3} b The origin of the rotation - * @param {Number} c The angle of rotation - * @returns {vec3} out - */ -vec3.rotateX = function(out, a, b, c){ - var p = [], r=[]; - //Translate point to the origin - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; - - //perform rotation - r[0] = p[0]; - r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c); - r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c); - - //translate to correct position - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - - return out; -}; - -/** - * Rotate a 3D vector around the y-axis - * @param {vec3} out The receiving vec3 - * @param {vec3} a The vec3 point to rotate - * @param {vec3} b The origin of the rotation - * @param {Number} c The angle of rotation - * @returns {vec3} out - */ -vec3.rotateY = function(out, a, b, c){ - var p = [], r=[]; - //Translate point to the origin - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; - - //perform rotation - r[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c); - r[1] = p[1]; - r[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c); - - //translate to correct position - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - - return out; -}; - -/** - * Rotate a 3D vector around the z-axis - * @param {vec3} out The receiving vec3 - * @param {vec3} a The vec3 point to rotate - * @param {vec3} b The origin of the rotation - * @param {Number} c The angle of rotation - * @returns {vec3} out - */ -vec3.rotateZ = function(out, a, b, c){ - var p = [], r=[]; - //Translate point to the origin - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; - - //perform rotation - r[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c); - r[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c); - r[2] = p[2]; - - //translate to correct position - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - - return out; -}; - -/** - * Perform some operation over an array of vec3s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ -vec3.forEach = (function() { - var vec = vec3.create(); - - return function(a, stride, offset, count, fn, arg) { - var i, l; - if(!stride) { - stride = 3; - } - - if(!offset) { - offset = 0; - } - - if(count) { - l = Math.min((count * stride) + offset, a.length); - } else { - l = a.length; - } - - for(i = offset; i < l; i += stride) { - vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; - fn(vec, vec, arg); - a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; - } - - return a; - }; -})(); - -/** - * Get the angle between two 3D vectors - * @param {vec3} a The first operand - * @param {vec3} b The second operand - * @returns {Number} The angle in radians - */ -vec3.angle = function(a, b) { - - var tempA = vec3.fromValues(a[0], a[1], a[2]); - var tempB = vec3.fromValues(b[0], b[1], b[2]); - - vec3.normalize(tempA, tempA); - vec3.normalize(tempB, tempB); - - var cosine = vec3.dot(tempA, tempB); - - if(cosine > 1.0){ - return 0; - } else { - return Math.acos(cosine); - } -}; - -/** - * Returns a string representation of a vector - * - * @param {vec3} vec vector to represent as a string - * @returns {String} string representation of the vector - */ -vec3.str = function (a) { - return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; -}; - -module.exports = vec3; - -},{"./common.js":117}],125:[function(require,module,exports){ -/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -var glMatrix = require("./common.js"); - -/** - * @class 4 Dimensional Vector - * @name vec4 - */ -var vec4 = {}; - -/** - * Creates a new, empty vec4 - * - * @returns {vec4} a new 4D vector - */ -vec4.create = function() { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - return out; -}; - -/** - * Creates a new vec4 initialized with values from an existing vector - * - * @param {vec4} a vector to clone - * @returns {vec4} a new 4D vector - */ -vec4.clone = function(a) { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -}; - -/** - * Creates a new vec4 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} a new 4D vector - */ -vec4.fromValues = function(x, y, z, w) { - var out = new glMatrix.ARRAY_TYPE(4); - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -}; - -/** - * Copy the values from one vec4 to another - * - * @param {vec4} out the receiving vector - * @param {vec4} a the source vector - * @returns {vec4} out - */ -vec4.copy = function(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -}; - -/** - * Set the components of a vec4 to the given values - * - * @param {vec4} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} out - */ -vec4.set = function(out, x, y, z, w) { - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -}; - -/** - * Adds two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.add = function(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - return out; -}; - -/** - * Subtracts vector b from vector a - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.subtract = function(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - return out; -}; - -/** - * Alias for {@link vec4.subtract} - * @function - */ -vec4.sub = vec4.subtract; - -/** - * Multiplies two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.multiply = function(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - out[3] = a[3] * b[3]; - return out; -}; - -/** - * Alias for {@link vec4.multiply} - * @function - */ -vec4.mul = vec4.multiply; - -/** - * Divides two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.divide = function(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - out[3] = a[3] / b[3]; - return out; -}; - -/** - * Alias for {@link vec4.divide} - * @function - */ -vec4.div = vec4.divide; - -/** - * Returns the minimum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.min = function(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - out[3] = Math.min(a[3], b[3]); - return out; -}; - -/** - * Returns the maximum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {vec4} out - */ -vec4.max = function(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - out[3] = Math.max(a[3], b[3]); - return out; -}; - -/** - * Scales a vec4 by a scalar number - * - * @param {vec4} out the receiving vector - * @param {vec4} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec4} out - */ -vec4.scale = function(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - return out; -}; - -/** - * Adds two vec4's after scaling the second operand by a scalar value - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec4} out - */ -vec4.scaleAndAdd = function(out, a, b, scale) { - out[0] = a[0] + (b[0] * scale); - out[1] = a[1] + (b[1] * scale); - out[2] = a[2] + (b[2] * scale); - out[3] = a[3] + (b[3] * scale); - return out; -}; - -/** - * Calculates the euclidian distance between two vec4's - * - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {Number} distance between a and b - */ -vec4.distance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1], - z = b[2] - a[2], - w = b[3] - a[3]; - return Math.sqrt(x*x + y*y + z*z + w*w); -}; - -/** - * Alias for {@link vec4.distance} - * @function - */ -vec4.dist = vec4.distance; - -/** - * Calculates the squared euclidian distance between two vec4's - * - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {Number} squared distance between a and b - */ -vec4.squaredDistance = function(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1], - z = b[2] - a[2], - w = b[3] - a[3]; - return x*x + y*y + z*z + w*w; -}; - -/** - * Alias for {@link vec4.squaredDistance} - * @function - */ -vec4.sqrDist = vec4.squaredDistance; - -/** - * Calculates the length of a vec4 - * - * @param {vec4} a vector to calculate length of - * @returns {Number} length of a - */ -vec4.length = function (a) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - return Math.sqrt(x*x + y*y + z*z + w*w); -}; - -/** - * Alias for {@link vec4.length} - * @function - */ -vec4.len = vec4.length; - -/** - * Calculates the squared length of a vec4 - * - * @param {vec4} a vector to calculate squared length of - * @returns {Number} squared length of a - */ -vec4.squaredLength = function (a) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - return x*x + y*y + z*z + w*w; -}; - -/** - * Alias for {@link vec4.squaredLength} - * @function - */ -vec4.sqrLen = vec4.squaredLength; - -/** - * Negates the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {vec4} a vector to negate - * @returns {vec4} out - */ -vec4.negate = function(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = -a[3]; - return out; -}; - -/** - * Returns the inverse of the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {vec4} a vector to invert - * @returns {vec4} out - */ -vec4.inverse = function(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - out[3] = 1.0 / a[3]; - return out; -}; - -/** - * Normalize a vec4 - * - * @param {vec4} out the receiving vector - * @param {vec4} a vector to normalize - * @returns {vec4} out - */ -vec4.normalize = function(out, a) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - var len = x*x + y*y + z*z + w*w; - if (len > 0) { - len = 1 / Math.sqrt(len); - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; - } - return out; -}; - -/** - * Calculates the dot product of two vec4's - * - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @returns {Number} dot product of a and b - */ -vec4.dot = function (a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -}; - -/** - * Performs a linear interpolation between two vec4's - * - * @param {vec4} out the receiving vector - * @param {vec4} a the first operand - * @param {vec4} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec4} out - */ -vec4.lerp = function (out, a, b, t) { - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - out[3] = aw + t * (b[3] - aw); - return out; -}; - -/** - * Generates a random vector with the given scale - * - * @param {vec4} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec4} out - */ -vec4.random = function (out, scale) { - scale = scale || 1.0; - - //TODO: This is a pretty awful way of doing this. Find something better. - out[0] = glMatrix.RANDOM(); - out[1] = glMatrix.RANDOM(); - out[2] = glMatrix.RANDOM(); - out[3] = glMatrix.RANDOM(); - vec4.normalize(out, out); - vec4.scale(out, out, scale); - return out; -}; - -/** - * Transforms the vec4 with a mat4. - * - * @param {vec4} out the receiving vector - * @param {vec4} a the vector to transform - * @param {mat4} m matrix to transform with - * @returns {vec4} out - */ -vec4.transformMat4 = function(out, a, m) { - var x = a[0], y = a[1], z = a[2], w = a[3]; - out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; - out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; - out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; - out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; - return out; -}; - -/** - * Transforms the vec4 with a quat - * - * @param {vec4} out the receiving vector - * @param {vec4} a the vector to transform - * @param {quat} q quaternion to transform with - * @returns {vec4} out - */ -vec4.transformQuat = function(out, a, q) { - var x = a[0], y = a[1], z = a[2], - qx = q[0], qy = q[1], qz = q[2], qw = q[3], - - // calculate quat * vec - ix = qw * x + qy * z - qz * y, - iy = qw * y + qz * x - qx * z, - iz = qw * z + qx * y - qy * x, - iw = -qx * x - qy * y - qz * z; - - // calculate result * inverse quat - out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; - out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; - out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; - out[3] = a[3]; - return out; -}; - -/** - * Perform some operation over an array of vec4s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ -vec4.forEach = (function() { - var vec = vec4.create(); - - return function(a, stride, offset, count, fn, arg) { - var i, l; - if(!stride) { - stride = 4; - } - - if(!offset) { - offset = 0; - } - - if(count) { - l = Math.min((count * stride) + offset, a.length); - } else { - l = a.length; - } - - for(i = offset; i < l; i += stride) { - vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3]; - fn(vec, vec, arg); - a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3]; - } - - return a; - }; -})(); - -/** - * Returns a string representation of a vector - * - * @param {vec4} vec vector to represent as a string - * @returns {String} string representation of the vector - */ -vec4.str = function (a) { - return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; -}; - -module.exports = vec4; - -},{"./common.js":117}],126:[function(require,module,exports){ -'use strict'; - -function constant(value) { - return function() { - return value; - } -} - -function interpolateNumber(a, b, t) { - return (a * (1 - t)) + (b * t); -} - -function interpolateArray(a, b, t) { - var result = []; - for (var i = 0; i < a.length; i++) { - result[i] = interpolateNumber(a[i], b[i], t); - } - return result; -} - -exports['interpolated'] = function(f) { - if (!f.stops) { - return constant(f); - } - - var stops = f.stops, - base = f.base || 1, - interpolate = Array.isArray(stops[0][1]) ? interpolateArray : interpolateNumber; - - return function(z) { - // find the two stops which the current z is between - var low, high; - - for (var i = 0; i < stops.length; i++) { - var stop = stops[i]; - - if (stop[0] <= z) { - low = stop; - } - - if (stop[0] > z) { - high = stop; - break; - } - } - - if (low && high) { - var zoomDiff = high[0] - low[0], - zoomProgress = z - low[0], - - t = base === 1 ? - zoomProgress / zoomDiff : - (Math.pow(base, zoomProgress) - 1) / (Math.pow(base, zoomDiff) - 1); - - return interpolate(low[1], high[1], t); - - } else if (low) { - return low[1]; - - } else if (high) { - return high[1]; - } - }; -}; - -exports['piecewise-constant'] = function(f) { - if (!f.stops) { - return constant(f); - } - - var stops = f.stops; - - return function(z) { - for (var i = 0; i < stops.length; i++) { - if (stops[i][0] > z) { - return stops[i === 0 ? 0 : i - 1][1]; - } - } - - return stops[stops.length - 1][1]; - } -}; - -},{}],127:[function(require,module,exports){ -'use strict'; - -var reference = require('../../reference/latest.js'); -var validate = require('./parsed'); - -module.exports = function(style) { - return validate(style, reference); -}; - -},{"../../reference/latest.js":129,"./parsed":128}],128:[function(require,module,exports){ -'use strict'; - -var parseCSSColor = require('csscolorparser').parseCSSColor; -var format = require('util').format; - -module.exports = function(style, reference) { - - var constants = style.constants || {}, - layers = {}, - errors = []; - - function error(key, val /*, message, ...*/) { - var err = { - message: (key ? key + ': ' : '') + - format.apply(format, Array.prototype.slice.call(arguments, 2)) - }; - - if (val !== null && val !== undefined && val.__line__) { - err.line = val.__line__; - } - - errors.push(err); - } - - // Main recursive validation function. Tracks: - // - // - key: string representing location of validation in style tree. Used only - // for more informative error reporting. - // - val: current value from style being evaluated. May be anything from a - // high level object that needs to be descended into deeper or a simple - // scalar value. - // - spec: current spec being evaluated. Tracks val. - // - function validate(key, val, spec) { - var type = typeof_(val); - - // Constants - if (type === 'string' && val[0] === '@') { - if (!(val in constants)) { - return error(key, val, 'constant "%s" not found', val); - } - val = constants[val]; - type = typeof_(val); - } - - // Functions - if (spec.function && type === 'object') { - return validate.function(key, val, spec); - } - - if (spec.type) { - var validator = validate[spec.type]; - if (validator) { - return validator(key, val, spec); - } - spec = reference[spec.type]; - } - - validate.object(key, val, spec); - } - - validate.constants = function(key, val) { - var type = typeof_(val); - if (type !== 'object') { - return error(key, val, 'object expected, %s found', type); - } - - for (var k in val) { - if (k[0] !== '@') { - error(key + '.' + k, val[k], 'constants must start with "@"'); - } - } - }; - - validate.source = function(key, val) { - if (!val.type) { - error(key, val, '"type" is required'); - return; - } - - var type = unbundle(val.type); - switch (type) { - case 'vector': - case 'raster': - validate.object(key, val, reference.source_tile); - - if ('url' in val) { - for (var prop in val) { - if (['type', 'url', 'tileSize'].indexOf(prop) < 0) { - error(key + '.' + prop, val[prop], 'a source with a "url" property may not include a "%s" property', prop); - } - } - } - - break; - case 'geojson': - validate.object(key, val, reference.source_geojson); - break; - case 'video': - validate.object(key, val, reference.source_video); - break; - default: - validate.enum(key + '.type', val.type, {values: ['vector', 'raster', 'geojson', 'video']}); - } - }; - - validate.layer = function(key, val) { - if (!val.type && !val.ref) { - error(key, val, 'either "type" or "ref" is required'); - } - - var type = unbundle(val.type), - ref = unbundle(val.ref); - - if (val.id) { - if (layers[val.id]) { - error(key, val.id, 'duplicate layer id "%s", previously used at line %d', val.id, layers[val.id]); - } else { - layers[val.id] = val.id.__line__; - } - } - - if ('ref' in val) { - ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { - if (p in val) { - error(key, val[p], '"%s" is prohibited for ref layers', p); - } - }); - - var parent; - - style.layers.forEach(function(layer) { - if (layer.id == ref) parent = layer; - }); - - if (!parent) { - error(key, val.ref, 'ref layer "%s" not found', ref); - } else if (parent.ref) { - error(key, val.ref, 'ref cannot reference another ref layer'); - } else { - type = parent.type; - } - } else if (type !== 'background') { - if (!val.source) { - error(key, val, 'missing required property "source"'); - } else { - var source = style.sources[val.source]; - if (!source) { - error(key, val.source, 'source "%s" not found', val.source); - } else if (source.type == 'vector' && type == 'raster') { - error(key, val.source, 'layer "%s" requires a raster source', val.id); - } else if (source.type == 'raster' && type != 'raster') { - error(key, val.source, 'layer "%s" requires a vector source', val.id); - } - } - } - - validate.object(key, val, reference.layer, { - filter: validate.filter, - layout: function(key, val) { - var spec = reference['layout_' + type]; - return type && spec && validate(key, val, spec); - }, - paint: function(key, val) { - var spec = reference['paint_' + type]; - return type && spec && validate(key, val, spec); - } - }); - }; - - validate.object = function (key, val, spec, validators) { - validators = validators || {}; - - var type = typeof_(val); - if (type !== 'object') { - return error(key, val, 'object expected, %s found', type); - } - - for (var k in val) { - var speckey = k.split('.')[0]; // treat 'paint.*' as 'paint' - var def = spec[speckey] || spec['*']; - var transition = speckey.match(/^(.*)-transition$/); - - if (def) { - (validators[speckey] || validate)((key ? key + '.' : key) + k, val[k], def); - } else if (transition && spec[transition[1]] && spec[transition[1]].transition) { - validate((key ? key + '.' : key) + k, val[k], reference.transition); - // tolerate root-level extra keys & arbitrary layer properties - } else if (key !== '' && key.split('.').length !== 1) { - error(key, val[k], 'unknown property "%s"', k); - } - } - - for (var l in spec) { - if (spec[l].required && spec[l]['default'] === undefined && val[l] === undefined) { - error(key, val, 'missing required property "%s"', l); - } - } - }; - - validate.array = function (key, val, spec, validator) { - if (typeof_(val) !== 'array') { - return error(key, val, 'array expected, %s found', typeof_(val)); - } - - if (spec.length && val.length !== spec.length) { - return error(key, val, 'array length %d expected, length %d found', spec.length, val.length); - } - - var value = { - "type": spec.value - }; - - if (style.version < 7) { - value.function = spec.function; - } - - if (typeof_(spec.value) === 'object') { - value = spec.value; - } - - for (var i = 0; i < val.length; i++) { - (validator || validate)(key + '[' + i + ']', val[i], value); - } - }; - - validate.filter = function(key, val) { - var type; - - if (typeof_(val) !== 'array') { - return error(key, val, 'array expected, %s found', typeof_(val)); - } - - if (val.length < 1) { - return error(key, val, 'filter array must have at least 1 element'); - } - - validate.enum(key + '[0]', val[0], reference.filter_operator); - - switch (unbundle(val[0])) { - case '<': - case '<=': - case '>': - case '>=': - if (val.length >= 2 && val[1] == '$type') { - error(key, val, '"$type" cannot be use with operator "%s"', val[0]); - } - /* falls through */ - case '==': - case '!=': - if (val.length != 3) { - error(key, val, 'filter array for operator "%s" must have 3 elements', val[0]); - } - /* falls through */ - case 'in': - case '!in': - if (val.length >= 2) { - type = typeof_(val[1]); - if (type !== 'string') { - error(key + '[1]', val[1], 'string expected, %s found', type); - } else if (val[1][0] === '@') { - error(key + '[1]', val[1], 'filter key cannot be a constant'); - } - } - for (var i = 2; i < val.length; i++) { - type = typeof_(val[i]); - if (val[1] == '$type') { - validate.enum(key + '[' + i + ']', val[i], reference.geometry_type); - } else if (type === 'string' && val[i][0] === '@') { - error(key + '[' + i + ']', val[i], 'filter value cannot be a constant'); - } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { - error(key + '[' + i + ']', val[i], 'string, number, or boolean expected, %s found', type); - } - } - break; - - case 'any': - case 'all': - case 'none': - for (i = 1; i < val.length; i++) { - validate.filter(key + '[' + i + ']', val[i]); - } - break; - } - }; - - validate.function = function(key, val, spec) { - validate.object(key, val, reference.function, { - stops: function (key, val, arraySpec) { - var lastStop = -Infinity; - validate.array(key, val, arraySpec, function validateStop(key, val) { - if (typeof_(val) !== 'array') { - return error(key, val, 'array expected, %s found', typeof_(val)); - } - - if (val.length !== 2) { - return error(key, val, 'array length %d expected, length %d found', 2, val.length); - } - - validate(key + '[0]', val[0], {type: 'number'}); - validate(key + '[1]', val[1], spec); - - if (typeof_(val[0]) === 'number') { - if (spec.function === 'piecewise-constant' && val[0] % 1 !== 0) { - error(key + '[0]', val[0], 'zoom level for piecewise-constant functions must be an integer'); - } - - if (val[0] < lastStop) { - error(key + '[0]', val[0], 'array stops must appear in ascending order'); - } - - lastStop = val[0]; - } - }); - - if (typeof_(val) === 'array' && val.length === 0) { - error(key, val, 'array must have at least one stop'); - } - } - }); - }; - - validate.enum = function (key, val, spec) { - if (spec.values.indexOf(unbundle(val)) === -1) { - error(key, val, 'expected one of [%s], %s found', spec.values.join(', '), val); - } - }; - - validate.color = function(key, val) { - var type = typeof_(val); - if (type !== 'string') { - error(key, val, 'color expected, %s found', type); - } else if (parseCSSColor(val) === null) { - error(key, val, 'color expected, "%s" found', val); - } - }; - - function typeValidator(expected) { - return function(key, val, spec) { - var actual = typeof_(val); - if (actual !== expected) { - error(key, val, '%s expected, %s found', expected, actual); - } - - if ('minimum' in spec && val < spec.minimum) { - error(key, val, '%s is less than the minimum value %s', val, spec.minimum); - } - - if ('maximum' in spec && val > spec.maximum) { - error(key, val, '%s is greater than the maximum value %s', val, spec.maximum); - } - }; - } - - validate.number = typeValidator('number'); - validate.string = typeValidator('string'); - validate.boolean = typeValidator('boolean'); - - validate['*'] = function() {}; - - validate('', style, reference.$root); - - return errors; -}; - -function typeof_(val) { - if (val instanceof Number) - return 'number'; - if (val instanceof String) - return 'string'; - if (val instanceof Boolean) - return 'boolean'; - if (Array.isArray(val)) - return 'array'; - if (val === null) - return 'null'; - return typeof val; -} - -function unbundle(_) { - if (_ instanceof Number || - _ instanceof String || - _ instanceof Boolean) { - return _.valueOf(); - } else { - return _; - } -} - -},{"csscolorparser":108,"util":107}],129:[function(require,module,exports){ -module.exports = require('./v7.json'); - -},{"./v7.json":130}],130:[function(require,module,exports){ -module.exports={ - "$version": 7, - "$root": { - "version": { - "required": true, - "type": "enum", - "values": [ - 7 - ], - "doc": "Stylesheet version number. Must be 7." - }, - "name": { - "type": "string", - "doc": "A human-readable name for the style." - }, - "constants": { - "type": "constants", - "doc": "An object of constants to be referenced in layers." - }, - "sources": { - "required": true, - "type": "sources", - "doc": "Data source specifications." - }, - "sprite": { - "type": "string", - "doc": "A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended." - }, - "glyphs": { - "type": "string", - "doc": "A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}." - }, - "transition": { - "type": "transition", - "doc": "A global transition definition to use as a default across properties." - }, - "layers": { - "required": true, - "type": "array", - "value": "layer", - "doc": "Layers will be drawn in the order of this array." - } - }, - "constants": { - "*": { - "type": "*", - "doc": "A constant that will be replaced verbatim in the referencing place. This can be anything, including objects and arrays. All variable names must be prefixed with an `@` symbol." - } - }, - "sources": { - "*": { - "type": "source", - "doc": "Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided." - } - }, - "source": [ - "source_tile", - "source_geojson", - "source_video" - ], - "source_tile": { - "type": { - "required": true, - "type": "enum", - "values": [ - "vector", - "raster" - ], - "doc": "The data type of the source." - }, - "url": { - "type": "string", - "doc": "A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`." - }, - "tiles": { - "type": "array", - "value": "string", - "doc": "An array of one or more tile source URLs, as in the TileJSON spec." - }, - "minzoom": { - "type": "number", - "default": 0, - "doc": "Minimum zoom level for which tiles are available, as in the TileJSON spec." - }, - "maxzoom": { - "type": "number", - "default": 22, - "doc": "Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels." - }, - "tileSize": { - "type": "number", - "default": 512, - "units": "pixels", - "doc": "The minimum visual size to display tiles for this layer. Only configurable for raster layers." - }, - "*": { - "type": "*", - "doc": "Other keys to configure the data source." - } - }, - "source_geojson": { - "type": { - "required": true, - "type": "enum", - "values": [ - "geojson" - ] - }, - "data": { - "type": "*" - } - }, - "source_video": { - "type": { - "required": true, - "type": "enum", - "values": [ - "video" - ] - }, - "url": { - "required": true, - "type": "array", - "value": "string", - "doc": "URLs to video content in order of preferred format." - }, - "coordinates": { - "required": true, - "type": "array", - "length": 4, - "value": { - "type": "array", - "length": 2, - "value": "number" - } - } - }, - "layer": { - "id": { - "type": "string", - "doc": "Unique layer name." - }, - "type": { - "type": "enum", - "values": [ - "fill", - "line", - "symbol", - "raster", - "background" - ], - "doc": "Rendering type of this layer." - }, - "ref": { - "type": "string", - "doc": "References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient." - }, - "source": { - "type": "string", - "doc": "Name of a source description to be used for this layer." - }, - "source-layer": { - "type": "string", - "doc": "Layer to use from a vector tile source. Required if the source supports multiple layers." - }, - "minzoom": { - "type": "number", - "minimum": 0, - "maximum": 22, - "doc": "The minimum zoom level on which the layer gets parsed and appears on." - }, - "maxzoom": { - "type": "number", - "minimum": 0, - "maximum": 22, - "doc": "The maximum zoom level on which the layer gets parsed and appears on." - }, - "interactive": { - "type": "boolean", - "doc": "Enable querying of feature data from this layer for interactivity.", - "default": false - }, - "filter": { - "type": "filter", - "doc": "A expression specifying conditions on source features. Only features that match the filter are displayed." - }, - "layout": { - "type": "layout", - "doc": "Layout properties for the layer." - }, - "paint": { - "type": "paint", - "doc": "Default paint properties for this layer." - }, - "paint.*": { - "type": "paint", - "doc": "Class-specific paint properties for this layer. The class name is the part after the first dot." - } - }, - "layout": [ - "layout_fill", - "layout_line", - "layout_symbol", - "layout_raster", - "layout_background" - ], - "layout_background": { - "visibility": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "visible", - "none" - ], - "default": "visible", - "doc": "The display of this layer. `none` hides this layer." - } - }, - "layout_fill": { - "visibility": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "visible", - "none" - ], - "default": "visible", - "doc": "The display of this layer. `none` hides this layer." - } - }, - "layout_line": { - "line-cap": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "butt", - "round", - "square" - ], - "default": "butt", - "doc": "The display of line endings." - }, - "line-join": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "bevel", - "round", - "miter" - ], - "default": "miter", - "doc": "The display of lines when joining." - }, - "line-miter-limit": { - "type": "number", - "default": 2, - "function": "interpolated", - "doc": "Used to automatically convert miter joins to bevel joins for sharp angles.", - "requires": [ - { - "line-join": "miter" - } - ] - }, - "line-round-limit": { - "type": "number", - "default": 1, - "function": "interpolated", - "doc": "Used to automatically convert round joins to miter joins for shallow angles.", - "requires": [ - { - "line-join": "round" - } - ] - }, - "visibility": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "visible", - "none" - ], - "default": "visible", - "doc": "The display of this layer. `none` hides this layer." - } - }, - "layout_symbol": { - "symbol-placement": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "point", - "line" - ], - "default": "point", - "doc": "Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons." - }, - "symbol-min-distance": { - "type": "number", - "default": 250, - "minimum": 1, - "function": "interpolated", - "units": "pixels", - "doc": "Minimum distance between two symbol anchors.", - "requires": [ - { - "symbol-placement": "line" - } - ] - }, - "symbol-avoid-edges": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer." - }, - "icon-allow-overlap": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the icon will be visible even if it collides with other icons and text.", - "requires": [ - "icon-image" - ] - }, - "icon-ignore-placement": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the icon won't affect placement of other icons and text.", - "requires": [ - "icon-image" - ] - }, - "icon-optional": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the symbol will appear without its icon, in spaces where the icon would make it too large to fit.", - "requires": [ - "icon-image", - "text-field" - ] - }, - "icon-rotation-alignment": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "default": "viewport", - "doc": "Orientation of icon when map is rotated.", - "requires": [ - "icon-image" - ] - }, - "icon-max-size": { - "type": "number", - "default": 1, - "minimum": 0, - "function": "interpolated", - "doc": "The maximum factor to scale the icon.", - "requires": [ - "icon-image" - ] - }, - "icon-image": { - "type": "string", - "function": "piecewise-constant", - "doc": "A string with {tokens} replaced, referencing the data property to pull from.", - "tokens": true - }, - "icon-rotate": { - "type": "number", - "default": 0, - "period": 360, - "function": "interpolated", - "units": "degrees", - "doc": "Rotates the icon clockwise.", - "requires": [ - "icon-image" - ] - }, - "icon-padding": { - "type": "number", - "default": 2, - "minimum": 0, - "function": "interpolated", - "units": "pixels", - "doc": "Padding value around icon bounding box to avoid icon collisions.", - "requires": [ - "icon-image" - ] - }, - "icon-keep-upright": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the icon may be flipped to prevent it from being rendered upside-down", - "requires": [ - "icon-image", - { - "icon-rotation-alignment": "map" - } - ] - }, - "icon-offset": { - "type": "array", - "value": "number", - "length": 2, - "default": [ - 0, - 0 - ], - "function": "interpolated", - "doc": "Icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.", - "requires": [ - "icon-image" - ] - }, - "text-rotation-alignment": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "default": "viewport", - "doc": "Orientation of icon or text when map is rotated.", - "requires": [ - "text-field" - ] - }, - "text-field": { - "type": "string", - "function": "piecewise-constant", - "default": "", - "tokens": true, - "doc": "Value to use for a text label. Feature properties are specified using tokens like {field_name}." - }, - "text-font": { - "type": "string", - "function": "piecewise-constant", - "default": "Open Sans Regular, Arial Unicode MS Regular", - "doc": "Font stack to use for displaying text.", - "requires": [ - "text-field" - ] - }, - "text-max-size": { - "type": "number", - "default": 16, - "minimum": 0, - "units": "pixels", - "function": "interpolated", - "doc": "The maximum size text will be laid out, to calculate collisions with.", - "requires": [ - "text-field" - ] - }, - "text-max-width": { - "type": "number", - "default": 15, - "minimum": 0, - "units": "em", - "function": "interpolated", - "doc": "The maximum line width for text wrapping.", - "requires": [ - "text-field" - ] - }, - "text-line-height": { - "type": "number", - "default": 1.2, - "units": "em", - "function": "interpolated", - "doc": "Text leading value for multi-line text.", - "requires": [ - "text-field" - ] - }, - "text-letter-spacing": { - "type": "number", - "default": 0, - "units": "em", - "function": "interpolated", - "doc": "Text kerning value.", - "requires": [ - "text-field" - ] - }, - "text-justify": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "left", - "center", - "right" - ], - "default": "center", - "doc": "Text justification options.", - "requires": [ - "text-field" - ] - }, - "text-anchor": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "center", - "left", - "right", - "top", - "bottom", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "default": "center", - "doc": "Which part of the text to place closest to the anchor.", - "requires": [ - "text-field" - ] - }, - "text-max-angle": { - "type": "number", - "default": 45, - "units": "degrees", - "function": "interpolated", - "doc": "Maximum angle change between adjacent characters.", - "requires": [ - "text-field", - { - "symbol-placement": "line" - } - ] - }, - "text-rotate": { - "type": "number", - "default": 0, - "period": 360, - "units": "degrees", - "function": "interpolated", - "doc": "Rotates the text clockwise.", - "requires": [ - "text-field" - ] - }, - "text-padding": { - "type": "number", - "default": 2, - "minimum": 0, - "units": "pixels", - "function": "interpolated", - "doc": "Padding value around text bounding box to avoid label collisions.", - "requires": [ - "text-field" - ] - }, - "text-keep-upright": { - "type": "boolean", - "function": "piecewise-constant", - "default": true, - "doc": "If true, the text may be flipped vertically to prevent it from being rendered upside-down.", - "requires": [ - "text-field", - { - "text-rotation-alignment": "map" - } - ] - }, - "text-transform": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "none", - "uppercase", - "lowercase" - ], - "default": "none", - "doc": "Specifies how to capitalize text, similar to the CSS `text-transform` property.", - "requires": [ - "text-field" - ] - }, - "text-offset": { - "type": "array", - "doc": "Specifies the distance that text is offset from its anchor horizontally and vertically.", - "value": "number", - "units": "ems", - "function": "interpolated", - "length": 2, - "default": [ - 0, - 0 - ], - "requires": [ - "text-field" - ] - }, - "text-allow-overlap": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the text will be visible even if it collides with other icons and labels.", - "requires": [ - "text-field" - ] - }, - "text-ignore-placement": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the text won't affect placement of other icons and labels.", - "requires": [ - "text-field" - ] - }, - "text-optional": { - "type": "boolean", - "function": "piecewise-constant", - "default": false, - "doc": "If true, the symbol will appear without its text, in spaces where the text would make it too large to fit.", - "requires": [ - "text-field", - "icon-image" - ] - }, - "visibility": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "visible", - "none" - ], - "default": "visible", - "doc": "The display of this layer. `none` hides this layer." - } - }, - "layout_raster": { - "visibility": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "visible", - "none" - ], - "default": "visible", - "doc": "The display of this layer. `none` hides this layer." - } - }, - "filter": { - "type": "array", - "value": "*" - }, - "filter_operator": { - "type": "enum", - "values": [ - "==", - "!=", - ">", - ">=", - "<", - "<=", - "in", - "!in", - "all", - "any", - "none" - ] - }, - "geometry_type": { - "type": "enum", - "values": [ - "Point", - "LineString", - "Polygon" - ] - }, - "function": { - "stops": { - "type": "array", - "required": true, - "doc": "An array of stops.", - "value": "function_stop" - }, - "base": { - "type": "number", - "default": 1, - "minimum": 0, - "doc": "The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly." - } - }, - "function_stop": { - "type": "array", - "minimum": 0, - "maximum": 22, - "value": [ - "number", - "color" - ], - "length": 2, - "doc": "Zoom level and value pair." - }, - "paint": [ - "paint_fill", - "paint_line", - "paint_symbol", - "paint_raster", - "paint_background" - ], - "paint_fill": { - "fill-antialias": { - "type": "boolean", - "function": "piecewise-constant", - "default": true, - "doc": "Whether or not the fill should be antialiased." - }, - "fill-opacity": { - "type": "number", - "function": "interpolated", - "default": 1, - "minimum": 0, - "maximum": 1, - "doc": "The opacity given to the fill color.", - "transition": true - }, - "fill-color": { - "type": "color", - "default": "#000000", - "doc": "The color of the fill.", - "function": "interpolated", - "transition": true, - "requires": [ - { - "!": "fill-image" - } - ] - }, - "fill-outline-color": { - "type": "color", - "doc": "The outline color of the fill. Matches the value of `fill-color` if unspecified.", - "function": "interpolated", - "transition": true, - "requires": [ - { - "!": "fill-image" - }, - { - "fill-antialias": true - } - ] - }, - "fill-translate": { - "type": "array", - "value": "number", - "length": 2, - "default": [ - 0, - 0 - ], - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively." - }, - "fill-translate-anchor": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", - "default": "map", - "requires": [ - "fill-translate" - ] - }, - "fill-image": { - "type": "string", - "function": "piecewise-constant", - "transition": true, - "doc": "Name of image in sprite to use for drawing image fills." - } - }, - "paint_line": { - "line-opacity": { - "type": "number", - "doc": "The opacity at which the line will be drawn.", - "function": "interpolated", - "default": 1, - "minimum": 0, - "maximum": 1, - "transition": true - }, - "line-color": { - "type": "color", - "doc": "The color with which the line will be drawn.", - "default": "#000000", - "function": "interpolated", - "transition": true, - "requires": [ - { - "!": "line-image" - } - ] - }, - "line-translate": { - "type": "array", - "value": "number", - "length": 2, - "default": [ - 0, - 0 - ], - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively." - }, - "line-translate-anchor": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", - "default": "map", - "requires": [ - "line-translate" - ] - }, - "line-width": { - "type": "number", - "default": 1, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Stroke thickness." - }, - "line-gap-width": { - "type": "number", - "default": 0, - "minimum": 0, - "doc": "Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.", - "function": "interpolated", - "transition": true, - "units": "pixels" - }, - "line-blur": { - "type": "number", - "default": 0, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Blur applied to the line, in pixels." - }, - "line-dasharray": { - "type": "array", - "function": "piecewise-constant", - "value": "number", - "doc": "Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.", - "minimum": 0, - "transition": true, - "units": "line widths", - "requires": [ - { - "!": "line-image" - } - ] - }, - "line-image": { - "type": "string", - "function": "piecewise-constant", - "transition": true, - "doc": "Name of image in sprite to use for drawing image lines." - } - }, - "paint_symbol": { - "icon-opacity": { - "doc": "The opacity at which the icon will be drawn.", - "type": "number", - "default": 1, - "minimum": 0, - "maximum": 1, - "function": "interpolated", - "transition": true, - "requires": [ - "icon-image" - ] - }, - "icon-size": { - "type": "number", - "default": 1, - "function": "interpolated", - "transition": true, - "doc": "Scale factor for icon. 1 is original size, 3 triples the size.", - "requires": [ - "icon-image" - ] - }, - "icon-color": { - "type": "color", - "default": "#000000", - "function": "interpolated", - "transition": true, - "doc": "The color of the icon. This can only be used with sdf icons.", - "requires": [ - "icon-image" - ] - }, - "icon-halo-color": { - "type": "color", - "default": "rgba(0, 0, 0, 0)", - "function": "interpolated", - "transition": true, - "doc": "The color of the icon's halo. Icon halos can only be used with sdf icons.", - "requires": [ - "icon-image" - ] - }, - "icon-halo-width": { - "type": "number", - "default": 0, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Distance of halo to the icon outline.", - "requires": [ - "icon-image" - ] - }, - "icon-halo-blur": { - "type": "number", - "default": 0, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Fade out the halo towards the outside.", - "requires": [ - "icon-image" - ] - }, - "icon-translate": { - "type": "array", - "value": "number", - "length": 2, - "default": [ - 0, - 0 - ], - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "An icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.", - "requires": [ - "icon-image" - ] - }, - "icon-translate-anchor": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", - "default": "map", - "requires": [ - "icon-image", - "icon-translate" - ] - }, - "text-opacity": { - "type": "number", - "doc": "The opacity at which the text will be drawn.", - "default": 1, - "minimum": 0, - "maximum": 1, - "function": "interpolated", - "transition": true, - "requires": [ - "text-field" - ] - }, - "text-size": { - "type": "number", - "default": 16, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Font size. If unspecified, the text will be as big as allowed by the layer definition.", - "requires": [ - "text-field" - ] - }, - "text-color": { - "type": "color", - "doc": "The color with which the text will be drawn.", - "default": "#000000", - "function": "interpolated", - "transition": true, - "requires": [ - "text-field" - ] - }, - "text-halo-color": { - "type": "color", - "default": "rgba(0, 0, 0, 0)", - "function": "interpolated", - "transition": true, - "doc": "The color of the text's halo, which helps it stand out from backgrounds.", - "requires": [ - "text-field" - ] - }, - "text-halo-width": { - "type": "number", - "default": 0, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.", - "requires": [ - "text-field" - ] - }, - "text-halo-blur": { - "type": "number", - "default": 0, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "The halo's fadeout distance towards the outside.", - "requires": [ - "text-field" - ] - }, - "text-translate": { - "type": "array", - "value": "number", - "length": 2, - "default": [ - 0, - 0 - ], - "function": "interpolated", - "transition": true, - "units": "pixels", - "doc": "Label offset. Values are [x, y] where negatives indicate left and up, respectively.", - "requires": [ - "text-field" - ] - }, - "text-translate-anchor": { - "type": "enum", - "function": "piecewise-constant", - "values": [ - "map", - "viewport" - ], - "doc": "Control whether the translation is relative to the map (north) or viewport (screen)", - "default": "map", - "requires": [ - "text-field", - "text-translate" - ] - } - }, - "paint_raster": { - "raster-opacity": { - "type": "number", - "doc": "The opacity at which the image will be drawn.", - "default": 1, - "minimum": 0, - "maximum": 1, - "function": "interpolated", - "transition": true - }, - "raster-hue-rotate": { - "type": "number", - "default": 0, - "period": 360, - "function": "interpolated", - "transition": true, - "units": "degrees", - "doc": "Rotates hues around the color wheel." - }, - "raster-brightness-min": { - "type": "number", - "function": "interpolated", - "doc": "Increase or reduce the brightness of the image. The value is the minimum brightness.", - "default": 0, - "minimum": 0, - "maximum": 1, - "transition": true - }, - "raster-brightness-max": { - "type": "number", - "function": "interpolated", - "doc": "Increase or reduce the brightness of the image. The value is the maximum brightness.", - "default": 1, - "minimum": 0, - "maximum": 1, - "transition": true - }, - "raster-saturation": { - "type": "number", - "doc": "Increase or reduce the saturation of the image.", - "default": 0, - "minimum": -1, - "maximum": 1, - "function": "interpolated", - "transition": true - }, - "raster-contrast": { - "type": "number", - "doc": "Increase or reduce the contrast of the image.", - "default": 0, - "minimum": -1, - "maximum": 1, - "function": "interpolated", - "transition": true - }, - "raster-fade-duration": { - "type": "number", - "default": 300, - "minimum": 0, - "function": "interpolated", - "transition": true, - "units": "milliseconds", - "doc": "Fade duration when a new tile is added." - } - }, - "paint_background": { - "background-color": { - "type": "color", - "default": "#000000", - "doc": "The color with which the background will be drawn.", - "function": "interpolated", - "transition": true, - "requires": [ - { - "!": "background-image" - } - ] - }, - "background-image": { - "type": "string", - "function": "piecewise-constant", - "transition": true, - "doc": "Optionally an image which is drawn as the background." - }, - "background-opacity": { - "type": "number", - "default": 1, - "minimum": 0, - "maximum": 1, - "doc": "The opacity at which the background will be drawn.", - "function": "interpolated", - "transition": true - } - }, - "transition": { - "duration": { - "type": "number", - "default": 300, - "minimum": 0, - "units": "milliseconds", - "doc": "Time allotted for transitions to complete." - }, - "delay": { - "type": "number", - "default": 0, - "minimum": 0, - "units": "milliseconds", - "doc": "Length of time before a transition begins." - } - } -} - -},{}],131:[function(require,module,exports){ -'use strict'; - -// lightweight Buffer shim for pbf browser build -// based on code from github.com/feross/buffer (MIT-licensed) - -module.exports = Buffer; - -var ieee754 = require('ieee754'); - -var BufferMethods; - -function Buffer(length) { - var arr; - if (length && length.length) { - arr = length; - length = arr.length; - } - var buf = new Uint8Array(length || 0); - if (arr) buf.set(arr); - - buf.readUInt32LE = BufferMethods.readUInt32LE; - buf.writeUInt32LE = BufferMethods.writeUInt32LE; - buf.readInt32LE = BufferMethods.readInt32LE; - buf.writeInt32LE = BufferMethods.writeInt32LE; - buf.readFloatLE = BufferMethods.readFloatLE; - buf.writeFloatLE = BufferMethods.writeFloatLE; - buf.readDoubleLE = BufferMethods.readDoubleLE; - buf.writeDoubleLE = BufferMethods.writeDoubleLE; - buf.toString = BufferMethods.toString; - buf.write = BufferMethods.write; - buf.slice = BufferMethods.slice; - buf.copy = BufferMethods.copy; - - buf._isBuffer = true; - return buf; -} - -var lastStr, lastStrEncoded; - -BufferMethods = { - readUInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] * 0x1000000); - }, - - writeUInt32LE: function(val, pos) { - this[pos] = val; - this[pos + 1] = (val >>> 8); - this[pos + 2] = (val >>> 16); - this[pos + 3] = (val >>> 24); - }, - - readInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] << 24); - }, - - readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, - readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, - - writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, - writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - - toString: function(encoding, start, end) { - var str = '', - tmp = ''; - - start = start || 0; - end = Math.min(this.length, end || this.length); - - for (var i = start; i < end; i++) { - var ch = this[i]; - if (ch <= 0x7F) { - str += decodeURIComponent(tmp) + String.fromCharCode(ch); - tmp = ''; - } else { - tmp += '%' + ch.toString(16); - } - } - - str += decodeURIComponent(tmp); - - return str; - }, - - write: function(str, pos) { - var bytes = str === lastStr ? lastStrEncoded : encodeString(str); - for (var i = 0; i < bytes.length; i++) { - this[pos + i] = bytes[i]; - } - }, - - slice: function(start, end) { - return this.subarray(start, end); - }, - - copy: function(buf, pos) { - pos = pos || 0; - for (var i = 0; i < this.length; i++) { - buf[pos + i] = this[i]; - } - } -}; - -BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; - -Buffer.byteLength = function(str) { - lastStr = str; - lastStrEncoded = encodeString(str); - return lastStrEncoded.length; -}; - -Buffer.isBuffer = function(buf) { - return !!(buf && buf._isBuffer); -}; - -function encodeString(str) { - var length = str.length, - bytes = []; - - for (var i = 0, c, lead; i < length; i++) { - c = str.charCodeAt(i); // code point - - if (c > 0xD7FF && c < 0xE000) { - - if (lead) { - if (c < 0xDC00) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = c; - continue; - - } else { - c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; - lead = null; - } - - } else { - if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); - else lead = c; - - continue; - } - - } else if (lead) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = null; - } - - if (c < 0x80) bytes.push(c); - else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); - else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - } - return bytes; -} - -},{"ieee754":133}],132:[function(require,module,exports){ -(function (global){ -'use strict'; - -module.exports = Pbf; - -var Buffer = global.Buffer || require('./buffer'); - -function Pbf(buf) { - this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; - this.pos = 0; - this.length = this.buf.length; -} - -Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum -Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 -Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields -Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 - -var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), - SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, - POW_2_63 = Math.pow(2, 63); - -Pbf.prototype = { - - destroy: function() { - this.buf = null; - }, - - // === READING ================================================================= - - readFields: function(readField, result, end) { - end = end || this.length; - - while (this.pos < end) { - var val = this.readVarint(), - tag = val >> 3, - startPos = this.pos; - - readField(tag, result, this); - - if (this.pos === startPos) this.skip(val); - } - return result; - }, - - readMessage: function(readField, result) { - return this.readFields(readField, result, this.readVarint() + this.pos); - }, - - readFixed32: function() { - var val = this.buf.readUInt32LE(this.pos); - this.pos += 4; - return val; - }, - - readSFixed32: function() { - var val = this.buf.readInt32LE(this.pos); - this.pos += 4; - return val; - }, - - // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) - - readFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, - - readSFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, - - readFloat: function() { - var val = this.buf.readFloatLE(this.pos); - this.pos += 4; - return val; - }, - - readDouble: function() { - var val = this.buf.readDoubleLE(this.pos); - this.pos += 8; - return val; - }, - - readVarint: function() { - var buf = this.buf, - val, b, b0, b1, b2, b3; - - b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; - b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; - b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; - b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; - - val = b0 | b1 | b2 | (b3 & 0x7f) << 21; - - b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; - - throw new Error('Expected varint not more than 10 bytes'); - }, - - readVarint64: function() { - var startPos = this.pos, - val = this.readVarint(); - - if (val < POW_2_63) return val; - - var pos = this.pos - 2; - while (this.buf[pos] === 0xff) pos--; - if (pos < startPos) pos = startPos; - - val = 0; - for (var i = 0; i < pos - startPos + 1; i++) { - var b = ~this.buf[startPos + i] & 0x7f; - val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); - } - - return -val - 1; - }, - - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, - - readBoolean: function() { - return Boolean(this.readVarint()); - }, - - readString: function() { - var end = this.readVarint() + this.pos, - str = this.buf.toString('utf8', this.pos, end); - this.pos = end; - return str; - }, - - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.slice(this.pos, end); - this.pos = end; - return buffer; - }, - - // verbose for performance reasons; doesn't affect gzipped size - - readPackedVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readVarint()); - return arr; - }, - readPackedSVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSVarint()); - return arr; - }, - readPackedBoolean: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readBoolean()); - return arr; - }, - readPackedFloat: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFloat()); - return arr; - }, - readPackedDouble: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readDouble()); - return arr; - }, - readPackedFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed32()); - return arr; - }, - readPackedSFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed32()); - return arr; - }, - readPackedFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed64()); - return arr; - }, - readPackedSFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed64()); - return arr; - }, - - skip: function(val) { - var type = val & 0x7; - if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} - else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; - else if (type === Pbf.Fixed32) this.pos += 4; - else if (type === Pbf.Fixed64) this.pos += 8; - else throw new Error('Unimplemented type: ' + type); - }, - - // === WRITING ================================================================= - - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, - - realloc: function(min) { - var length = this.length || 16; - - while (length < this.pos + min) length *= 2; - - if (length !== this.length) { - var buf = new Buffer(length); - this.buf.copy(buf); - this.buf = buf; - this.length = length; - } - }, - - finish: function() { - this.length = this.pos; - this.pos = 0; - return this.buf.slice(0, this.length); - }, - - writeFixed32: function(val) { - this.realloc(4); - this.buf.writeUInt32LE(val, this.pos); - this.pos += 4; - }, - - writeSFixed32: function(val) { - this.realloc(4); - this.buf.writeInt32LE(val, this.pos); - this.pos += 4; - }, - - writeFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, - - writeSFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, - - writeVarint: function(val) { - val = +val; - - if (val <= 0x7f) { - this.realloc(1); - this.buf[this.pos++] = val; - - } else if (val <= 0x3fff) { - this.realloc(2); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f); - - } else if (val <= 0x1fffff) { - this.realloc(3); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f); - - } else if (val <= 0xfffffff) { - this.realloc(4); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 21) & 0x7f); - - } else { - var pos = this.pos; - while (val >= 0x80) { - this.realloc(1); - this.buf[this.pos++] = (val & 0xff) | 0x80; - val /= 0x80; - } - this.realloc(1); - this.buf[this.pos++] = val | 0; - if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); - } - }, - - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, - - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, - - writeString: function(str) { - str = String(str); - var bytes = Buffer.byteLength(str); - this.writeVarint(bytes); - this.realloc(bytes); - this.buf.write(str, this.pos); - this.pos += bytes; - }, - - writeFloat: function(val) { - this.realloc(4); - this.buf.writeFloatLE(val, this.pos); - this.pos += 4; - }, - - writeDouble: function(val) { - this.realloc(8); - this.buf.writeDoubleLE(val, this.pos); - this.pos += 8; - }, - - writeBytes: function(buffer) { - var len = buffer.length; - this.writeVarint(len); - this.realloc(len); - for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; - }, - - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); - - this.pos++; // reserve 1 byte for short message length - - // write the message directly to the buffer and see how much was written - var startPos = this.pos; - fn(obj, this); - var len = this.pos - startPos; - - var varintLen = - len <= 0x7f ? 1 : - len <= 0x3fff ? 2 : - len <= 0x1fffff ? 3 : - len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); - - // if 1 byte isn't enough for encoding message length, shift the data to the right - if (varintLen > 1) { - this.realloc(varintLen - 1); - for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; - } - - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, - - writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, - writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, - writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, - writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, - writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, - writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, - writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, - writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, - writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, - - writeBytesField: function(tag, buffer) { - this.writeTag(tag, Pbf.Bytes); - this.writeBytes(buffer); - }, - writeFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFixed32(val); - }, - writeSFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeSFixed32(val); - }, - writeFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeFixed64(val); - }, - writeSFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeSFixed64(val); - }, - writeVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeVarint(val); - }, - writeSVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeSVarint(val); - }, - writeStringField: function(tag, str) { - this.writeTag(tag, Pbf.Bytes); - this.writeString(str); - }, - writeFloatField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFloat(val); - }, - writeDoubleField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeDouble(val); - }, - writeBooleanField: function(tag, val) { - this.writeVarintField(tag, Boolean(val)); - } -}; - -function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } -function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } -function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } -function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } -function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } -function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } -function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } -function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } -function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./buffer":131}],133:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],134:[function(require,module,exports){ -'use strict'; - -module.exports = Point; - -function Point(x, y) { - this.x = x; - this.y = y; -} - -Point.prototype = { - clone: function() { return new Point(this.x, this.y); }, - - add: function(p) { return this.clone()._add(p); }, - sub: function(p) { return this.clone()._sub(p); }, - mult: function(k) { return this.clone()._mult(k); }, - div: function(k) { return this.clone()._div(k); }, - rotate: function(a) { return this.clone()._rotate(a); }, - matMult: function(m) { return this.clone()._matMult(m); }, - unit: function() { return this.clone()._unit(); }, - perp: function() { return this.clone()._perp(); }, - round: function() { return this.clone()._round(); }, - - mag: function() { - return Math.sqrt(this.x * this.x + this.y * this.y); - }, - - equals: function(p) { - return this.x === p.x && - this.y === p.y; - }, - - dist: function(p) { - return Math.sqrt(this.distSqr(p)); - }, - - distSqr: function(p) { - var dx = p.x - this.x, - dy = p.y - this.y; - return dx * dx + dy * dy; - }, - - angle: function() { - return Math.atan2(this.y, this.x); - }, - - angleTo: function(b) { - return Math.atan2(this.y - b.y, this.x - b.x); - }, - - angleWith: function(b) { - return this.angleWithSep(b.x, b.y); - }, - - // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. - angleWithSep: function(x, y) { - return Math.atan2( - this.x * y - this.y * x, - this.x * x + this.y * y); - }, - - _matMult: function(m) { - var x = m[0] * this.x + m[1] * this.y, - y = m[2] * this.x + m[3] * this.y; - this.x = x; - this.y = y; - return this; - }, - - _add: function(p) { - this.x += p.x; - this.y += p.y; - return this; - }, - - _sub: function(p) { - this.x -= p.x; - this.y -= p.y; - return this; - }, - - _mult: function(k) { - this.x *= k; - this.y *= k; - return this; - }, - - _div: function(k) { - this.x /= k; - this.y /= k; - return this; - }, - - _unit: function() { - this._div(this.mag()); - return this; - }, - - _perp: function() { - var y = this.y; - this.y = this.x; - this.x = -y; - return this; - }, - - _rotate: function(angle) { - var cos = Math.cos(angle), - sin = Math.sin(angle), - x = cos * this.x - sin * this.y, - y = sin * this.x + cos * this.y; - this.x = x; - this.y = y; - return this; - }, - - _round: function() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - } -}; - -// constructs Point from an array if necessary -Point.convert = function (a) { - if (a instanceof Point) { - return a; - } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); - } - return a; -}; - -},{}],135:[function(require,module,exports){ -/* - (c) 2013, Vladimir Agafonkin - RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles. - https://github.com/mourner/rbush -*/ - -(function () { 'use strict'; - -function rbush(maxEntries, format) { - - // jshint newcap: false, validthis: true - if (!(this instanceof rbush)) return new rbush(maxEntries, format); - - // max entries in a node is 9 by default; min node fill is 40% for best performance - this._maxEntries = Math.max(4, maxEntries || 9); - this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)); - - if (format) { - this._initFormat(format); - } - - this.clear(); -} - -rbush.prototype = { - - all: function () { - return this._all(this.data, []); - }, - - search: function (bbox) { - - var node = this.data, - result = [], - toBBox = this.toBBox; - - if (!intersects(bbox, node.bbox)) return result; - - var nodesToSearch = [], - i, len, child, childBBox; - - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { - - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child.bbox; - - if (intersects(bbox, childBBox)) { - if (node.leaf) result.push(child); - else if (contains(bbox, childBBox)) this._all(child, result); - else nodesToSearch.push(child); - } - } - node = nodesToSearch.pop(); - } - - return result; - }, - - collides: function (bbox) { - - var node = this.data, - toBBox = this.toBBox; - - if (!intersects(bbox, node.bbox)) return false; - - var nodesToSearch = [], - i, len, child, childBBox; - - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { - - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child.bbox; - - if (intersects(bbox, childBBox)) { - if (node.leaf || contains(bbox, childBBox)) return true; - nodesToSearch.push(child); - } - } - node = nodesToSearch.pop(); - } - - return false; - }, - - load: function (data) { - if (!(data && data.length)) return this; - - if (data.length < this._minEntries) { - for (var i = 0, len = data.length; i < len; i++) { - this.insert(data[i]); - } - return this; - } - - // recursively build the tree with the given data from stratch using OMT algorithm - var node = this._build(data.slice(), 0, data.length - 1, 0); - - if (!this.data.children.length) { - // save as is if tree is empty - this.data = node; - - } else if (this.data.height === node.height) { - // split root if trees have the same height - this._splitRoot(this.data, node); - - } else { - if (this.data.height < node.height) { - // swap trees if inserted one is bigger - var tmpNode = this.data; - this.data = node; - node = tmpNode; - } - - // insert the small tree into the large tree at appropriate level - this._insert(node, this.data.height - node.height - 1, true); - } - - return this; - }, - - insert: function (item) { - if (item) this._insert(item, this.data.height - 1); - return this; - }, - - clear: function () { - this.data = { - children: [], - height: 1, - bbox: empty(), - leaf: true - }; - return this; - }, - - remove: function (item) { - if (!item) return this; - - var node = this.data, - bbox = this.toBBox(item), - path = [], - indexes = [], - i, parent, index, goingUp; - - // depth-first iterative tree traversal - while (node || path.length) { - - if (!node) { // go up - node = path.pop(); - parent = path[path.length - 1]; - i = indexes.pop(); - goingUp = true; - } - - if (node.leaf) { // check current node - index = node.children.indexOf(item); - - if (index !== -1) { - // item found, remove the item and condense tree upwards - node.children.splice(index, 1); - path.push(node); - this._condense(path); - return this; - } - } - - if (!goingUp && !node.leaf && contains(node.bbox, bbox)) { // go down - path.push(node); - indexes.push(i); - i = 0; - parent = node; - node = node.children[0]; - - } else if (parent) { // go right - i++; - node = parent.children[i]; - goingUp = false; - - } else node = null; // nothing found - } - - return this; - }, - - toBBox: function (item) { return item; }, - - compareMinX: function (a, b) { return a[0] - b[0]; }, - compareMinY: function (a, b) { return a[1] - b[1]; }, - - toJSON: function () { return this.data; }, - - fromJSON: function (data) { - this.data = data; - return this; - }, - - _all: function (node, result) { - var nodesToSearch = []; - while (node) { - if (node.leaf) result.push.apply(result, node.children); - else nodesToSearch.push.apply(nodesToSearch, node.children); - - node = nodesToSearch.pop(); - } - return result; - }, - - _build: function (items, left, right, height) { - - var N = right - left + 1, - M = this._maxEntries, - node; - - if (N <= M) { - // reached leaf level; return leaf - node = { - children: items.slice(left, right + 1), - height: 1, - bbox: null, - leaf: true - }; - calcBBox(node, this.toBBox); - return node; - } - - if (!height) { - // target height of the bulk-loaded tree - height = Math.ceil(Math.log(N) / Math.log(M)); - - // target number of root entries to maximize storage utilization - M = Math.ceil(N / Math.pow(M, height - 1)); - } - - // TODO eliminate recursion? - - node = { - children: [], - height: height, - bbox: null - }; - - // split the items into M mostly square tiles - - var N2 = Math.ceil(N / M), - N1 = N2 * Math.ceil(Math.sqrt(M)), - i, j, right2, right3; - - multiSelect(items, left, right, N1, this.compareMinX); - - for (i = left; i <= right; i += N1) { - - right2 = Math.min(i + N1 - 1, right); - - multiSelect(items, i, right2, N2, this.compareMinY); - - for (j = i; j <= right2; j += N2) { - - right3 = Math.min(j + N2 - 1, right2); - - // pack each entry recursively - node.children.push(this._build(items, j, right3, height - 1)); - } - } - - calcBBox(node, this.toBBox); - - return node; - }, - - _chooseSubtree: function (bbox, node, level, path) { - - var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; - - while (true) { - path.push(node); - - if (node.leaf || path.length - 1 === level) break; - - minArea = minEnlargement = Infinity; - - for (i = 0, len = node.children.length; i < len; i++) { - child = node.children[i]; - area = bboxArea(child.bbox); - enlargement = enlargedArea(bbox, child.bbox) - area; - - // choose entry with the least area enlargement - if (enlargement < minEnlargement) { - minEnlargement = enlargement; - minArea = area < minArea ? area : minArea; - targetNode = child; - - } else if (enlargement === minEnlargement) { - // otherwise choose one with the smallest area - if (area < minArea) { - minArea = area; - targetNode = child; - } - } - } - - node = targetNode; - } - - return node; - }, - - _insert: function (item, level, isNode) { - - var toBBox = this.toBBox, - bbox = isNode ? item.bbox : toBBox(item), - insertPath = []; - - // find the best node for accommodating the item, saving all nodes along the path too - var node = this._chooseSubtree(bbox, this.data, level, insertPath); - - // put the item into the node - node.children.push(item); - extend(node.bbox, bbox); - - // split on node overflow; propagate upwards if necessary - while (level >= 0) { - if (insertPath[level].children.length > this._maxEntries) { - this._split(insertPath, level); - level--; - } else break; - } - - // adjust bboxes along the insertion path - this._adjustParentBBoxes(bbox, insertPath, level); - }, - - // split overflowed node into two - _split: function (insertPath, level) { - - var node = insertPath[level], - M = node.children.length, - m = this._minEntries; - - this._chooseSplitAxis(node, m, M); - - var newNode = { - children: node.children.splice(this._chooseSplitIndex(node, m, M)), - height: node.height - }; - - if (node.leaf) newNode.leaf = true; - - calcBBox(node, this.toBBox); - calcBBox(newNode, this.toBBox); - - if (level) insertPath[level - 1].children.push(newNode); - else this._splitRoot(node, newNode); - }, - - _splitRoot: function (node, newNode) { - // split root node - this.data = { - children: [node, newNode], - height: node.height + 1 - }; - calcBBox(this.data, this.toBBox); - }, - - _chooseSplitIndex: function (node, m, M) { - - var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; - - minOverlap = minArea = Infinity; - - for (i = m; i <= M - m; i++) { - bbox1 = distBBox(node, 0, i, this.toBBox); - bbox2 = distBBox(node, i, M, this.toBBox); - - overlap = intersectionArea(bbox1, bbox2); - area = bboxArea(bbox1) + bboxArea(bbox2); - - // choose distribution with minimum overlap - if (overlap < minOverlap) { - minOverlap = overlap; - index = i; - - minArea = area < minArea ? area : minArea; - - } else if (overlap === minOverlap) { - // otherwise choose distribution with minimum area - if (area < minArea) { - minArea = area; - index = i; - } - } - } - - return index; - }, - - // sorts node children by the best axis for split - _chooseSplitAxis: function (node, m, M) { - - var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, - compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, - xMargin = this._allDistMargin(node, m, M, compareMinX), - yMargin = this._allDistMargin(node, m, M, compareMinY); - - // if total distributions margin value is minimal for x, sort by minX, - // otherwise it's already sorted by minY - if (xMargin < yMargin) node.children.sort(compareMinX); - }, - - // total margin of all possible split distributions where each node is at least m full - _allDistMargin: function (node, m, M, compare) { - - node.children.sort(compare); - - var toBBox = this.toBBox, - leftBBox = distBBox(node, 0, m, toBBox), - rightBBox = distBBox(node, M - m, M, toBBox), - margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), - i, child; - - for (i = m; i < M - m; i++) { - child = node.children[i]; - extend(leftBBox, node.leaf ? toBBox(child) : child.bbox); - margin += bboxMargin(leftBBox); - } - - for (i = M - m - 1; i >= m; i--) { - child = node.children[i]; - extend(rightBBox, node.leaf ? toBBox(child) : child.bbox); - margin += bboxMargin(rightBBox); - } - - return margin; - }, - - _adjustParentBBoxes: function (bbox, path, level) { - // adjust bboxes along the given tree path - for (var i = level; i >= 0; i--) { - extend(path[i].bbox, bbox); - } - }, - - _condense: function (path) { - // go through the path, removing empty nodes and updating bboxes - for (var i = path.length - 1, siblings; i >= 0; i--) { - if (path[i].children.length === 0) { - if (i > 0) { - siblings = path[i - 1].children; - siblings.splice(siblings.indexOf(path[i]), 1); - - } else this.clear(); - - } else calcBBox(path[i], this.toBBox); - } - }, - - _initFormat: function (format) { - // data format (minX, minY, maxX, maxY accessors) - - // uses eval-type function compilation instead of just accepting a toBBox function - // because the algorithms are very sensitive to sorting functions performance, - // so they should be dead simple and without inner calls - - // jshint evil: true - - var compareArr = ['return a', ' - b', ';']; - - this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); - this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); - - this.toBBox = new Function('a', 'return [a' + format.join(', a') + '];'); - } -}; - - -// calculate node's bbox from bboxes of its children -function calcBBox(node, toBBox) { - node.bbox = distBBox(node, 0, node.children.length, toBBox); -} - -// min bounding rectangle of node children from k to p-1 -function distBBox(node, k, p, toBBox) { - var bbox = empty(); - - for (var i = k, child; i < p; i++) { - child = node.children[i]; - extend(bbox, node.leaf ? toBBox(child) : child.bbox); - } - - return bbox; -} - -function empty() { return [Infinity, Infinity, -Infinity, -Infinity]; } - -function extend(a, b) { - a[0] = Math.min(a[0], b[0]); - a[1] = Math.min(a[1], b[1]); - a[2] = Math.max(a[2], b[2]); - a[3] = Math.max(a[3], b[3]); - return a; -} - -function compareNodeMinX(a, b) { return a.bbox[0] - b.bbox[0]; } -function compareNodeMinY(a, b) { return a.bbox[1] - b.bbox[1]; } - -function bboxArea(a) { return (a[2] - a[0]) * (a[3] - a[1]); } -function bboxMargin(a) { return (a[2] - a[0]) + (a[3] - a[1]); } - -function enlargedArea(a, b) { - return (Math.max(b[2], a[2]) - Math.min(b[0], a[0])) * - (Math.max(b[3], a[3]) - Math.min(b[1], a[1])); -} - -function intersectionArea(a, b) { - var minX = Math.max(a[0], b[0]), - minY = Math.max(a[1], b[1]), - maxX = Math.min(a[2], b[2]), - maxY = Math.min(a[3], b[3]); - - return Math.max(0, maxX - minX) * - Math.max(0, maxY - minY); -} - -function contains(a, b) { - return a[0] <= b[0] && - a[1] <= b[1] && - b[2] <= a[2] && - b[3] <= a[3]; -} - -function intersects(a, b) { - return b[0] <= a[2] && - b[1] <= a[3] && - b[2] >= a[0] && - b[3] >= a[1]; -} - -// sort an array so that items come in groups of n unsorted items, with groups sorted between each other; -// combines selection algorithm with binary divide & conquer approach - -function multiSelect(arr, left, right, n, compare) { - var stack = [left, right], - mid; - - while (stack.length) { - right = stack.pop(); - left = stack.pop(); - - if (right - left <= n) continue; - - mid = left + Math.ceil((right - left) / n / 2) * n; - select(arr, left, right, mid, compare); - - stack.push(left, mid, mid, right); - } -} - -// Floyd-Rivest selection algorithm: -// sort an array between left and right (inclusive) so that the smallest k elements come first (unordered) -function select(arr, left, right, k, compare) { - var n, i, z, s, sd, newLeft, newRight, t, j; - - while (right > left) { - if (right - left > 600) { - n = right - left + 1; - i = k - left + 1; - z = Math.log(n); - s = 0.5 * Math.exp(2 * z / 3); - sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (i - n / 2 < 0 ? -1 : 1); - newLeft = Math.max(left, Math.floor(k - i * s / n + sd)); - newRight = Math.min(right, Math.floor(k + (n - i) * s / n + sd)); - select(arr, newLeft, newRight, k, compare); - } - - t = arr[k]; - i = left; - j = right; - - swap(arr, left, k); - if (compare(arr[right], t) > 0) swap(arr, left, right); - - while (i < j) { - swap(arr, i, j); - i++; - j--; - while (compare(arr[i], t) < 0) i++; - while (compare(arr[j], t) > 0) j--; - } - - if (compare(arr[left], t) === 0) swap(arr, left, j); - else { - j++; - swap(arr, j, right); - } - - if (j <= k) left = j + 1; - if (k <= j) right = j - 1; - } -} - -function swap(arr, i, j) { - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; -} - - -// export as AMD/CommonJS module or global variable -if (typeof define === 'function' && define.amd) define('rbush', function() { return rbush; }); -else if (typeof module !== 'undefined') module.exports = rbush; -else if (typeof self !== 'undefined') self.rbush = rbush; -else window.rbush = rbush; - -})(); - -},{}],136:[function(require,module,exports){ -// Copyright 2014 Simon Lydell -// X11 (“MIT”) Licensed. (See LICENSE.) - -void (function(root, factory) { - if (typeof define === "function" && define.amd) { - define(factory) - } else if (typeof exports === "object") { - module.exports = factory() - } else { - root.resolveUrl = factory() - } -}(this, function() { - - function resolveUrl(/* ...urls */) { - var numUrls = arguments.length - - if (numUrls === 0) { - throw new Error("resolveUrl requires at least one argument; got none.") - } - - var base = document.createElement("base") - base.href = arguments[0] - - if (numUrls === 1) { - return base.href - } - - var head = document.getElementsByTagName("head")[0] - head.insertBefore(base, head.firstChild) - - var a = document.createElement("a") - var resolved - - for (var index = 1; index < numUrls; index++) { - a.href = arguments[index] - resolved = a.href - base.href = resolved - } - - head.removeChild(base) - - return resolved - } - - return resolveUrl - -})); - -},{}],137:[function(require,module,exports){ -/* - * Copyright (C) 2008 Apple Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Ported from Webkit - * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h - */ - -module.exports = UnitBezier; - -function UnitBezier(p1x, p1y, p2x, p2y) { - // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). - this.cx = 3.0 * p1x; - this.bx = 3.0 * (p2x - p1x) - this.cx; - this.ax = 1.0 - this.cx - this.bx; - - this.cy = 3.0 * p1y; - this.by = 3.0 * (p2y - p1y) - this.cy; - this.ay = 1.0 - this.cy - this.by; - - this.p1x = p1x; - this.p1y = p2y; - this.p2x = p2x; - this.p2y = p2y; -} - -UnitBezier.prototype.sampleCurveX = function(t) { - // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. - return ((this.ax * t + this.bx) * t + this.cx) * t; -}; - -UnitBezier.prototype.sampleCurveY = function(t) { - return ((this.ay * t + this.by) * t + this.cy) * t; -}; - -UnitBezier.prototype.sampleCurveDerivativeX = function(t) { - return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; -}; - -UnitBezier.prototype.solveCurveX = function(x, epsilon) { - if (typeof epsilon === 'undefined') epsilon = 1e-6; - - var t0, t1, t2, x2, i; - - // First try a few iterations of Newton's method -- normally very fast. - for (t2 = x, i = 0; i < 8; i++) { - - x2 = this.sampleCurveX(t2) - x; - if (Math.abs(x2) < epsilon) return t2; - - var d2 = this.sampleCurveDerivativeX(t2); - if (Math.abs(d2) < 1e-6) break; - - t2 = t2 - x2 / d2; - } - - // Fall back to the bisection method for reliability. - t0 = 0.0; - t1 = 1.0; - t2 = x; - - if (t2 < t0) return t0; - if (t2 > t1) return t1; - - while (t0 < t1) { - - x2 = this.sampleCurveX(t2); - if (Math.abs(x2 - x) < epsilon) return t2; - - if (x > x2) { - t0 = t2; - } else { - t1 = t2; - } - - t2 = (t1 - t0) * 0.5 + t0; - } - - // Failure. - return t2; -}; - -UnitBezier.prototype.solve = function(x, epsilon) { - return this.sampleCurveY(this.solveCurveX(x, epsilon)); -}; - -},{}],138:[function(require,module,exports){ -module.exports.VectorTile = require('./lib/vectortile.js'); -module.exports.VectorTileFeature = require('./lib/vectortilefeature.js'); -module.exports.VectorTileLayer = require('./lib/vectortilelayer.js'); - -},{"./lib/vectortile.js":139,"./lib/vectortilefeature.js":140,"./lib/vectortilelayer.js":141}],139:[function(require,module,exports){ -'use strict'; - -var VectorTileLayer = require('./vectortilelayer'); - -module.exports = VectorTile; - -function VectorTile(pbf, end) { - this.layers = pbf.readFields(readTile, {}, end); -} - -function readTile(tag, layers, pbf) { - if (tag === 3) { - var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); - if (layer.length) layers[layer.name] = layer; - } -} - - -},{"./vectortilelayer":141}],140:[function(require,module,exports){ -'use strict'; - -var Point = require('point-geometry'); - -module.exports = VectorTileFeature; - -function VectorTileFeature(pbf, end, extent, keys, values) { - // Public - this.properties = {}; - this.extent = extent; - this.type = 0; - - // Private - this._pbf = pbf; - this._geometry = -1; - this._keys = keys; - this._values = values; - - pbf.readFields(readFeature, this, end); -} - -function readFeature(tag, feature, pbf) { - if (tag == 1) feature._id = pbf.readVarint(); - else if (tag == 2) readTag(pbf, feature); - else if (tag == 3) feature.type = pbf.readVarint(); - else if (tag == 4) feature._geometry = pbf.pos; -} - -function readTag(pbf, feature) { - var end = pbf.readVarint() + pbf.pos; - - while (pbf.pos < end) { - var key = feature._keys[pbf.readVarint()], - value = feature._values[pbf.readVarint()]; - feature.properties[key] = value; - } -} - -VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; - -VectorTileFeature.prototype.loadGeometry = function() { - var pbf = this._pbf; - pbf.pos = this._geometry; - - var end = pbf.readVarint() + pbf.pos, - cmd = 1, - length = 0, - x = 0, - y = 0, - lines = [], - line; - - while (pbf.pos < end) { - if (!length) { - var cmdLen = pbf.readVarint(); - cmd = cmdLen & 0x7; - length = cmdLen >> 3; - } - - length--; - - if (cmd === 1 || cmd === 2) { - x += pbf.readSVarint(); - y += pbf.readSVarint(); - - if (cmd === 1) { // moveTo - if (line) lines.push(line); - line = []; - } - - line.push(new Point(x, y)); - - } else if (cmd === 7) { - - // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 - if (line) { - line.push(line[0].clone()); // closePolygon - } - - } else { - throw new Error('unknown command ' + cmd); - } - } - - if (line) lines.push(line); - - return lines; -}; - -VectorTileFeature.prototype.bbox = function() { - var pbf = this._pbf; - pbf.pos = this._geometry; - - var end = pbf.readVarint() + pbf.pos, - cmd = 1, - length = 0, - x = 0, - y = 0, - x1 = Infinity, - x2 = -Infinity, - y1 = Infinity, - y2 = -Infinity; - - while (pbf.pos < end) { - if (!length) { - var cmdLen = pbf.readVarint(); - cmd = cmdLen & 0x7; - length = cmdLen >> 3; - } - - length--; - - if (cmd === 1 || cmd === 2) { - x += pbf.readSVarint(); - y += pbf.readSVarint(); - if (x < x1) x1 = x; - if (x > x2) x2 = x; - if (y < y1) y1 = y; - if (y > y2) y2 = y; - - } else if (cmd !== 7) { - throw new Error('unknown command ' + cmd); - } - } - - return [x1, y1, x2, y2]; -}; - -VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { - var size = this.extent * Math.pow(2, z), - x0 = this.extent * x, - y0 = this.extent * y, - coords = this.loadGeometry(), - type = VectorTileFeature.types[this.type]; - - for (var i = 0; i < coords.length; i++) { - var line = coords[i]; - for (var j = 0; j < line.length; j++) { - var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; - line[j] = [ - (p.x + x0) * 360 / size - 180, - 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 - ]; - } - } - - if (type === 'Point' && coords.length === 1) { - coords = coords[0][0]; - } else if (type === 'Point') { - coords = coords[0]; - type = 'MultiPoint'; - } else if (type === 'LineString' && coords.length === 1) { - coords = coords[0]; - } else if (type === 'LineString') { - type = 'MultiLineString'; - } - - return { - type: "Feature", - geometry: { - type: type, - coordinates: coords - }, - properties: this.properties - }; -}; - -},{"point-geometry":134}],141:[function(require,module,exports){ -'use strict'; - -var VectorTileFeature = require('./vectortilefeature.js'); - -module.exports = VectorTileLayer; - -function VectorTileLayer(pbf, end) { - // Public - this.version = 1; - this.name = null; - this.extent = 4096; - this.length = 0; - - // Private - this._pbf = pbf; - this._keys = []; - this._values = []; - this._features = []; - - pbf.readFields(readLayer, this, end); - - this.length = this._features.length; -} - -function readLayer(tag, layer, pbf) { - if (tag === 15) layer.version = pbf.readVarint(); - else if (tag === 1) layer.name = pbf.readString(); - else if (tag === 5) layer.extent = pbf.readVarint(); - else if (tag === 2) layer._features.push(pbf.pos); - else if (tag === 3) layer._keys.push(pbf.readString()); - else if (tag === 4) layer._values.push(readValueMessage(pbf)); -} - -function readValueMessage(pbf) { - var value = null, - end = pbf.readVarint() + pbf.pos; - - while (pbf.pos < end) { - var tag = pbf.readVarint() >> 3; - - value = tag === 1 ? pbf.readString() : - tag === 2 ? pbf.readFloat() : - tag === 3 ? pbf.readDouble() : - tag === 4 ? pbf.readVarint64() : - tag === 5 ? pbf.readVarint() : - tag === 6 ? pbf.readSVarint() : - tag === 7 ? pbf.readBoolean() : null; - } - - return value; -} - -// return feature `i` from this layer as a `VectorTileFeature` -VectorTileLayer.prototype.feature = function(i) { - if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); - - this._pbf.pos = this._features[i]; - - var end = this._pbf.readVarint() + this._pbf.pos; - return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); -}; - -},{"./vectortilefeature.js":140}],142:[function(require,module,exports){ -var bundleFn = arguments[3]; -var sources = arguments[4]; -var cache = arguments[5]; - -var stringify = JSON.stringify; - -module.exports = function (fn) { - var keys = []; - var wkey; - var cacheKeys = Object.keys(cache); - - for (var i = 0, l = cacheKeys.length; i < l; i++) { - var key = cacheKeys[i]; - if (cache[key].exports === fn) { - wkey = key; - break; - } - } - - if (!wkey) { - wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); - var wcache = {}; - for (var i = 0, l = cacheKeys.length; i < l; i++) { - var key = cacheKeys[i]; - wcache[key] = key; - } - sources[wkey] = [ - Function(['require','module','exports'], '(' + fn + ')(self)'), - wcache - ]; - } - var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); - - var scache = {}; scache[wkey] = wkey; - sources[skey] = [ - Function(['require'],'require(' + stringify(wkey) + ')(self)'), - scache - ]; - - var src = '(' + bundleFn + ')({' - + Object.keys(sources).map(function (key) { - return stringify(key) + ':[' - + sources[key][0] - + ',' + stringify(sources[key][1]) + ']' - ; - }).join(',') - + '},{},[' + stringify(skey) + '])' - ; - - var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; - - return new Worker(URL.createObjectURL( - new Blob([src], { type: 'text/javascript' }) - )); -}; - -},{}]},{},[22])(22) -}); -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcy9kYXRhL2J1ZmZlci9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9idWZmZXJfc2V0LmpzIiwianMvZGF0YS9idWZmZXIvY29sbGlzaW9uX2JveF92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvZmlsbF92ZXJ0ZXhfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvZ2x5cGhfdmVydGV4X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2ljb25fdmVydGV4X2J1ZmZlci5qcyIsImpzL2RhdGEvYnVmZmVyL2xpbmVfZWxlbWVudF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9saW5lX3ZlcnRleF9idWZmZXIuanMiLCJqcy9kYXRhL2J1ZmZlci9vdXRsaW5lX2VsZW1lbnRfYnVmZmVyLmpzIiwianMvZGF0YS9idWZmZXIvdHJpYW5nbGVfZWxlbWVudF9idWZmZXIuanMiLCJqcy9kYXRhL2NyZWF0ZV9idWNrZXQuanMiLCJqcy9kYXRhL2VsZW1lbnRfZ3JvdXBzLmpzIiwianMvZGF0YS9mZWF0dXJlX3RyZWUuanMiLCJqcy9kYXRhL2ZpbGxfYnVja2V0LmpzIiwianMvZGF0YS9saW5lX2J1Y2tldC5qcyIsImpzL2RhdGEvc3ltYm9sX2J1Y2tldC5qcyIsImpzL2dlby9jb29yZGluYXRlLmpzIiwianMvZ2VvL2xhdF9sbmcuanMiLCJqcy9nZW8vbGF0X2xuZ19ib3VuZHMuanMiLCJqcy9nZW8vdHJhbnNmb3JtLmpzIiwianMvbGliL2RlYnVndGV4dC5qcyIsImpzL21hcGJveC1nbC5qcyIsImpzL3JlbmRlci9kcmF3X2JhY2tncm91bmQuanMiLCJqcy9yZW5kZXIvZHJhd19jb2xsaXNpb25fZGVidWcuanMiLCJqcy9yZW5kZXIvZHJhd19kZWJ1Zy5qcyIsImpzL3JlbmRlci9kcmF3X2ZpbGwuanMiLCJqcy9yZW5kZXIvZHJhd19saW5lLmpzIiwianMvcmVuZGVyL2RyYXdfcmFzdGVyLmpzIiwianMvcmVuZGVyL2RyYXdfc3ltYm9sLmpzIiwianMvcmVuZGVyL2RyYXdfdmVydGljZXMuanMiLCJqcy9yZW5kZXIvZnJhbWVfaGlzdG9yeS5qcyIsImpzL3JlbmRlci9nbF91dGlsLmpzIiwianMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCJqcy9yZW5kZXIvcGFpbnRlci5qcyIsImpzL3JlbmRlci9zaGFkZXJzLmpzIiwianMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwianMvc291cmNlL2dlb2pzb25fd3JhcHBlci5qcyIsImpzL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCJqcy9zb3VyY2Uvc291cmNlLmpzIiwianMvc291cmNlL3RpbGUuanMiLCJqcy9zb3VyY2UvdGlsZV9jb29yZC5qcyIsImpzL3NvdXJjZS90aWxlX3B5cmFtaWQuanMiLCJqcy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwianMvc291cmNlL3ZpZGVvX3NvdXJjZS5qcyIsImpzL3NvdXJjZS93b3JrZXIuanMiLCJqcy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCJqcy9zdHlsZS9hbmltYXRpb25fbG9vcC5qcyIsImpzL3N0eWxlL2ltYWdlX3Nwcml0ZS5qcyIsImpzL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzLmpzIiwianMvc3R5bGUvcGFpbnRfcHJvcGVydGllcy5qcyIsImpzL3N0eWxlL3JlZmVyZW5jZS5qcyIsImpzL3N0eWxlL3N0eWxlLmpzIiwianMvc3R5bGUvc3R5bGVfYmF0Y2guanMiLCJqcy9zdHlsZS9zdHlsZV9jb25zdGFudC5qcyIsImpzL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uLmpzIiwianMvc3R5bGUvc3R5bGVfZGVjbGFyYXRpb25fc2V0LmpzIiwianMvc3R5bGUvc3R5bGVfbGF5ZXIuanMiLCJqcy9zdHlsZS9zdHlsZV90cmFuc2l0aW9uLmpzIiwianMvc3ltYm9sL2FuY2hvci5qcyIsImpzL3N5bWJvbC9iaW5fcGFjay5qcyIsImpzL3N5bWJvbC9jaGVja19tYXhfYW5nbGUuanMiLCJqcy9zeW1ib2wvY2xpcF9saW5lLmpzIiwianMvc3ltYm9sL2NvbGxpc2lvbl9ib3guanMiLCJqcy9zeW1ib2wvY29sbGlzaW9uX2ZlYXR1cmUuanMiLCJqcy9zeW1ib2wvY29sbGlzaW9uX3RpbGUuanMiLCJqcy9zeW1ib2wvZ2V0X2FuY2hvcnMuanMiLCJqcy9zeW1ib2wvZ2x5cGhfYXRsYXMuanMiLCJqcy9zeW1ib2wvZ2x5cGhfc291cmNlLmpzIiwianMvc3ltYm9sL21lcmdlbGluZXMuanMiLCJqcy9zeW1ib2wvcXVhZHMuanMiLCJqcy9zeW1ib2wvcmVzb2x2ZV9pY29ucy5qcyIsImpzL3N5bWJvbC9yZXNvbHZlX3RleHQuanMiLCJqcy9zeW1ib2wvc2hhcGluZy5qcyIsImpzL3N5bWJvbC9zcHJpdGVfYXRsYXMuanMiLCJqcy91aS9jYW1lcmEuanMiLCJqcy91aS9jb250cm9sL2F0dHJpYnV0aW9uLmpzIiwianMvdWkvY29udHJvbC9jb250cm9sLmpzIiwianMvdWkvY29udHJvbC9uYXZpZ2F0aW9uLmpzIiwianMvdWkvaGFuZGxlci9ib3hfem9vbS5qcyIsImpzL3VpL2hhbmRsZXIvZGJsY2xpY2tfem9vbS5qcyIsImpzL3VpL2hhbmRsZXIvZHJhZ19wYW4uanMiLCJqcy91aS9oYW5kbGVyL2RyYWdfcm90YXRlLmpzIiwianMvdWkvaGFuZGxlci9rZXlib2FyZC5qcyIsImpzL3VpL2hhbmRsZXIvcGluY2guanMiLCJqcy91aS9oYW5kbGVyL3Njcm9sbF96b29tLmpzIiwianMvdWkvaGFzaC5qcyIsImpzL3VpL2ludGVyYWN0aW9uLmpzIiwianMvdWkvbWFwLmpzIiwianMvdWkvcG9wdXAuanMiLCJqcy91dGlsL2FjdG9yLmpzIiwianMvdXRpbC9icm93c2VyL2FqYXguanMiLCJqcy91dGlsL2Jyb3dzZXIvYnJvd3Nlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9jYW52YXMuanMiLCJqcy91dGlsL2Jyb3dzZXIvZGlzcGF0Y2hlci5qcyIsImpzL3V0aWwvYnJvd3Nlci9kb20uanMiLCJqcy91dGlsL2NvbmZpZy5qcyIsImpzL3V0aWwvZXZlbnRlZC5qcyIsImpzL3V0aWwvZ2x5cGhzLmpzIiwianMvdXRpbC9pbnRlcnBvbGF0ZS5qcyIsImpzL3V0aWwvbWFwYm94LmpzIiwianMvdXRpbC9tcnVfY2FjaGUuanMiLCJqcy91dGlsL3Rva2VuLmpzIiwianMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2ZlYXR1cmUtZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXguanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L21hdDIuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0MmQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0My5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3F1YXQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvdmVjMi5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMzLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3ZlYzQuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3QuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3BhcnNlZC5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL3JlZmVyZW5jZS92Ny5qc29uIiwibm9kZV9tb2R1bGVzL3BiZi9idWZmZXIuanMiLCJub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BiZi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYnVzaC9yYnVzaC5qcyIsIm5vZGVfbW9kdWxlcy9yZXNvbHZlLXVybC9yZXNvbHZlLXVybC5qcyIsIm5vZGVfbW9kdWxlcy91bml0YmV6aWVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwibm9kZV9tb2R1bGVzL3dlYndvcmtpZnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDellBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ROQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ253Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6aUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2dCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDemhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwWUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2cUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdm1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIHNpbmdsZSBhcnJheWJ1ZmZlclxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlcjtcblxuZnVuY3Rpb24gQnVmZmVyKGJ1ZmZlcikge1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5kZWZhdWx0TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmRlZmF1bHRMZW5ndGg7XG4gICAgICAgIHRoaXMuc2V0dXBWaWV3cygpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2Ugb25seSByZWNyZWF0ZSBidWZmZXJzIGFmdGVyIHJlY2VpdmluZyB0aGVtIGZyb20gd29ya2VycyBmb3IgYmluZGluZyB0byBnbCxcbiAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRoZXNlIDIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLmFycmF5ID0gYnVmZmVyLmFycmF5O1xuICAgICAgICB0aGlzLnBvcyA9IGJ1ZmZlci5wb3M7XG4gICAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlID0ge1xuICAgIHBvczogMCxcbiAgICBpdGVtU2l6ZTogNCwgLy8gYnl0ZXMgaW4gb25lIGl0ZW1cbiAgICBkZWZhdWx0TGVuZ3RoOiA4MTkyLCAvLyBpbml0aWFsIGJ1ZmZlciBzaXplXG4gICAgYXJyYXlUeXBlOiAnQVJSQVlfQlVGRkVSJywgLy8gZ2wgYnVmZmVyIHR5cGVcblxuICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zIC8gdGhpcy5pdGVtU2l6ZTtcbiAgICB9LFxuXG4gICAgc2V0dXBWaWV3czogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHNldCB1cCB2aWV3cyBmb3IgZWFjaCB0eXBlIHRvIGFkZCBkYXRhIG9mIGRpZmZlcmVudCB0eXBlcyB0byB0aGUgc2FtZSBidWZmZXJcbiAgICAgICAgdGhpcy51Ynl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IG5ldyBJbnQ4QXJyYXkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMudXNob3J0cyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5zaG9ydHMgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLy8gYmluZHMgdGhlIGJ1ZmZlciB0byBhIHdlYmdsIGNvbnRleHRcbiAgICBiaW5kOiBmdW5jdGlvbihnbCkge1xuICAgICAgICB2YXIgdHlwZSA9IGdsW3RoaXMuYXJyYXlUeXBlXTtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIodHlwZSwgdGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YSh0eXBlLCB0aGlzLmFycmF5LnNsaWNlKDAsIHRoaXMucG9zKSwgZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgICAgICAvLyBkdW1wIGFycmF5IGJ1ZmZlciBvbmNlIGl0J3MgYm91bmQgdG8gZ2xcbiAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcih0eXBlLCB0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oZ2wpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZSBieSA1MCUgaWYgYSBuZXcgaXRlbSBkb2Vzbid0IGZpdFxuICAgIHJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMucG9zICsgdGhpcy5pdGVtU2l6ZSkge1xuXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGggPCB0aGlzLnBvcyArIHRoaXMuaXRlbVNpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgbGVuZ3RoIGJ5IDUwJSBidXQga2VlcCBpdCBldmVuXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLnJvdW5kKHRoaXMubGVuZ3RoICogMS41IC8gMikgKiAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhcnJheSBidWZmZXJzIGNhbid0IGJlIHJlc2l6ZWQsIHNvIHdlIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHJlc2V0IGFsbCBieXRlcyB0aGVyZVxuICAgICAgICAgICAgdGhpcy5hcnJheSA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHZhciB1Ynl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTtcbiAgICAgICAgICAgIHVieXRlcy5zZXQodGhpcy51Ynl0ZXMpO1xuXG4gICAgICAgICAgICB0aGlzLnNldHVwVmlld3MoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBMaW5lVmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9saW5lX3ZlcnRleF9idWZmZXInKTtcbnZhciBMaW5lRWxlbWVudEJ1ZmZlciA9IHJlcXVpcmUoJy4vbGluZV9lbGVtZW50X2J1ZmZlcicpO1xudmFyIEZpbGxWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL2ZpbGxfdmVydGV4X2J1ZmZlcicpO1xudmFyIEZpbGxFbGVtZW50QnVmZmVyID0gcmVxdWlyZSgnLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlcicpO1xudmFyIE91dGxpbmVFbGVtZW50QnVmZmVyID0gcmVxdWlyZSgnLi9vdXRsaW5lX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgR2x5cGhWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL2dseXBoX3ZlcnRleF9idWZmZXInKTtcbnZhciBHbHlwaEVsZW1lbnRCdWZmZXIgPSByZXF1aXJlKCcuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgSWNvblZlcnRleEJ1ZmZlciA9IHJlcXVpcmUoJy4vaWNvbl92ZXJ0ZXhfYnVmZmVyJyk7XG52YXIgSWNvbkVsZW1lbnRCdWZmZXIgPSByZXF1aXJlKCcuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyJyk7XG52YXIgQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyID0gcmVxdWlyZSgnLi9jb2xsaXNpb25fYm94X3ZlcnRleF9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihidWZmZXJzZXQpIHtcbiAgICBidWZmZXJzZXQgPSBidWZmZXJzZXQgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2x5cGhWZXJ0ZXg6IG5ldyBHbHlwaFZlcnRleEJ1ZmZlcihidWZmZXJzZXQuZ2x5cGhWZXJ0ZXgpLFxuICAgICAgICBnbHlwaEVsZW1lbnQ6IG5ldyBHbHlwaEVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmdseXBoRWxlbWVudCksXG4gICAgICAgIGljb25WZXJ0ZXg6IG5ldyBJY29uVmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5pY29uVmVydGV4KSxcbiAgICAgICAgaWNvbkVsZW1lbnQ6IG5ldyBJY29uRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQuaWNvbkVsZW1lbnQpLFxuICAgICAgICBmaWxsVmVydGV4OiBuZXcgRmlsbFZlcnRleEJ1ZmZlcihidWZmZXJzZXQuZmlsbFZlcnRleCksXG4gICAgICAgIGZpbGxFbGVtZW50OiBuZXcgRmlsbEVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmZpbGxFbGVtZW50KSxcbiAgICAgICAgb3V0bGluZUVsZW1lbnQ6IG5ldyBPdXRsaW5lRWxlbWVudEJ1ZmZlcihidWZmZXJzZXQub3V0bGluZUVsZW1lbnQpLFxuICAgICAgICBsaW5lVmVydGV4OiBuZXcgTGluZVZlcnRleEJ1ZmZlcihidWZmZXJzZXQubGluZVZlcnRleCksXG4gICAgICAgIGxpbmVFbGVtZW50OiBuZXcgTGluZUVsZW1lbnRCdWZmZXIoYnVmZmVyc2V0LmxpbmVFbGVtZW50KSxcbiAgICAgICAgY29sbGlzaW9uQm94VmVydGV4OiBuZXcgQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyKGJ1ZmZlcnNldC5jb2xsaXNpb25Cb3hWZXJ0ZXgpXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXI7XG5cbmZ1bmN0aW9uIENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5Db2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiAxMiwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ICsgMSAqIHNob3J0ICsgMiAqIGJ5dGUgPSA4IGJ5dGVzKVxuICAgIGRlZmF1bHRMZW5ndGg6IDMyNzY4LFxuXG4gICAgLy8gYWRkIGEgdmVydGV4IHRvIHRoaXMgYnVmZmVyO1xuICAgIC8vIHgsIHkgLSB2ZXJ0ZXggcG9zaXRpb25cbiAgICAvLyBleCwgZXkgLSBleHRydWRlIG5vcm1hbFxuICAgIGFkZDogZnVuY3Rpb24ocG9pbnQsIGV4dHJ1ZGUsIG1heFpvb20sIHBsYWNlbWVudFpvb20pIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgcG9zMiA9IHBvcyAvIDIsXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXg7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMF0gPSBwb2ludC54O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSBwb2ludC55O1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAyXSA9IE1hdGgucm91bmQoZXh0cnVkZS54KTtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDNdID0gTWF0aC5yb3VuZChleHRydWRlLnkpO1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA4XSA9IE1hdGguZmxvb3IobWF4Wm9vbSAqIDEwKTtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOV0gPSBNYXRoLmZsb29yKHBsYWNlbWVudFpvb20gKiAxMCk7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsbFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gRmlsbFZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5GaWxsVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBpdGVtU2l6ZTogNCwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ID09IDQgYnl0ZXMpXG5cbiAgICBhZGQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgdmFyIHBvczIgPSB0aGlzLnBvcyAvIDI7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMF0gPSB4O1xuICAgICAgICB0aGlzLnNob3J0c1twb3MyICsgMV0gPSB5O1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaFZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gR2x5cGhWZXJ0ZXhCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuXG5HbHlwaFZlcnRleEJ1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgZGVmYXVsdExlbmd0aDogMjA0OCAqIDE2LFxuICAgIGl0ZW1TaXplOiAxNixcblxuICAgIGFkZDogZnVuY3Rpb24oeCwgeSwgb3gsIG95LCB0eCwgdHksIG1pbnpvb20sIG1heHpvb20sIGxhYmVsbWluem9vbSkge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICBwb3MyID0gcG9zIC8gMjtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IHg7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAxXSA9IHk7XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAyXSA9IE1hdGgucm91bmQob3ggKiA2NCk7IC8vIHVzZSAxLzY0IHBpeGVscyBmb3IgcGxhY2VtZW50XG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAzXSA9IE1hdGgucm91bmQob3kgKiA2NCk7XG5cbiAgICAgICAgLy8gYV9kYXRhMVxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyA4XSAvKiB0ZXggKi8gPSBNYXRoLmZsb29yKHR4IC8gNCk7XG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDldIC8qIHRleCAqLyA9IE1hdGguZmxvb3IodHkgLyA0KTtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgMTBdIC8qIGxhYmVsbWluem9vbSAqLyA9IE1hdGguZmxvb3IoKGxhYmVsbWluem9vbSkgKiAxMCk7XG5cbiAgICAgICAgLy8gYV9kYXRhMlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMl0gLyogbWluem9vbSAqLyA9IE1hdGguZmxvb3IoKG1pbnpvb20pICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxM10gLyogbWF4em9vbSAqLyA9IE1hdGguZmxvb3IoTWF0aC5taW4obWF4em9vbSwgMjUpICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uKGdsLCBzaGFkZXIsIG9mZnNldCkge1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLCBnbCk7XG5cbiAgICAgICAgdmFyIHN0cmlkZSA9IHRoaXMuaXRlbVNpemU7XG5cbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyAwKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9vZmZzZXQsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA0KTtcblxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGExLCA0LCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA4KTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhMiwgMiwgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIHN0cmlkZSwgb2Zmc2V0ICsgMTIpO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gSWNvblZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gSWNvblZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5JY29uVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBkZWZhdWx0TGVuZ3RoOiAyMDQ4ICogMTYsXG4gICAgaXRlbVNpemU6IDE2LFxuXG4gICAgYWRkOiBmdW5jdGlvbih4LCB5LCBveCwgb3ksIHR4LCB0eSwgbWluem9vbSwgbWF4em9vbSwgbGFiZWxtaW56b29tKSB7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICAgIHBvczIgPSBwb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDBdID0geDtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDFdID0geTtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDJdID0gTWF0aC5yb3VuZChveCAqIDY0KTsgLy8gdXNlIDEvNjQgcGl4ZWxzIGZvciBwbGFjZW1lbnRcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDNdID0gTWF0aC5yb3VuZChveSAqIDY0KTtcblxuICAgICAgICAvLyBhX2RhdGExXG4gICAgICAgIHRoaXMudWJ5dGVzW3BvcyArIDhdIC8qIHRleCAqLyA9IHR4IC8gNDtcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgOV0gLyogdGV4ICovID0gdHkgLyA0O1xuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxMF0gLyogbGFiZWxtaW56b29tICovID0gTWF0aC5mbG9vcigobGFiZWxtaW56b29tIHx8IDApICogMTApO1xuXG4gICAgICAgIC8vIGFfZGF0YTJcbiAgICAgICAgdGhpcy51Ynl0ZXNbcG9zICsgMTJdIC8qIG1pbnpvb20gKi8gPSBNYXRoLmZsb29yKChtaW56b29tIHx8IDApICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuICAgICAgICB0aGlzLnVieXRlc1twb3MgKyAxM10gLyogbWF4em9vbSAqLyA9IE1hdGguZmxvb3IoTWF0aC5taW4obWF4em9vbSB8fCAyNSwgMjUpICogMTApOyAvLyAxLzEwIHpvb20gbGV2ZWxzOiB6MTYgPT0gMTYwLlxuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uKGdsLCBzaGFkZXIsIG9mZnNldCkge1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLCBnbCk7XG5cbiAgICAgICAgdmFyIHN0cmlkZSA9IHRoaXMuaXRlbVNpemU7XG5cbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyAwKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9vZmZzZXQsIDIsIGdsLlNIT1JULCBmYWxzZSwgc3RyaWRlLCBvZmZzZXQgKyA0KTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhMSwgNCwgZ2wuVU5TSUdORURfQllURSwgZmFsc2UsIHN0cmlkZSwgb2Zmc2V0ICsgOCk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfZGF0YTIsIDIsIGdsLlVOU0lHTkVEX0JZVEUsIGZhbHNlLCBzdHJpZGUsIG9mZnNldCArIDEyKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVFbGVtZW50QnVmZmVyO1xuXG5mdW5jdGlvbiBMaW5lRWxlbWVudEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5MaW5lRWxlbWVudEJ1ZmZlci5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoQnVmZmVyLCB7XG4gICAgaXRlbVNpemU6IDYsIC8vIGJ5dGVzIHBlciB0cmlhbmdsZSAoMyAqIHVuc2lnbmVkIHNob3J0ID09IDYgYnl0ZXMpXG4gICAgYXJyYXlUeXBlOiAnRUxFTUVOVF9BUlJBWV9CVUZGRVInLFxuXG4gICAgYWRkOiBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICAgIHZhciBwb3MyID0gdGhpcy5wb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAwXSA9IGE7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMV0gPSBiO1xuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDJdID0gYztcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGluZVZlcnRleEJ1ZmZlcjtcblxuZnVuY3Rpb24gTGluZVZlcnRleEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG4vLyBzY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBzbyB0aGF0IHRoZSBub3JtYWwgbGVuZ3RoIGlzIHRoaXMgdmFsdWUuXG4vLyBjb250YWlucyB0aGUgXCJ0ZXh0dXJlXCIgbm9ybWFscyAoLTEuLjEpLiB0aGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGV4dHJ1ZGVcbi8vIG5vcm1hbHMgZm9yIGxpbmUgam9pbnMsIGJlY2F1c2UgdGhlIHgtdmFsdWUgcmVtYWlucyAwIGZvciB0aGUgdGV4dHVyZVxuLy8gbm9ybWFsIGFycmF5LCB3aGlsZSB0aGUgZXh0cnVkZSBub3JtYWwgYWN0dWFsbHkgbW92ZXMgdGhlIHZlcnRleCB0byBjcmVhdGVcbi8vIHRoZSBhY3V0ZS9iZXZlbGxlZCBsaW5lIGpvaW4uXG5MaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZSA9IDYzO1xuXG5MaW5lVmVydGV4QnVmZmVyLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChCdWZmZXIsIHtcbiAgICBpdGVtU2l6ZTogOCwgLy8gYnl0ZXMgcGVyIHZlcnRleCAoMiAqIHNob3J0ICsgMSAqIHNob3J0ICsgMiAqIGJ5dGUgPSA4IGJ5dGVzKVxuICAgIGRlZmF1bHRMZW5ndGg6IDMyNzY4LFxuXG4gICAgLy8gYWRkIGEgdmVydGV4IHRvIHRoaXMgYnVmZmVyO1xuICAgIC8vIHgsIHkgLSB2ZXJ0ZXggcG9zaXRpb25cbiAgICAvLyBleCwgZXkgLSBleHRydWRlIG5vcm1hbFxuICAgIC8vIHR4LCB0eSAtIHRleHR1cmUgbm9ybWFsXG4gICAgYWRkOiBmdW5jdGlvbihwb2ludCwgZXh0cnVkZSwgdHgsIHR5LCBsaW5lc29mYXIpIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgcG9zMiA9IHBvcyAvIDIsXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXgsXG4gICAgICAgICAgICBleHRydWRlU2NhbGUgPSBMaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2hvcnRzW3BvczIgKyAwXSA9IChNYXRoLmZsb29yKHBvaW50LngpICogMikgfCB0eDtcbiAgICAgICAgdGhpcy5zaG9ydHNbcG9zMiArIDFdID0gKE1hdGguZmxvb3IocG9pbnQueSkgKiAyKSB8IHR5O1xuXG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNF0gPSBNYXRoLnJvdW5kKGV4dHJ1ZGVTY2FsZSAqIGV4dHJ1ZGUueCk7XG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNV0gPSBNYXRoLnJvdW5kKGV4dHJ1ZGVTY2FsZSAqIGV4dHJ1ZGUueSk7XG4gICAgICAgIHRoaXMuYnl0ZXNbcG9zICsgNl0gPSAobGluZXNvZmFyIHx8IDApIC8gMTI4O1xuICAgICAgICB0aGlzLmJ5dGVzW3BvcyArIDddID0gKGxpbmVzb2ZhciB8fCAwKSAlIDEyODtcblxuICAgICAgICB0aGlzLnBvcyArPSB0aGlzLml0ZW1TaXplO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPdXRsaW5lRWxlbWVudEJ1ZmZlcjtcblxuZnVuY3Rpb24gT3V0bGluZUVsZW1lbnRCdWZmZXIoYnVmZmVyKSB7XG4gICAgQnVmZmVyLmNhbGwodGhpcywgYnVmZmVyKTtcbn1cblxuT3V0bGluZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA0LCAvLyBieXRlcyBwZXIgbGluZSAoMiAqIHVuc2lnbmVkIHNob3J0ID09IDQgYnl0ZXMpXG4gICAgYXJyYXlUeXBlOiAnRUxFTUVOVF9BUlJBWV9CVUZGRVInLFxuXG4gICAgYWRkOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHZhciBwb3MyID0gdGhpcy5wb3MgLyAyO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAwXSA9IGE7XG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMV0gPSBiO1xuXG4gICAgICAgIHRoaXMucG9zICs9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmlhbmdsZUVsZW1lbnRCdWZmZXI7XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlRWxlbWVudEJ1ZmZlcihidWZmZXIpIHtcbiAgICBCdWZmZXIuY2FsbCh0aGlzLCBidWZmZXIpO1xufVxuXG5UcmlhbmdsZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEJ1ZmZlciwge1xuICAgIGl0ZW1TaXplOiA2LCAvLyBieXRlcyBwZXIgdHJpYW5nbGUgKDMgKiB1bnNpZ25lZCBzaG9ydCA9PSA2IGJ5dGVzKVxuICAgIGFycmF5VHlwZTogJ0VMRU1FTlRfQVJSQVlfQlVGRkVSJyxcblxuICAgIGFkZDogZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICB2YXIgcG9zMiA9IHRoaXMucG9zIC8gMjtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHRoaXMudXNob3J0c1twb3MyICsgMF0gPSBhO1xuICAgICAgICB0aGlzLnVzaG9ydHNbcG9zMiArIDFdID0gYjtcbiAgICAgICAgdGhpcy51c2hvcnRzW3BvczIgKyAyXSA9IGM7XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gdGhpcy5pdGVtU2l6ZTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCdWNrZXQ7XG5cbnZhciBMaW5lQnVja2V0ID0gcmVxdWlyZSgnLi9saW5lX2J1Y2tldCcpO1xudmFyIEZpbGxCdWNrZXQgPSByZXF1aXJlKCcuL2ZpbGxfYnVja2V0Jyk7XG52YXIgU3ltYm9sQnVja2V0ID0gcmVxdWlyZSgnLi9zeW1ib2xfYnVja2V0Jyk7XG52YXIgTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzJyk7XG52YXIgZmVhdHVyZUZpbHRlciA9IHJlcXVpcmUoJ2ZlYXR1cmUtZmlsdGVyJyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvblNldCA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldCcpO1xuXG5mdW5jdGlvbiBjcmVhdGVCdWNrZXQobGF5ZXIsIGJ1ZmZlcnMsIHosIG92ZXJzY2FsaW5nLCBjb2xsaXNpb25EZWJ1Zykge1xuICAgIHZhciB2YWx1ZXMgPSBuZXcgU3R5bGVEZWNsYXJhdGlvblNldCgnbGF5b3V0JywgbGF5ZXIudHlwZSwgbGF5ZXIubGF5b3V0LCB7fSkudmFsdWVzKCksXG4gICAgICAgIGZha2Vab29tSGlzdG9yeSA9IHsgbGFzdEludGVnZXJab29tOiBJbmZpbml0eSwgbGFzdEludGVnZXJab29tVGltZTogMCwgbGFzdFpvb206IDAgfSxcbiAgICAgICAgbGF5b3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrIGluIHZhbHVlcykge1xuICAgICAgICBsYXlvdXRba10gPSB2YWx1ZXNba10uY2FsY3VsYXRlKHosIGZha2Vab29tSGlzdG9yeSk7XG4gICAgfVxuXG4gICAgdmFyIEJ1Y2tldENsYXNzID1cbiAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2xpbmUnID8gTGluZUJ1Y2tldCA6XG4gICAgICAgIGxheWVyLnR5cGUgPT09ICdmaWxsJyA/IEZpbGxCdWNrZXQgOlxuICAgICAgICBsYXllci50eXBlID09PSAnc3ltYm9sJyA/IFN5bWJvbEJ1Y2tldCA6IG51bGw7XG5cbiAgICB2YXIgYnVja2V0ID0gbmV3IEJ1Y2tldENsYXNzKGJ1ZmZlcnMsIG5ldyBMYXlvdXRQcm9wZXJ0aWVzW2xheWVyLnR5cGVdKGxheW91dCksIG92ZXJzY2FsaW5nLCB6LCBjb2xsaXNpb25EZWJ1Zyk7XG5cbiAgICBidWNrZXQuaWQgPSBsYXllci5pZDtcbiAgICBidWNrZXQudHlwZSA9IGxheWVyLnR5cGU7XG4gICAgYnVja2V0Wydzb3VyY2UtbGF5ZXInXSA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICBidWNrZXQuaW50ZXJhY3RpdmUgPSBsYXllci5pbnRlcmFjdGl2ZTtcbiAgICBidWNrZXQubWluWm9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgYnVja2V0Lm1heFpvb20gPSBsYXllci5tYXh6b29tO1xuICAgIGJ1Y2tldC5maWx0ZXIgPSBmZWF0dXJlRmlsdGVyKGxheWVyLmZpbHRlcik7XG4gICAgYnVja2V0LmZlYXR1cmVzID0gW107XG5cbiAgICByZXR1cm4gYnVja2V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnRHcm91cHM7XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cHModmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyLCBzZWNvbmRFbGVtZW50QnVmZmVyKSB7XG5cbiAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjtcbiAgICB0aGlzLmVsZW1lbnRCdWZmZXIgPSBlbGVtZW50QnVmZmVyO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudEJ1ZmZlciA9IHNlY29uZEVsZW1lbnRCdWZmZXI7XG4gICAgdGhpcy5ncm91cHMgPSBbXTtcbn1cblxuRWxlbWVudEdyb3Vwcy5wcm90b3R5cGUubWFrZVJvb21Gb3IgPSBmdW5jdGlvbihudW1WZXJ0aWNlcykge1xuICAgIGlmICghdGhpcy5jdXJyZW50IHx8IHRoaXMuY3VycmVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IDY1NTM1KSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50QnVmZmVyICYmIHRoaXMuZWxlbWVudEJ1ZmZlci5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIgJiYgdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyLmluZGV4KTtcbiAgICAgICAgdGhpcy5ncm91cHMucHVzaCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIEVsZW1lbnRHcm91cCh2ZXJ0ZXhTdGFydEluZGV4LCBlbGVtZW50U3RhcnRJbmRleCwgc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgpIHtcbiAgICAvLyB0aGUgb2Zmc2V0IGludG8gdGhlIHZlcnRleCBidWZmZXIgb2YgdGhlIGZpcnN0IHZlcnRleCBpbiB0aGlzIGdyb3VwXG4gICAgdGhpcy52ZXJ0ZXhTdGFydEluZGV4ID0gdmVydGV4U3RhcnRJbmRleDtcbiAgICB0aGlzLmVsZW1lbnRTdGFydEluZGV4ID0gZWxlbWVudFN0YXJ0SW5kZXg7XG4gICAgdGhpcy5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCA9IHNlY29uZEVsZW1lbnRTdGFydEluZGV4O1xuICAgIHRoaXMuZWxlbWVudExlbmd0aCA9IDA7XG4gICAgdGhpcy52ZXJ0ZXhMZW5ndGggPSAwO1xuICAgIHRoaXMuc2Vjb25kRWxlbWVudExlbmd0aCA9IDA7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByYnVzaCA9IHJlcXVpcmUoJ3JidXNoJyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xudmFyIHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmVhdHVyZVRyZWU7XG5cbmZ1bmN0aW9uIEZlYXR1cmVUcmVlKGNvb3JkLCBvdmVyc2NhbGluZykge1xuICAgIHRoaXMueCA9IGNvb3JkLng7XG4gICAgdGhpcy55ID0gY29vcmQueTtcbiAgICB0aGlzLnogPSBjb29yZC56IC0gTWF0aC5sb2cob3ZlcnNjYWxpbmcpIC8gTWF0aC5MTjI7XG4gICAgdGhpcy5ydHJlZSA9IHJidXNoKDkpO1xuICAgIHRoaXMudG9CZUluc2VydGVkID0gW107XG59XG5cbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihiYm94LCBsYXllcnMsIGZlYXR1cmUpIHtcbiAgICBiYm94LmxheWVycyA9IGxheWVycztcbiAgICBiYm94LmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgIHRoaXMudG9CZUluc2VydGVkLnB1c2goYmJveCk7XG59O1xuXG4vLyBidWxrIGluc2VydCBpbnRvIHRyZWVcbkZlYXR1cmVUcmVlLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucnRyZWUubG9hZCh0aGlzLnRvQmVJbnNlcnRlZCk7XG4gICAgdGhpcy50b0JlSW5zZXJ0ZWQgPSBbXTtcbn07XG5cbi8vIEZpbmRzIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG5GZWF0dXJlVHJlZS5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbihhcmdzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnRvQmVJbnNlcnRlZC5sZW5ndGgpIHRoaXMuX2xvYWQoKTtcblxuICAgIHZhciBwYXJhbXMgPSBhcmdzLnBhcmFtcyB8fCB7fSxcbiAgICAgICAgcmFkaXVzID0gKHBhcmFtcy5yYWRpdXMgfHwgMCkgKiA0MDk2IC8gYXJncy5zY2FsZSxcbiAgICAgICAgeCA9IGFyZ3MueCxcbiAgICAgICAgeSA9IGFyZ3MueSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB2YXIgbWF0Y2hpbmcgPSB0aGlzLnJ0cmVlLnNlYXJjaChbIHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMgXSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IG1hdGNoaW5nW2ldLmZlYXR1cmUsXG4gICAgICAgICAgICBsYXllcnMgPSBtYXRjaGluZ1tpXS5sYXllcnMsXG4gICAgICAgICAgICB0eXBlID0gdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXTtcblxuICAgICAgICBpZiAocGFyYW1zLiR0eXBlICYmIHR5cGUgIT09IHBhcmFtcy4kdHlwZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWdlb21ldHJ5Q29udGFpbnNQb2ludChmZWF0dXJlLmxvYWRHZW9tZXRyeSgpLCB0eXBlLCBuZXcgUG9pbnQoeCwgeSksIHJhZGl1cykpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgZ2VvSlNPTiA9IGZlYXR1cmUudG9HZW9KU09OKHRoaXMueCwgdGhpcy55LCB0aGlzLnopO1xuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxheWVycy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2xdO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVyICYmIGxheWVyICE9PSBwYXJhbXMubGF5ZXIuaWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHV0aWwuZXh0ZW5kKHtsYXllcjogbGF5ZXJ9LCBnZW9KU09OKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufTtcblxuZnVuY3Rpb24gZ2VvbWV0cnlDb250YWluc1BvaW50KHJpbmdzLCB0eXBlLCBwLCByYWRpdXMpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ1BvaW50JyA/IHBvaW50Q29udGFpbnNQb2ludChyaW5ncywgcCwgcmFkaXVzKSA6XG4gICAgICAgICAgIHR5cGUgPT09ICdMaW5lU3RyaW5nJyA/IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDpcbiAgICAgICAgICAgdHlwZSA9PT0gJ1BvbHlnb24nID8gcG9seUNvbnRhaW5zUG9pbnQocmluZ3MsIHApIHx8IGxpbmVDb250YWluc1BvaW50KHJpbmdzLCBwLCByYWRpdXMpIDogZmFsc2U7XG59XG5cbi8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTAxNzI1LzMzMTM3OS5cbmZ1bmN0aW9uIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIHtcbiAgICB2YXIgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIHZhciB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuZnVuY3Rpb24gbGluZUNvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRyZWF0IHRoZSBsaW5lIGFzIFwiY29udGFpbmluZyBwb2ludCBwXCIuXG4gICAgICAgICAgICB2YXIgdiA9IHJpbmdbaiAtIDFdLCB3ID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmIChkaXN0VG9TZWdtZW50U3F1YXJlZChwLCB2LCB3KSA8IHIpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHJpbmdzLCBwKSB7XG4gICAgdmFyIGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2ludENvbnRhaW5zUG9pbnQocmluZ3MsIHAsIHJhZGl1cykge1xuICAgIHZhciByID0gcmFkaXVzICogcmFkaXVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChyaW5nW2pdLmRpc3RTcXIocCkgPD0gcikgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsQnVja2V0O1xuXG5mdW5jdGlvbiBGaWxsQnVja2V0KGJ1ZmZlcnMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuZmlsbFZlcnRleCwgYnVmZmVycy5maWxsRWxlbWVudCwgYnVmZmVycy5vdXRsaW5lRWxlbWVudCk7XG59XG5cbkZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLmxvYWRHZW9tZXRyeSgpKTtcbiAgICB9XG59O1xuXG5GaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24obGluZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsbChsaW5lc1tpXSk7XG4gICAgfVxufTtcblxuRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmlsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgaWYgKHZlcnRpY2VzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgLy9jb25zb2xlLndhcm4oJ2EgZmlsbCBtdXN0IGhhdmUgYXQgbGVhc3QgdGhyZWUgdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzIHdlJ3JlIGdvaW5nIHRvIHByb2R1Y2Ugc28gdGhhdCB3ZVxuICAgIC8vIGNhbiByZXNpemUgdGhlIGJ1ZmZlciBiZWZvcmVoYW5kLCBvciBkZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBsaW5lXG4gICAgLy8gd29uJ3QgZml0IGludG8gdGhlIGJ1ZmZlciBhbnltb3JlLlxuICAgIC8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZSB2ZXJ0ZXggYnVmZmVyIGZvciBkcmF3aW5nIHRoZSBhbnRpYWxpYXNlZFxuICAgIC8vIG91dGxpbmVzLCB3ZSBzZXBhcmF0ZSBhbGwgcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgZGVnZW5lcmF0ZSAob3V0LW9mLVxuICAgIC8vIHZpZXdwbGFuZSkgdmVydGV4LlxuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBnZW9tZXRyeSBidWZmZXIgY2FuIGhvbGQgYWxsIHRoZSByZXF1aXJlZCB2ZXJ0aWNlcy5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMubWFrZVJvb21Gb3IobGVuICsgMSk7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuXG4gICAgdmFyIGZpbGxWZXJ0ZXggPSB0aGlzLmJ1ZmZlcnMuZmlsbFZlcnRleDtcbiAgICB2YXIgZmlsbEVsZW1lbnQgPSB0aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQ7XG4gICAgdmFyIG91dGxpbmVFbGVtZW50ID0gdGhpcy5idWZmZXJzLm91dGxpbmVFbGVtZW50O1xuXG4gICAgLy8gV2UncmUgZ2VuZXJhdGluZyB0cmlhbmdsZSBmYW5zLCBzbyB3ZSBhbHdheXMgc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29vcmRpbmF0ZSBpbiB0aGlzIHBvbHlnb24uXG4gICAgdmFyIGZpcnN0SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXgsXG4gICAgICAgIHByZXZJbmRleCwgY3VycmVudEluZGV4LCBjdXJyZW50VmVydGV4O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBmaWxsVmVydGV4LmluZGV4IC0gZWxlbWVudEdyb3VwLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICBmaWxsVmVydGV4LmFkZChjdXJyZW50VmVydGV4LngsIGN1cnJlbnRWZXJ0ZXgueSk7XG4gICAgICAgIGVsZW1lbnRHcm91cC52ZXJ0ZXhMZW5ndGgrKztcblxuICAgICAgICAvLyBPbmx5IGFkZCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpc3RpbmN0IHZlcnRpY2VzLlxuICAgICAgICBpZiAoaSA+PSAyICYmIChjdXJyZW50VmVydGV4LnggIT09IHZlcnRpY2VzWzBdLnggfHwgY3VycmVudFZlcnRleC55ICE9PSB2ZXJ0aWNlc1swXS55KSkge1xuICAgICAgICAgICAgZmlsbEVsZW1lbnQuYWRkKGZpcnN0SW5kZXgsIHByZXZJbmRleCwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+PSAxKSB7XG4gICAgICAgICAgICBvdXRsaW5lRWxlbWVudC5hZGQocHJldkluZGV4LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwLnNlY29uZEVsZW1lbnRMZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQnVja2V0O1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lQnVja2V0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBMaW5lQnVja2V0KGJ1ZmZlcnMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMubGluZVZlcnRleCwgYnVmZmVycy5saW5lRWxlbWVudCk7XG4gICAgdGhpcy5sYXlvdXRQcm9wZXJ0aWVzID0gbGF5b3V0UHJvcGVydGllcztcbn1cblxuTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmZlYXR1cmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUubG9hZEdlb21ldHJ5KCkpO1xuICAgIH1cbn07XG5cbkxpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbihsaW5lcykge1xuICAgIHZhciBsYXlvdXRQcm9wZXJ0aWVzID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGRMaW5lKGxpbmVzW2ldLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1qb2luJ10sXG4gICAgICAgICAgICBsYXlvdXRQcm9wZXJ0aWVzWydsaW5lLWNhcCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1taXRlci1saW1pdCddLFxuICAgICAgICAgICAgbGF5b3V0UHJvcGVydGllc1snbGluZS1yb3VuZC1saW1pdCddKTtcbiAgICB9XG59O1xuXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24odmVydGljZXMsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCkge1xuXG4gICAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmQsIGFkanVzdCBsZW5ndGggdG8gcmVtb3ZlIHRoZW0uXG4gICAgd2hpbGUgKGxlbiA+IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICBsZW4tLTtcbiAgICB9XG5cbiAgICBpZiAodmVydGljZXMubGVuZ3RoIDwgMikge1xuICAgICAgICAvL2NvbnNvbGUud2FybignYSBsaW5lIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gdmVydGljZXMnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChqb2luID09PSAnYmV2ZWwnKSBtaXRlckxpbWl0ID0gMS4wNTtcblxuICAgIHZhciBmaXJzdFZlcnRleCA9IHZlcnRpY2VzWzBdLFxuICAgICAgICBsYXN0VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMV0sXG4gICAgICAgIGNsb3NlZCA9IGZpcnN0VmVydGV4LmVxdWFscyhsYXN0VmVydGV4KTtcblxuICAgIC8vIHdlIGNvdWxkIGJlIG1vcmUgcHJlY2lzZSwgYnV0IGl0IHdvdWxkIG9ubHkgc2F2ZSBhIG5lZ2xpZ2libGUgYW1vdW50IG9mIHNwYWNlXG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKGxlbiAqIDEwKTtcblxuICAgIGlmIChsZW4gPT09IDIgJiYgY2xvc2VkKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignYSBsaW5lIG1heSBub3QgaGF2ZSBjb2luY2lkZW50IHBvaW50cycpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGJlZ2luQ2FwID0gY2FwLFxuICAgICAgICBlbmRDYXAgPSBjbG9zZWQgPyAnYnV0dCcgOiBjYXAsXG4gICAgICAgIGZsaXAgPSAxLFxuICAgICAgICBkaXN0YW5jZSA9IDAsXG4gICAgICAgIHN0YXJ0T2ZMaW5lID0gdHJ1ZSxcbiAgICAgICAgY3VycmVudFZlcnRleCwgcHJldlZlcnRleCwgbmV4dFZlcnRleCwgcHJldk5vcm1hbCwgbmV4dE5vcm1hbCwgb2Zmc2V0QSwgb2Zmc2V0QjtcblxuICAgIC8vIHRoZSBsYXN0IHRocmVlIHZlcnRpY2VzIGFkZGVkXG4gICAgdGhpcy5lMSA9IHRoaXMuZTIgPSB0aGlzLmUzID0gLTE7XG5cbiAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tsZW4gLSAyXTtcbiAgICAgICAgbmV4dE5vcm1hbCA9IGZpcnN0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgIG5leHRWZXJ0ZXggPSBjbG9zZWQgJiYgaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICB2ZXJ0aWNlc1sxXSA6IC8vIGlmIHRoZSBsaW5lIGlzIGNsb3NlZCwgd2UgdHJlYXQgdGhlIGxhc3QgdmVydGV4IGxpa2UgdGhlIGZpcnN0XG4gICAgICAgICAgICB2ZXJ0aWNlc1tpICsgMV07IC8vIGp1c3QgdGhlIG5leHQgdmVydGV4XG5cbiAgICAgICAgLy8gaWYgdHdvIGNvbnNlY3V0aXZlIHZlcnRpY2VzIGV4aXN0LCBza2lwIHRoZSBjdXJyZW50IG9uZVxuICAgICAgICBpZiAobmV4dFZlcnRleCAmJiB2ZXJ0aWNlc1tpXS5lcXVhbHMobmV4dFZlcnRleCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChuZXh0Tm9ybWFsKSBwcmV2Tm9ybWFsID0gbmV4dE5vcm1hbDtcbiAgICAgICAgaWYgKGN1cnJlbnRWZXJ0ZXgpIHByZXZWZXJ0ZXggPSBjdXJyZW50VmVydGV4O1xuXG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBhbG9uZyB0aGUgbGluZSB0aGUgY3VycmVudFZlcnRleCBpc1xuICAgICAgICBpZiAocHJldlZlcnRleCkgZGlzdGFuY2UgKz0gY3VycmVudFZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbm9ybWFsIHRvd2FyZHMgdGhlIG5leHQgdmVydGV4IGluIHRoaXMgbGluZS4gSW4gY2FzZVxuICAgICAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHZlcnRleCwgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGlzIGNvbnRpbnVpbmcgc3RyYWlnaHQsXG4gICAgICAgIC8vIG1lYW5pbmcgdGhhdCB3ZSBhcmUganVzdCB1c2luZyB0aGUgcHJldmlvdXMgbm9ybWFsLlxuICAgICAgICBuZXh0Tm9ybWFsID0gbmV4dFZlcnRleCA/IG5leHRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKSA6IHByZXZOb3JtYWw7XG5cbiAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIG5vcm1hbCwgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGFcbiAgICAgICAgLy8gbm9uLWNsb3NlZCBsaW5lLCBzbyB3ZSdyZSBkb2luZyBhIHN0cmFpZ2h0IFwiam9pblwiLlxuICAgICAgICBwcmV2Tm9ybWFsID0gcHJldk5vcm1hbCB8fCBuZXh0Tm9ybWFsO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsIG9mIHRoZSBqb2luIGV4dHJ1c2lvbi4gSXQgaXMgdGhlIGFuZ2xlIGJpc2VjdG9yXG4gICAgICAgIC8vIG9mIHRoZSBzZWdtZW50cyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLlxuICAgICAgICB2YXIgam9pbk5vcm1hbCA9IHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLl91bml0KCk7XG5cbiAgICAgICAgLyogIGpvaW5Ob3JtYWwgICAgIHByZXZOb3JtYWxcbiAgICAgICAgICogICAgICAgICAgICAg4oaWICAgICAg4oaRXG4gICAgICAgICAqICAgICAgICAgICAgICAgIC5fX19fX19fXy4gcHJldlZlcnRleFxuICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqIG5leHROb3JtYWwgIOKGkCAgfCAgY3VycmVudFZlcnRleFxuICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqICAgICBuZXh0VmVydGV4ICFcbiAgICAgICAgICpcbiAgICAgICAgICovXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1pdGVyICh0aGUgcmF0aW8gb2YgdGhlIG1pdGVyIHRvIHRoZSB3aWR0aCkuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNvc2luZSBvZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgbmV4dCBhbmQgam9pbiBub3JtYWxzXG4gICAgICAgIC8vIHVzaW5nIGRvdCBwcm9kdWN0LiBUaGUgaW52ZXJzZSBvZiB0aGF0IGlzIHRoZSBtaXRlciBsZW5ndGguXG4gICAgICAgIHZhciBjb3NIYWxmQW5nbGUgPSBqb2luTm9ybWFsLnggKiBuZXh0Tm9ybWFsLnggKyBqb2luTm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnk7XG4gICAgICAgIHZhciBtaXRlckxlbmd0aCA9IDEgLyBjb3NIYWxmQW5nbGU7XG5cbiAgICAgICAgLy8gVGhlIGpvaW4gaWYgYSBtaWRkbGUgdmVydGV4LCBvdGhlcndpc2UgdGhlIGNhcC5cbiAgICAgICAgdmFyIG1pZGRsZVZlcnRleCA9IHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgdmFyIGN1cnJlbnRKb2luID0gbWlkZGxlVmVydGV4ID8gam9pbiA6IG5leHRWZXJ0ZXggPyBiZWdpbkNhcCA6IGVuZENhcDtcblxuICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCByb3VuZExpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnbWl0ZXInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnZmFrZXJvdW5kJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJyAmJiBtaXRlckxlbmd0aCA+IG1pdGVyTGltaXQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2JldmVsJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2JldmVsJykge1xuICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gZXh0cnVkZSBsZW5ndGggaXMgMTI4IC8gNjMgPSAyIHRpbWVzIHRoZSB3aWR0aCBvZiB0aGUgbGluZVxuICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCB3aGVyZS5cbiAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBtaXRlckxlbmd0aCBpcyByZWFsbHkgc21hbGwgYW5kIHRoZSBsaW5lIGJldmVsIHdvdWxkbid0IGJlIHZpc2libGUsXG4gICAgICAgICAgICAvLyBqdXN0IGRyYXcgYSBtaXRlciBqb2luIHRvIHNhdmUgYSB0cmlhbmdsZS5cbiAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJykge1xuICAgICAgICAgICAgam9pbk5vcm1hbC5fbXVsdChtaXRlckxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIDAsIDAsIGZhbHNlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnZmxpcGJldmVsJykge1xuICAgICAgICAgICAgLy8gbWl0ZXIgaXMgdG9vIGJpZywgZmxpcCB0aGUgZGlyZWN0aW9uIHRvIG1ha2UgYSBiZXZlbGVkIGpvaW5cblxuICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IHBhcmFsbGVsIGxpbmVzXG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbCA9IG5leHROb3JtYWwuY2xvbmUoKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54ID4gMCA/IC0xIDogMTtcbiAgICAgICAgICAgICAgICB2YXIgYmV2ZWxMZW5ndGggPSBtaXRlckxlbmd0aCAqIHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLm1hZygpIC8gcHJldk5vcm1hbC5zdWIobmV4dE5vcm1hbCkubWFnKCk7XG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fcGVycCgpLl9tdWx0KGJldmVsTGVuZ3RoICogZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgam9pbk5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgZmxpcCA9IC1mbGlwO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcgfHwgY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICB2YXIgbGluZVR1cm5zTGVmdCA9IGZsaXAgKiAocHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54KSA+IDA7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gLU1hdGguc3FydChtaXRlckxlbmd0aCAqIG1pdGVyTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICAgICAgICAgIG9mZnNldEIgPSAwO1xuICAgICAgICAgICAgICAgIG9mZnNldEEgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldEEgPSAwO1xuICAgICAgICAgICAgICAgIG9mZnNldEIgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIGJldmVsXG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2Zha2Vyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgam9pbiBhbmdsZSBpcyBzaGFycCBlbm91Z2ggdGhhdCBhIHJvdW5kIGpvaW4gd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSByb3VuZCBqb2luIGJ5IGFkZGluZyBtdWx0aXBsZSBwaWUgc2xpY2VzLiBUaGUgam9pbiBpc24ndCBhY3R1YWxseSByb3VuZCwgYnV0XG4gICAgICAgICAgICAgICAgLy8gaXQgbG9va3MgbGlrZSBpdCBpcyBhdCB0aGUgc2l6ZXMgd2UgcmVuZGVyIGxpbmVzIGF0LlxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIG1vcmUgdHJpYW5nbGVzIGZvciBzaGFycGVyIGFuZ2xlcy5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1hdGggaXMganVzdCBhIGdvb2QgZW5vdWdoIGFwcHJveGltYXRpb24uIEl0IGlzbid0IFwiY29ycmVjdFwiLlxuICAgICAgICAgICAgICAgIHZhciBuID0gTWF0aC5mbG9vcigoMC41IC0gKGNvc0hhbGZBbmdsZSAtIDAuNSkpICogOCk7XG4gICAgICAgICAgICAgICAgdmFyIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBuOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLm11bHQoKG0gKyAxKSAvIChuICsgMSkpLl9hZGQocHJldk5vcm1hbCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQaWVTbGljZVZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQpO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IG4gLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgICAgICAgICBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCA9IHByZXZOb3JtYWwubXVsdCgoayArIDEpIC8gKG4gKyAxKSkuX2FkZChuZXh0Tm9ybWFsKS5fdW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCwgbGluZVR1cm5zTGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtb2Zmc2V0QSwgLW9mZnNldEIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYnV0dCcpIHtcbiAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnc3F1YXJlJykge1xuXG4gICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgc3F1YXJlIGNhcFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgaXMgZG9uZS4gVW5zZXQgdmVydGljZXMgdG8gZGlzY29ubmVjdCBzZWdtZW50cy5cbiAgICAgICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuICAgICAgICAgICAgICAgIGZsaXAgPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtMSwgLTEsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG5cbiAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYnV0dFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMCwgMCwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBvciBsaW5lam9pbiBhdCBlbmQgb2Ygc2VnbWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBmbGlwLCBkaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgc2VnbWVudCBpcyBkb25lLiBVbnNldCB2ZXJ0aWNlcyB0byBkaXNjb25uZWN0IHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyID0gLTE7XG4gICAgICAgICAgICAgICAgZmxpcCA9IDE7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgYmVmb3JlIGZpcnN0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIC0xLCAtMSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZMaW5lID0gZmFsc2U7XG4gICAgfVxuXG5cbn07XG5cbi8qKlxuICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFZlcnRleCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmbGlwIC0xIGlmIHRoZSB2ZXJ0aWNlcyBzaG91bGQgYmUgZmxpcHBlZCwgMSBvdGhlcndpc2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnZ2luaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRMZWZ0IGV4dHJ1ZGUgdG8gc2hpZnQgdGhlIGxlZnQgdmVydGV4IGFsb25nIHRoZSBsaW5lXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kUmlnaHQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRDdXJyZW50VmVydGV4ID0gZnVuY3Rpb24oY3VycmVudFZlcnRleCwgZmxpcCwgZGlzdGFuY2UsIG5vcm1hbCwgZW5kTGVmdCwgZW5kUmlnaHQsIHJvdW5kKSB7XG4gICAgdmFyIHR4ID0gcm91bmQgPyAxIDogMDtcbiAgICB2YXIgZXh0cnVkZTtcblxuICAgIHZhciBsaW5lVmVydGV4ID0gdGhpcy5idWZmZXJzLmxpbmVWZXJ0ZXg7XG4gICAgdmFyIGxpbmVFbGVtZW50ID0gdGhpcy5idWZmZXJzLmxpbmVFbGVtZW50O1xuICAgIHZhciBlbGVtZW50R3JvdXAgPSB0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudDtcbiAgICB2YXIgdmVydGV4U3RhcnRJbmRleCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LnZlcnRleFN0YXJ0SW5kZXg7XG5cbiAgICBleHRydWRlID0gbm9ybWFsLm11bHQoZmxpcCk7XG4gICAgaWYgKGVuZExlZnQpIGV4dHJ1ZGUuX3N1Yihub3JtYWwucGVycCgpLl9tdWx0KGVuZExlZnQpKTtcbiAgICB0aGlzLmUzID0gbGluZVZlcnRleC5hZGQoY3VycmVudFZlcnRleCwgZXh0cnVkZSwgdHgsIDAsIGRpc3RhbmNlKSAtIHZlcnRleFN0YXJ0SW5kZXg7XG4gICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgbGluZUVsZW1lbnQuYWRkKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICBlbGVtZW50R3JvdXAuZWxlbWVudExlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmUxID0gdGhpcy5lMjtcbiAgICB0aGlzLmUyID0gdGhpcy5lMztcblxuICAgIGV4dHJ1ZGUgPSBub3JtYWwubXVsdCgtZmxpcCk7XG4gICAgaWYgKGVuZFJpZ2h0KSBleHRydWRlLl9zdWIobm9ybWFsLnBlcnAoKS5fbXVsdChlbmRSaWdodCkpO1xuICAgIHRoaXMuZTMgPSBsaW5lVmVydGV4LmFkZChjdXJyZW50VmVydGV4LCBleHRydWRlLCB0eCwgMSwgZGlzdGFuY2UpIC0gdmVydGV4U3RhcnRJbmRleDtcbiAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICBsaW5lRWxlbWVudC5hZGQodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgfVxuICAgIHRoaXMuZTEgPSB0aGlzLmUyO1xuICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuXG4gICAgZWxlbWVudEdyb3VwLnZlcnRleExlbmd0aCArPSAyO1xufTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbmV3IHZlcnRleCBhbmQgYSB0cmlhbmdsZSB1c2luZyB0d28gcHJldmlvdXMgdmVydGljZXMuXG4gKiBUaGlzIGFkZHMgYSBwaWUgc2xpY2UgdHJpYW5nbGUgbmVhciBhIGpvaW4gdG8gc2ltdWxhdGUgcm91bmQgam9pbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFZlcnRleCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmbGlwIC0xIGlmIHRoZSB2ZXJ0aWNlcyBzaG91bGQgYmUgZmxpcHBlZCwgMSBvdGhlcndpc2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnZ2luaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBleHRydWRlIHRoZSBvZmZzZXQgb2YgdGhlIG5ldyB2ZXJ0ZXggZnJvbSB0aGUgY3VycmVudFZlcnRleFxuICogQHBhcmFtIHtib29sZWFufSB3aGV0aGVyIHRoZSBsaW5lIGlzIHR1cm5pbmcgbGVmdCBvciByaWdodCBhdCB0aGlzIGFuZ2xlXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQnVja2V0LnByb3RvdHlwZS5hZGRQaWVTbGljZVZlcnRleCA9IGZ1bmN0aW9uKGN1cnJlbnRWZXJ0ZXgsIGZsaXAsIGRpc3RhbmNlLCBleHRydWRlLCBsaW5lVHVybnNMZWZ0KSB7XG4gICAgdmFyIGxpbmVWZXJ0ZXggPSB0aGlzLmJ1ZmZlcnMubGluZVZlcnRleDtcbiAgICB2YXIgbGluZUVsZW1lbnQgPSB0aGlzLmJ1ZmZlcnMubGluZUVsZW1lbnQ7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IHRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50O1xuICAgIHZhciB2ZXJ0ZXhTdGFydEluZGV4ID0gdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleDtcblxuICAgIHZhciB0eSA9IGxpbmVUdXJuc0xlZnQ7XG4gICAgZXh0cnVkZSA9IGV4dHJ1ZGUubXVsdChmbGlwICogKGxpbmVUdXJuc0xlZnQgPyAtMSA6IDEpKTtcblxuICAgIHRoaXMuZTMgPSBsaW5lVmVydGV4LmFkZChjdXJyZW50VmVydGV4LCBleHRydWRlLCAwLCB0eSwgZGlzdGFuY2UpIC0gdmVydGV4U3RhcnRJbmRleDtcbiAgICBlbGVtZW50R3JvdXAudmVydGV4TGVuZ3RoICs9IDE7XG5cbiAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICBsaW5lRWxlbWVudC5hZGQodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgIGVsZW1lbnRHcm91cC5lbGVtZW50TGVuZ3RoKys7XG4gICAgfVxuXG5cbiAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICB0aGlzLmUyID0gdGhpcy5lMztcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMztcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRWxlbWVudEdyb3VwcyA9IHJlcXVpcmUoJy4vZWxlbWVudF9ncm91cHMnKTtcbnZhciBBbmNob3IgPSByZXF1aXJlKCcuLi9zeW1ib2wvYW5jaG9yJyk7XG52YXIgZ2V0QW5jaG9ycyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nZXRfYW5jaG9ycycpO1xudmFyIHJlc29sdmVUb2tlbnMgPSByZXF1aXJlKCcuLi91dGlsL3Rva2VuJyk7XG52YXIgUXVhZHMgPSByZXF1aXJlKCcuLi9zeW1ib2wvcXVhZHMnKTtcbnZhciBTaGFwaW5nID0gcmVxdWlyZSgnLi4vc3ltYm9sL3NoYXBpbmcnKTtcbnZhciByZXNvbHZlVGV4dCA9IHJlcXVpcmUoJy4uL3N5bWJvbC9yZXNvbHZlX3RleHQnKTtcbnZhciByZXNvbHZlSWNvbnMgPSByZXF1aXJlKCcuLi9zeW1ib2wvcmVzb2x2ZV9pY29ucycpO1xudmFyIG1lcmdlTGluZXMgPSByZXF1aXJlKCcuLi9zeW1ib2wvbWVyZ2VsaW5lcycpO1xudmFyIHNoYXBlVGV4dCA9IFNoYXBpbmcuc2hhcGVUZXh0O1xudmFyIHNoYXBlSWNvbiA9IFNoYXBpbmcuc2hhcGVJY29uO1xudmFyIGdldEdseXBoUXVhZHMgPSBRdWFkcy5nZXRHbHlwaFF1YWRzO1xudmFyIGdldEljb25RdWFkcyA9IFF1YWRzLmdldEljb25RdWFkcztcbnZhciBjbGlwTGluZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9jbGlwX2xpbmUnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbnZhciBDb2xsaXNpb25GZWF0dXJlID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sQnVja2V0O1xuXG5mdW5jdGlvbiBTeW1ib2xCdWNrZXQoYnVmZmVycywgbGF5b3V0UHJvcGVydGllcywgb3ZlcnNjYWxpbmcsIHpvb20sIGNvbGxpc2lvbkRlYnVnKSB7XG4gICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcbiAgICB0aGlzLmxheW91dFByb3BlcnRpZXMgPSBsYXlvdXRQcm9wZXJ0aWVzO1xuICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvdmVyc2NhbGluZztcbiAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgIHRoaXMuY29sbGlzaW9uRGVidWcgPSBjb2xsaXNpb25EZWJ1ZztcbiAgICB2YXIgdGlsZVNpemUgPSA1MTIgKiBvdmVyc2NhbGluZztcbiAgICB2YXIgdGlsZUV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy50aWxlUGl4ZWxSYXRpbyA9IHRpbGVFeHRlbnQgLyB0aWxlU2l6ZTtcbiAgICB0aGlzLmNvbXBhcmVUZXh0ID0ge307XG4gICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMgPSBbXTtcblxufVxuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLm5lZWRzUGxhY2VtZW50ID0gdHJ1ZTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uKGNvbGxpc2lvblRpbGUpIHtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5sYXlvdXRQcm9wZXJ0aWVzO1xuICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXM7XG4gICAgdmFyIHRleHRGZWF0dXJlcyA9IHRoaXMudGV4dEZlYXR1cmVzO1xuXG4gICAgdmFyIGhvcml6b250YWxBbGlnbiA9IDAuNSxcbiAgICAgICAgdmVydGljYWxBbGlnbiA9IDAuNTtcblxuICAgIHN3aXRjaCAobGF5b3V0Wyd0ZXh0LWFuY2hvciddKSB7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbiA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN3aXRjaCAobGF5b3V0Wyd0ZXh0LWFuY2hvciddKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGp1c3RpZnkgPSBsYXlvdXRbJ3RleHQtanVzdGlmeSddID09PSAncmlnaHQnID8gMSA6XG4gICAgICAgIGxheW91dFsndGV4dC1qdXN0aWZ5J10gPT09ICdsZWZ0JyA/IDAgOlxuICAgICAgICAwLjU7XG5cbiAgICB2YXIgb25lRW0gPSAyNDtcbiAgICB2YXIgbGluZUhlaWdodCA9IGxheW91dFsndGV4dC1saW5lLWhlaWdodCddICogb25lRW07XG4gICAgdmFyIG1heFdpZHRoID0gbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gIT09ICdsaW5lJyA/IGxheW91dFsndGV4dC1tYXgtd2lkdGgnXSAqIG9uZUVtIDogMDtcbiAgICB2YXIgc3BhY2luZyA9IGxheW91dFsndGV4dC1sZXR0ZXItc3BhY2luZyddICogb25lRW07XG4gICAgdmFyIHRleHRPZmZzZXQgPSBbbGF5b3V0Wyd0ZXh0LW9mZnNldCddWzBdICogb25lRW0sIGxheW91dFsndGV4dC1vZmZzZXQnXVsxXSAqIG9uZUVtXTtcbiAgICB2YXIgZm9udHN0YWNrID0gbGF5b3V0Wyd0ZXh0LWZvbnQnXTtcblxuICAgIHZhciBnZW9tZXRyaWVzID0gW107XG4gICAgZm9yICh2YXIgZyA9IDA7IGcgPCBmZWF0dXJlcy5sZW5ndGg7IGcrKykge1xuICAgICAgICBnZW9tZXRyaWVzLnB1c2goZmVhdHVyZXNbZ10ubG9hZEdlb21ldHJ5KCkpO1xuICAgIH1cblxuICAgIGlmIChsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIC8vIE1lcmdlIGFkamFjZW50IGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCB0byBpbXByb3ZlIGxhYmVsbGluZy5cbiAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gcGxhY2UgbGFiZWxzIG9uIG9uZSBsb25nIGxpbmUgdGhhbiBvbiBtYW55IHNob3J0IHNlZ21lbnRzLlxuICAgICAgICB2YXIgbWVyZ2VkID0gbWVyZ2VMaW5lcyhmZWF0dXJlcywgdGV4dEZlYXR1cmVzLCBnZW9tZXRyaWVzKTtcblxuICAgICAgICBnZW9tZXRyaWVzID0gbWVyZ2VkLmdlb21ldHJpZXM7XG4gICAgICAgIGZlYXR1cmVzID0gbWVyZ2VkLmZlYXR1cmVzO1xuICAgICAgICB0ZXh0RmVhdHVyZXMgPSBtZXJnZWQudGV4dEZlYXR1cmVzO1xuICAgIH1cblxuICAgIHZhciBzaGFwZWRUZXh0LCBzaGFwZWRJY29uO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICBpZiAoIWdlb21ldHJpZXNba10pIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmICh0ZXh0RmVhdHVyZXNba10pIHtcbiAgICAgICAgICAgIHNoYXBlZFRleHQgPSBzaGFwZVRleHQodGV4dEZlYXR1cmVzW2tdLCB0aGlzLnN0YWNrc1tmb250c3RhY2tdLCBtYXhXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCBzcGFjaW5nLCB0ZXh0T2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlZFRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dFsnaWNvbi1pbWFnZSddKSB7XG4gICAgICAgICAgICB2YXIgaWNvbk5hbWUgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2tdLnByb3BlcnRpZXMsIGxheW91dFsnaWNvbi1pbWFnZSddKTtcbiAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaWNvbnNbaWNvbk5hbWVdO1xuICAgICAgICAgICAgc2hhcGVkSWNvbiA9IHNoYXBlSWNvbihpbWFnZSwgbGF5b3V0KTtcblxuICAgICAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2RmSWNvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNkZkljb25zID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZGZJY29ucyAhPT0gaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1Y2tldCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlZEljb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoYXBlZFRleHQgfHwgc2hhcGVkSWNvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGdlb21ldHJpZXNba10sIHNoYXBlZFRleHQsIHNoYXBlZEljb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wbGFjZUZlYXR1cmVzKGNvbGxpc2lvblRpbGUsIHRoaXMuYnVmZmVycywgdGhpcy5jb2xsaXNpb25EZWJ1Zyk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbihsaW5lcywgc2hhcGVkVGV4dCwgc2hhcGVkSWNvbikge1xuICAgIHZhciBsYXlvdXQgPSB0aGlzLmxheW91dFByb3BlcnRpZXM7XG5cbiAgICB2YXIgZ2x5cGhTaXplID0gMjQ7XG5cbiAgICB2YXIgZm9udFNjYWxlID0gbGF5b3V0Wyd0ZXh0LW1heC1zaXplJ10gLyBnbHlwaFNpemUsXG4gICAgICAgIHRleHRCb3hTY2FsZSA9IHRoaXMudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgIGljb25Cb3hTY2FsZSA9IHRoaXMudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRbJ2ljb24tbWF4LXNpemUnXSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSB0aGlzLnRpbGVQaXhlbFJhdGlvICogbGF5b3V0WydzeW1ib2wtbWluLWRpc3RhbmNlJ10sXG4gICAgICAgIGF2b2lkRWRnZXMgPSBsYXlvdXRbJ3N5bWJvbC1hdm9pZC1lZGdlcyddLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dFsndGV4dC1wYWRkaW5nJ10gKiB0aGlzLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dFsnaWNvbi1wYWRkaW5nJ10gKiB0aGlzLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXRbJ3RleHQtbWF4LWFuZ2xlJ10gLyAxODAgKiBNYXRoLlBJLFxuICAgICAgICB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBpY29uQWxvbmdMaW5lID0gbGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICBtYXlPdmVybGFwID0gbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgICAgICBsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddIHx8IGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10sXG4gICAgICAgIGlzTGluZSA9IGxheW91dFsnc3ltYm9sLXBsYWNlbWVudCddID09PSAnbGluZScsXG4gICAgICAgIHRleHRSZXBlYXREaXN0YW5jZSA9IHN5bWJvbE1pbkRpc3RhbmNlIC8gMjtcblxuICAgIGlmIChpc0xpbmUpIHtcbiAgICAgICAgbGluZXMgPSBjbGlwTGluZShsaW5lcywgMCwgMCwgNDA5NiwgNDA5Nik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYW5jaG9yIHBvaW50cyBhcm91bmQgd2hpY2ggeW91IHdhbnQgdG8gcGxhY2UgbGFiZWxzXG4gICAgICAgIHZhciBhbmNob3JzID0gaXNMaW5lID9cbiAgICAgICAgICAgIGdldEFuY2hvcnMobGluZSwgc3ltYm9sTWluRGlzdGFuY2UsIHRleHRNYXhBbmdsZSwgc2hhcGVkVGV4dCwgc2hhcGVkSWNvbiwgZ2x5cGhTaXplLCB0ZXh0Qm94U2NhbGUsIHRoaXMub3ZlcnNjYWxpbmcpIDpcbiAgICAgICAgICAgIFsgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkgXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb3RlbnRpYWwgbGFiZWwsIGNyZWF0ZSB0aGUgcGxhY2VtZW50IGZlYXR1cmVzIHVzZWQgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMsIGFuZCB0aGUgcXVhZHMgdXNlIGZvciByZW5kZXJpbmcuXG4gICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSBhbmNob3JzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICB2YXIgYW5jaG9yID0gYW5jaG9yc1tqXTtcblxuICAgICAgICAgICAgaWYgKHNoYXBlZFRleHQgJiYgaXNMaW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYW5jaG9ySXNUb29DbG9zZShzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpbnNpZGUgPSAhKGFuY2hvci54IDwgMCB8fCBhbmNob3IueCA+IDQwOTYgfHwgYW5jaG9yLnkgPCAwIHx8IGFuY2hvci55ID4gNDA5Nik7XG5cbiAgICAgICAgICAgIGlmIChhdm9pZEVkZ2VzICYmICFpbnNpZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBzeW1ib2wgbGF5ZXJzIGFyZSBkcmF3biBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzLiBPbmx5IHN5bWJvbHNcbiAgICAgICAgICAgIC8vIHdpdGggdGhlaXIgYW5jaG9ycyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllcyBhcmUgYWRkZWQgdG8gdGhlIGJ1ZmZlcnNcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIGJlaW5nIGRyYXduIHR3aWNlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN5bWJvbHMgaW4gbGF5ZXJzIHdpdGggb3ZlcmxhcCBhcmUgc29ydGVkIGluIHRoZSB5IGRpcmVjdGlvbiBzbyB0aGF0XG4gICAgICAgICAgICAvLyBzeW1ib2xzIGxvd2VyIG9uIHRoZSBjYW52YXMgYXJlIGRyYXduIG9uIHRvcCBvZiBzeW1ib2xzIG5lYXIgdGhlIHRvcC5cbiAgICAgICAgICAgIC8vIFRvIHByZXNlcnZlIHRoaXMgb3JkZXIgYWNyb3NzIHRpbGUgYm91bmRhcmllcyB0aGVzZSBzeW1ib2xzIGNhbid0XG4gICAgICAgICAgICAvLyBiZSBkcmF3biBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzLiBJbnN0ZWFkIHRoZXkgbmVlZCB0byBiZSBpbmNsdWRlZCBpblxuICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlcnMgZm9yIGJvdGggdGlsZXMgYW5kIGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzIGF0IGRyYXcgdGltZS5cbiAgICAgICAgICAgIHZhciBhZGRUb0J1ZmZlcnMgPSBpbnNpZGUgfHwgbWF5T3ZlcmxhcDtcblxuICAgICAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMucHVzaChuZXcgU3ltYm9sSW5zdGFuY2UoYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBsYXlvdXQsIGFkZFRvQnVmZmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lKSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBDaGVjayBpZiBhbnkgb3RoZXIgYW5jaG9ycyB3aXRoIHRoZSBzYW1lIHRleHQgYXJlIGNsb3NlciB0aGFuIHJlcGVhdERpc3RhbmNlXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFuY2hvcklzVG9vQ2xvc2UgPSBmdW5jdGlvbih0ZXh0LCByZXBlYXREaXN0YW5jZSwgYW5jaG9yKSB7XG4gICAgdmFyIGNvbXBhcmVUZXh0ID0gdGhpcy5jb21wYXJlVGV4dDtcbiAgICBpZiAoISh0ZXh0IGluIGNvbXBhcmVUZXh0KSkge1xuICAgICAgICBjb21wYXJlVGV4dFt0ZXh0XSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdGhlckFuY2hvcnMgPSBjb21wYXJlVGV4dFt0ZXh0XTtcbiAgICAgICAgZm9yICh2YXIgayA9IG90aGVyQW5jaG9ycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgaWYgKGFuY2hvci5kaXN0KG90aGVyQW5jaG9yc1trXSkgPCByZXBlYXREaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIG9uZSBhbmNob3IsIHN0b3AgbG9va2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIGFuY2hvciBpcyBub3Qgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIGFueSBvdGhlciBhbmNob3IsIGFkZCB0byBhcnJheVxuICAgIGNvbXBhcmVUZXh0W3RleHRdLnB1c2goYW5jaG9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLnBsYWNlRmVhdHVyZXMgPSBmdW5jdGlvbihjb2xsaXNpb25UaWxlLCBidWZmZXJzLCBjb2xsaXNpb25EZWJ1Zykge1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdoaWNoIGxhYmVscyBjYW4gYmUgc2hvd24gYW5kIHdoZW4gdGhleSBjYW4gYmUgc2hvd24gYW5kXG4gICAgLy8gY3JlYXRlIHRoZSBidWZlcnMgdXNlZCBmb3IgcmVuZGVyaW5nLlxuXG4gICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcblxuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGhpcy5lbGVtZW50R3JvdXBzID0ge1xuICAgICAgICB0ZXh0OiBuZXcgRWxlbWVudEdyb3VwcyhidWZmZXJzLmdseXBoVmVydGV4LCBidWZmZXJzLmdseXBoRWxlbWVudCksXG4gICAgICAgIGljb246IG5ldyBFbGVtZW50R3JvdXBzKGJ1ZmZlcnMuaWNvblZlcnRleCwgYnVmZmVycy5pY29uRWxlbWVudCksXG4gICAgICAgIHNkZkljb25zOiB0aGlzLnNkZkljb25zXG4gICAgfTtcblxuICAgIHZhciBsYXlvdXQgPSB0aGlzLmxheW91dFByb3BlcnRpZXM7XG4gICAgdmFyIG1heFNjYWxlID0gY29sbGlzaW9uVGlsZS5tYXhTY2FsZTtcblxuICAgIHZhciB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnO1xuICAgIHZhciBpY29uQWxvbmdMaW5lID0gbGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnO1xuXG4gICAgdmFyIG1heU92ZXJsYXAgPSBsYXlvdXRbJ3RleHQtYWxsb3ctb3ZlcmxhcCddIHx8IGxheW91dFsnaWNvbi1hbGxvdy1vdmVybGFwJ10gfHxcbiAgICAgICAgbGF5b3V0Wyd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnXSB8fCBsYXlvdXRbJ2ljb24taWdub3JlLXBsYWNlbWVudCddO1xuXG4gICAgLy8gU29ydCBzeW1ib2xzIGJ5IHRoZWlyIHkgcG9zaXRpb24gb24gdGhlIGNhbnZhcyBzbyB0aGF0IHRoZXkgbG93ZXIgc3ltYm9sc1xuICAgIC8vIGFyZSBkcmF3biBvbiB0b3Agb2YgaGlnaGVyIHN5bWJvbHMuXG4gICAgLy8gRG9uJ3Qgc29ydCBzeW1ib2xzIHRoYXQgd29uJ3Qgb3ZlcmxhcCBiZWNhdXNlIGl0IGlzbid0IG5lY2Vzc2FyeSBhbmRcbiAgICAvLyBiZWNhdXNlIGl0IGNhdXNlcyBtb3JlIGxhYmVscyB0byBwb3AgaW4gYW5kIG91dCB3aGVuIHJvdGF0aW5nLlxuICAgIGlmIChtYXlPdmVybGFwKSB7XG4gICAgICAgIHZhciBhbmdsZSA9IGNvbGxpc2lvblRpbGUuYW5nbGU7XG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cbiAgICAgICAgdGhpcy5zeW1ib2xJbnN0YW5jZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICB2YXIgYVJvdGF0ZWQgPSBzaW4gKiBhLnggKyBjb3MgKiBhLnk7XG4gICAgICAgICAgICB2YXIgYlJvdGF0ZWQgPSBzaW4gKiBiLnggKyBjb3MgKiBiLnk7XG4gICAgICAgICAgICByZXR1cm4gYlJvdGF0ZWQgLSBhUm90YXRlZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCA9IDA7IHAgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHArKykge1xuICAgICAgICB2YXIgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlc1twXTtcbiAgICAgICAgdmFyIGhhc1RleHQgPSBzeW1ib2xJbnN0YW5jZS5oYXNUZXh0O1xuICAgICAgICB2YXIgaGFzSWNvbiA9IHN5bWJvbEluc3RhbmNlLmhhc0ljb247XG5cbiAgICAgICAgdmFyIGljb25XaXRob3V0VGV4dCA9IGxheW91dFsndGV4dC1vcHRpb25hbCddIHx8ICFoYXNUZXh0LFxuICAgICAgICAgICAgdGV4dFdpdGhvdXRJY29uID0gbGF5b3V0WydpY29uLW9wdGlvbmFsJ10gfHwgIWhhc0ljb247XG5cblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlcyBhdCB3aGljaCB0aGUgdGV4dCBhbmQgaWNvbiBjYW4gYmUgcGxhY2VkIHdpdGhvdXQgY29sbGlzaW9uLlxuXG4gICAgICAgIHZhciBnbHlwaFNjYWxlID0gaGFzVGV4dCAmJiAhbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSA/XG4gICAgICAgICAgICBjb2xsaXNpb25UaWxlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShzeW1ib2xJbnN0YW5jZS50ZXh0Q29sbGlzaW9uRmVhdHVyZSkgOlxuICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5taW5TY2FsZTtcblxuICAgICAgICB2YXIgaWNvblNjYWxlID0gaGFzSWNvbiAmJiAhbGF5b3V0WydpY29uLWFsbG93LW92ZXJsYXAnXSA/XG4gICAgICAgICAgICBjb2xsaXNpb25UaWxlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShzeW1ib2xJbnN0YW5jZS5pY29uQ29sbGlzaW9uRmVhdHVyZSkgOlxuICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5taW5TY2FsZTtcblxuXG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHNjYWxlcyBmb3IgaWNvbnMgYW5kIHRleHQuXG5cbiAgICAgICAgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgaWNvblNjYWxlID0gZ2x5cGhTY2FsZSA9IE1hdGgubWF4KGljb25TY2FsZSwgZ2x5cGhTY2FsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRleHRXaXRob3V0SWNvbiAmJiBnbHlwaFNjYWxlKSB7XG4gICAgICAgICAgICBnbHlwaFNjYWxlID0gTWF0aC5tYXgoaWNvblNjYWxlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaWNvbldpdGhvdXRUZXh0ICYmIGljb25TY2FsZSkge1xuICAgICAgICAgICAgaWNvblNjYWxlID0gTWF0aC5tYXgoaWNvblNjYWxlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gSW5zZXJ0IGZpbmFsIHBsYWNlbWVudCBpbnRvIGNvbGxpc2lvbiB0cmVlIGFuZCBhZGQgZ2x5cGhzL2ljb25zIHRvIGJ1ZmZlcnNcblxuICAgICAgICBpZiAoaGFzVGV4dCkge1xuICAgICAgICAgICAgaWYgKCFsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHN5bWJvbEluc3RhbmNlLnRleHRDb2xsaXNpb25GZWF0dXJlLCBnbHlwaFNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnbHlwaFNjYWxlIDw9IG1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xzKGJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsIGJ1ZmZlcnMuZ2x5cGhFbGVtZW50LCBlbGVtZW50R3JvdXBzLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5nbHlwaFF1YWRzLCBnbHlwaFNjYWxlLCBsYXlvdXRbJ3RleHQta2VlcC11cHJpZ2h0J10sIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLmFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICBpZiAoIWxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10pIHtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLmluc2VydENvbGxpc2lvbkZlYXR1cmUoc3ltYm9sSW5zdGFuY2UuaWNvbkNvbGxpc2lvbkZlYXR1cmUsIGljb25TY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWNvblNjYWxlIDw9IG1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xzKGJ1ZmZlcnMuaWNvblZlcnRleCwgYnVmZmVycy5pY29uRWxlbWVudCwgZWxlbWVudEdyb3Vwcy5pY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvblF1YWRzLCBpY29uU2NhbGUsIGxheW91dFsnaWNvbi1rZWVwLXVwcmlnaHQnXSwgaWNvbkFsb25nTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvblRpbGUuYW5nbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAoY29sbGlzaW9uRGVidWcpIHRoaXMuYWRkVG9EZWJ1Z0J1ZmZlcnMoY29sbGlzaW9uVGlsZSk7XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHMgPSBmdW5jdGlvbih2ZXJ0ZXgsIGVsZW1lbnQsIGVsZW1lbnRHcm91cHMsIHF1YWRzLCBzY2FsZSwga2VlcFVwcmlnaHQsIGFsb25nTGluZSwgcGxhY2VtZW50QW5nbGUpIHtcblxuICAgIGVsZW1lbnRHcm91cHMubWFrZVJvb21Gb3IoNCAqIHF1YWRzLmxlbmd0aCk7XG4gICAgdmFyIGVsZW1lbnRHcm91cCA9IGVsZW1lbnRHcm91cHMuY3VycmVudDtcblxuICAgIHZhciB6b29tID0gdGhpcy56b29tO1xuICAgIHZhciBwbGFjZW1lbnRab29tID0gTWF0aC5tYXgoTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjIgKyB6b29tLCAwKTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcXVhZHMubGVuZ3RoOyBrKyspIHtcblxuICAgICAgICB2YXIgc3ltYm9sID0gcXVhZHNba10sXG4gICAgICAgICAgICBhbmdsZSA9IHN5bWJvbC5hbmdsZTtcblxuICAgICAgICAvLyBkcm9wIHVwc2lkZSBkb3duIHZlcnNpb25zIG9mIGdseXBoc1xuICAgICAgICB2YXIgYSA9IChhbmdsZSArIHBsYWNlbWVudEFuZ2xlICsgTWF0aC5QSSkgJSAoTWF0aC5QSSAqIDIpO1xuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgYWxvbmdMaW5lICYmIChhIDw9IE1hdGguUEkgLyAyIHx8IGEgPiBNYXRoLlBJICogMyAvIDIpKSBjb250aW51ZTtcblxuICAgICAgICB2YXIgdGwgPSBzeW1ib2wudGwsXG4gICAgICAgICAgICB0ciA9IHN5bWJvbC50cixcbiAgICAgICAgICAgIGJsID0gc3ltYm9sLmJsLFxuICAgICAgICAgICAgYnIgPSBzeW1ib2wuYnIsXG4gICAgICAgICAgICB0ZXggPSBzeW1ib2wudGV4LFxuICAgICAgICAgICAgYW5jaG9yUG9pbnQgPSBzeW1ib2wuYW5jaG9yUG9pbnQsXG5cbiAgICAgICAgICAgIG1pblpvb20gPSBNYXRoLm1heCh6b29tICsgTWF0aC5sb2coc3ltYm9sLm1pblNjYWxlKSAvIE1hdGguTE4yLCBwbGFjZW1lbnRab29tKSxcbiAgICAgICAgICAgIG1heFpvb20gPSBNYXRoLm1pbih6b29tICsgTWF0aC5sb2coc3ltYm9sLm1heFNjYWxlKSAvIE1hdGguTE4yLCAyNSk7XG5cbiAgICAgICAgaWYgKG1heFpvb20gPD0gbWluWm9vbSkgY29udGludWU7XG5cbiAgICAgICAgLy8gTG93ZXIgbWluIHpvb20gc28gdGhhdCB3aGlsZSBmYWRpbmcgb3V0IHRoZSBsYWJlbCBpdCBjYW4gYmUgc2hvd24gb3V0c2lkZSBvZiBjb2xsaXNpb24tZnJlZSB6b29tIGxldmVsc1xuICAgICAgICBpZiAobWluWm9vbSA9PT0gcGxhY2VtZW50Wm9vbSkgbWluWm9vbSA9IDA7XG5cbiAgICAgICAgdmFyIHRyaWFuZ2xlSW5kZXggPSB2ZXJ0ZXguaW5kZXggLSBlbGVtZW50R3JvdXAudmVydGV4U3RhcnRJbmRleDtcblxuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvclBvaW50LngsIGFuY2hvclBvaW50LnksIHRsLngsIHRsLnksIHRleC54LCB0ZXgueSwgbWluWm9vbSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgIHZlcnRleC5hZGQoYW5jaG9yUG9pbnQueCwgYW5jaG9yUG9pbnQueSwgdHIueCwgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICB2ZXJ0ZXguYWRkKGFuY2hvclBvaW50LngsIGFuY2hvclBvaW50LnksIGJsLngsIGJsLnksIHRleC54LCB0ZXgueSArIHRleC5oLCBtaW5ab29tLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgdmVydGV4LmFkZChhbmNob3JQb2ludC54LCBhbmNob3JQb2ludC55LCBici54LCBici55LCB0ZXgueCArIHRleC53LCB0ZXgueSArIHRleC5oLCBtaW5ab29tLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgZWxlbWVudEdyb3VwLnZlcnRleExlbmd0aCArPSA0O1xuXG4gICAgICAgIGVsZW1lbnQuYWRkKHRyaWFuZ2xlSW5kZXgsIHRyaWFuZ2xlSW5kZXggKyAxLCB0cmlhbmdsZUluZGV4ICsgMik7XG4gICAgICAgIGVsZW1lbnQuYWRkKHRyaWFuZ2xlSW5kZXggKyAxLCB0cmlhbmdsZUluZGV4ICsgMiwgdHJpYW5nbGVJbmRleCArIDMpO1xuICAgICAgICBlbGVtZW50R3JvdXAuZWxlbWVudExlbmd0aCArPSAyO1xuICAgIH1cblxufTtcblxuU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbih0aWxlLCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmlyc3Rkb25lID0gZmFsc2U7XG4gICAgdGhpcy5nZXRUZXh0RGVwZW5kZW5jaWVzKHRpbGUsIGFjdG9yLCBkb25lKTtcbiAgICB0aGlzLmdldEljb25EZXBlbmRlbmNpZXModGlsZSwgYWN0b3IsIGRvbmUpO1xuICAgIGZ1bmN0aW9uIGRvbmUoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgfHwgZmlyc3Rkb25lKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgZmlyc3Rkb25lID0gdHJ1ZTtcbiAgICB9XG59O1xuXG5TeW1ib2xCdWNrZXQucHJvdG90eXBlLmdldEljb25EZXBlbmRlbmNpZXMgPSBmdW5jdGlvbih0aWxlLCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5sYXlvdXRQcm9wZXJ0aWVzWydpY29uLWltYWdlJ10pIHtcbiAgICAgICAgdmFyIGZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcztcbiAgICAgICAgdmFyIGljb25zID0gcmVzb2x2ZUljb25zKGZlYXR1cmVzLCB0aGlzLmxheW91dFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChpY29ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldCBpY29ucycsIHsgaWNvbnM6IGljb25zIH0sIHNldEljb25zLmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0SWNvbnMoZXJyLCBuZXdpY29ucykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgdGhpcy5pY29ucyA9IG5ld2ljb25zO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0VGV4dERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uKHRpbGUsIGFjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZmVhdHVyZXM7XG4gICAgdmFyIGZvbnRzdGFjayA9IHRoaXMubGF5b3V0UHJvcGVydGllc1sndGV4dC1mb250J107XG5cbiAgICB2YXIgc3RhY2tzID0gdGhpcy5zdGFja3MgPSB0aWxlLnN0YWNrcztcbiAgICBpZiAoc3RhY2tzW2ZvbnRzdGFja10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGFja3NbZm9udHN0YWNrXSA9IHt9O1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBzdGFja3NbZm9udHN0YWNrXTtcblxuICAgIHZhciBkYXRhID0gcmVzb2x2ZVRleHQoZmVhdHVyZXMsIHRoaXMubGF5b3V0UHJvcGVydGllcywgc3RhY2spO1xuICAgIHRoaXMudGV4dEZlYXR1cmVzID0gZGF0YS50ZXh0RmVhdHVyZXM7XG5cbiAgICBhY3Rvci5zZW5kKCdnZXQgZ2x5cGhzJywge1xuICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICBmb250c3RhY2s6IGZvbnRzdGFjayxcbiAgICAgICAgY29kZXBvaW50czogZGF0YS5jb2RlcG9pbnRzXG4gICAgfSwgZnVuY3Rpb24oZXJyLCBuZXdzdGFjaykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICBmb3IgKHZhciBjb2RlcG9pbnQgaW4gbmV3c3RhY2spIHtcbiAgICAgICAgICAgIHN0YWNrW2NvZGVwb2ludF0gPSBuZXdzdGFja1tjb2RlcG9pbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbn07XG5cblN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnMgPSBmdW5jdGlvbihjb2xsaXNpb25UaWxlKSB7XG5cbiAgICB0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94ID0gbmV3IEVsZW1lbnRHcm91cHModGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCk7XG4gICAgdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5tYWtlUm9vbUZvcigwKTtcbiAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICB2YXIgYW5nbGUgPSAtY29sbGlzaW9uVGlsZS5hbmdsZTtcbiAgICB2YXIgeVN0cmV0Y2ggPSBjb2xsaXNpb25UaWxlLnlTdHJldGNoO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSB0aGlzLnN5bWJvbEluc3RhbmNlc1tqXVtpID09PSAwID8gJ3RleHRDb2xsaXNpb25GZWF0dXJlJyA6ICdpY29uQ29sbGlzaW9uRmVhdHVyZSddO1xuICAgICAgICAgICAgaWYgKCFmZWF0dXJlKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZhciBib3hlcyA9IGZlYXR1cmUuYm94ZXM7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYm94ZXMubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYm94ID0gYm94ZXNbYl07XG4gICAgICAgICAgICAgICAgdmFyIGFuY2hvclBvaW50ID0gYm94LmFuY2hvclBvaW50O1xuXG4gICAgICAgICAgICAgICAgdmFyIHRsID0gbmV3IFBvaW50KGJveC54MSwgYm94LnkxICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuICAgICAgICAgICAgICAgIHZhciB0ciA9IG5ldyBQb2ludChib3gueDIsIGJveC55MSAqIHlTdHJldGNoKS5fcm90YXRlKGFuZ2xlKTtcbiAgICAgICAgICAgICAgICB2YXIgYmwgPSBuZXcgUG9pbnQoYm94LngxLCBib3gueTIgKiB5U3RyZXRjaCkuX3JvdGF0ZShhbmdsZSk7XG4gICAgICAgICAgICAgICAgdmFyIGJyID0gbmV3IFBvaW50KGJveC54MiwgYm94LnkyICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1heFpvb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNSwgdGhpcy56b29tICsgTWF0aC5sb2coYm94Lm1heFNjYWxlKSAvIE1hdGguTE4yKSk7XG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlbWVudFpvb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNSwgdGhpcy56b29tICsgTWF0aC5sb2coYm94LnBsYWNlbWVudFNjYWxlKSAvIE1hdGguTE4yKSk7XG5cbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCB0bCwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgdHIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yUG9pbnQsIHRyLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCBiciwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgYnIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQoYW5jaG9yUG9pbnQsIGJsLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuYWRkKGFuY2hvclBvaW50LCBibCwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChhbmNob3JQb2ludCwgdGwsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5jdXJyZW50LnZlcnRleExlbmd0aCArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gU3ltYm9sSW5zdGFuY2UoYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBsYXlvdXQsIGFkZFRvQnVmZmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lKSB7XG5cbiAgICB0aGlzLnggPSBhbmNob3IueDtcbiAgICB0aGlzLnkgPSBhbmNob3IueTtcbiAgICB0aGlzLmhhc1RleHQgPSAhIXNoYXBlZFRleHQ7XG4gICAgdGhpcy5oYXNJY29uID0gISFzaGFwZWRJY29uO1xuXG4gICAgaWYgKHRoaXMuaGFzVGV4dCkge1xuICAgICAgICB0aGlzLmdseXBoUXVhZHMgPSBhZGRUb0J1ZmZlcnMgPyBnZXRHbHlwaFF1YWRzKGFuY2hvciwgc2hhcGVkVGV4dCwgdGV4dEJveFNjYWxlLCBsaW5lLCBsYXlvdXQsIHRleHRBbG9uZ0xpbmUpIDogW107XG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShsaW5lLCBhbmNob3IsIHNoYXBlZFRleHQsIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ljb24pIHtcbiAgICAgICAgdGhpcy5pY29uUXVhZHMgPSBhZGRUb0J1ZmZlcnMgPyBnZXRJY29uUXVhZHMoYW5jaG9yLCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGxpbmUsIGxheW91dCwgaWNvbkFsb25nTGluZSkgOiBbXTtcbiAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGxpbmUsIGFuY2hvciwgc2hhcGVkSWNvbiwgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgaWNvbkFsb25nTGluZSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvb3JkaW5hdGU7XG5cbi8qKlxuICogQSBjb29yZGluYXRlIGlzIGEgY29sdW1uLCByb3csIHpvb20gY29tYmluYXRpb24sIG9mdGVuIHVzZWRcbiAqIGFzIHRoZSBkYXRhIGNvbXBvbmVudCBvZiBhIHRpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtblxuICogQHBhcmFtIHtudW1iZXJ9IHJvd1xuICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvb3JkaW5hdGUoY29sdW1uLCByb3csIHpvb20pIHtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICB0aGlzLnJvdyA9IHJvdztcbiAgICB0aGlzLnpvb20gPSB6b29tO1xufVxuXG5Db29yZGluYXRlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgY29vcmRpbmF0ZSB0aGF0IGNhbiBiZSBtdXRhdGVkIHdpdGhvdXRcbiAgICAgKiBjaGFuZ2luZyB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9IGNsb25lXG4gICAgICogQHByaXZhdGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC5jbG9uZSgpO1xuICAgICAqIC8vIHNpbmNlIGNvb3JkIGlzIGNsb25lZCwgbW9kaWZ5aW5nIGEgcHJvcGVydHkgb2YgYzIgZG9lc1xuICAgICAqIC8vIG5vdCBtb2RpZnkgaXQuXG4gICAgICogYzIuem9vbSA9IDI7XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvb3JkaW5hdGUodGhpcy5jb2x1bW4sIHRoaXMucm93LCB0aGlzLnpvb20pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIHRoaXMgY29vcmRpbmF0ZSB0byBhIGdpdmVuIHpvb20gbGV2ZWwuIFRoaXMgcmV0dXJucyBhIG5ld1xuICAgICAqIGNvb3JkaW5hdGUgb2JqZWN0LCBub3QgbXV0YXRpbmcgdGhlIG9sZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSB6b29tZWQgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC56b29tVG8oMSk7XG4gICAgICogYzIgLy8gZXF1YWxzIG5ldyBDb29yZGluYXRlKDAsIDAsIDEpO1xuICAgICAqL1xuICAgIHpvb21UbzogZnVuY3Rpb24oem9vbSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8oem9vbSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGUgY29sdW1uIGFuZCByb3cgdmFsdWVzIG9mIHRoaXMgY29vcmRpbmF0ZSBmcm9tIHRob3NlXG4gICAgICogb2YgYW5vdGhlciBjb29yZGluYXRlLiBUaGUgb3RoZXIgY29vcmRpbmF0IHdpbGwgYmUgem9vbWVkIHRvIHRoZVxuICAgICAqIHNhbWUgbGV2ZWwgYXMgYHRoaXNgIGJlZm9yZSB0aGUgc3VidHJhY3Rpb24gb2NjdXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGMgb3RoZXIgY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSByZXN1bHRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YjogZnVuY3Rpb24oYykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIoYyk7IH0sXG5cbiAgICBfem9vbVRvOiBmdW5jdGlvbih6b29tKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIHpvb20gLSB0aGlzLnpvb20pO1xuICAgICAgICB0aGlzLmNvbHVtbiAqPSBzY2FsZTtcbiAgICAgICAgdGhpcy5yb3cgKj0gc2NhbGU7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihjKSB7XG4gICAgICAgIGMgPSBjLnpvb21Ubyh0aGlzLnpvb20pO1xuICAgICAgICB0aGlzLmNvbHVtbiAtPSBjLmNvbHVtbjtcbiAgICAgICAgdGhpcy5yb3cgLT0gYy5yb3c7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF0TG5nO1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpLndyYXA7XG5cbi8qKlxuICogQ3JlYXRlIGEgbGF0aXR1ZGUsIGxvbmdpdHVkZSBvYmplY3QgZnJvbSBhIGdpdmVuIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgcGFpciBpbiBkZWdyZWVzLlxuICpcbiAqIEBjbGFzcyBMYXRMbmdcbiAqIEBjbGFzc2Rlc2MgQSByZXByZXNlbnRhdGlvbiBvZiBhIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgcG9pbnQsIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IGxhdGl0dWRlXG4gKiBAcGFyYW0ge251bWJlcn0gbG5nIGxvbmdpdHVkZVxuICogQGV4YW1wbGVcbiAqIHZhciBsYXRsbmcgPSBuZXcgbWFwYm94Z2wuTGF0TG5nKDM3Ljc2LCAtMTIyLjQ0KTtcbiAqL1xuZnVuY3Rpb24gTGF0TG5nKGxhdCwgbG5nKSB7XG4gICAgaWYgKGlzTmFOKGxhdCkgfHwgaXNOYU4obG5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTGF0TG5nIG9iamVjdDogKCcgKyBsYXQgKyAnLCAnICsgbG5nICsgJyknKTtcbiAgICB9XG4gICAgdGhpcy5sYXQgPSArbGF0O1xuICAgIHRoaXMubG5nID0gK2xuZztcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgYExhdExuZ2Agb2JqZWN0IHdob3NlIGxvbmdpdHVkZSBpcyB3cmFwcGVkIHRvIHRoZSByYW5nZSAoLTE4MCwgMTgwKS5cbiAqXG4gKiBAcmV0dXJucyB7TGF0TG5nfSB3cmFwcGVkIExhdExuZyBvYmplY3RcbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9pbnQgPSBtYXBib3hnbC5MYXRMbmcoMCwgMjAwKTtcbiAqIHZhciB3cmFwcGVkID0gcG9pbnQud3JhcCgpO1xuICogd3JhcHBlZC5sbmc7IC8vID0gLTE2MFxuICovXG5MYXRMbmcucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBMYXRMbmcodGhpcy5sYXQsIHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCkpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGEgYExhdExuZ2Agb2JqZWN0LCBvciByZXR1cm4gYW4gZXhpc3RpbmcgYExhdExuZ2Agb2JqZWN0XG4gKiB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fExhdExuZ30gaW5wdXQgYGlucHV0YCB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7TGF0TG5nfSBMYXRMbmcgb2JqZWN0IG9yIG9yaWdpbmFsIGlucHV0XG4gKiBAZXhhbXBsZVxuICogdmFyIGxsID0gbWFwYm94Z2wuTGF0TG5nLmNvbnZlcnQoWzEwLCAxMF0pO1xuICogdmFyIGxsMiA9IG5ldyBtYXBib3hnbC5MYXRMbmcoMTAsIDEwKTtcbiAqIGxsIC8vID0gbGwyXG4gKi9cbkxhdExuZy5jb252ZXJ0ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF0TG5nKGlucHV0WzBdLCBpbnB1dFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF0TG5nQm91bmRzO1xuXG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi9sYXRfbG5nJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJvdW5kaW5nIGJveCBmcm9tIHRoZSBnaXZlbiBwYWlyIG9mIHBvaW50cy4gSWYgcGFyYW1ldGVyZXMgYXJlIG9taXR0ZWQsIGEgYG51bGxgIGJvdW5kaW5nIGJveCBpcyBjcmVhdGVkLlxuICpcbiAqIEBjbGFzcyBMYXRMbmdCb3VuZHNcbiAqIEBjbGFzc2Rlc2MgQSByZXByZXNlbnRhdGlvbiBvZiByZWN0YW5ndWxhciBib3ggb24gdGhlIGVhcnRoLCBkZWZpbmVkIGJ5IGl0cyBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgaW4gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS5cbiAqIEBwYXJhbSB7TGF0TG5nfSBzdyBzb3V0aHdlc3RcbiAqIEBwYXJhbSB7TGF0TG5nfSBuZSBub3J0aGVhc3RcbiAqIEBleGFtcGxlXG4gKiB2YXIgc3cgPSBuZXcgbWFwYm94Z2wuTGF0TG5nKDAsIDApO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxhdExuZygxMCwgLTEwKTtcbiAqIHZhciBib3VuZHMgPSBuZXcgbWFwYm94Z2wuTGF0TG5nQm91bmRzKHN3LCBuZSk7XG4gKlxuICovXG5mdW5jdGlvbiBMYXRMbmdCb3VuZHMoc3csIG5lKSB7XG4gICAgaWYgKCFzdykgcmV0dXJuO1xuXG4gICAgdmFyIGxhdGxuZ3MgPSBuZSA/IFtzdywgbmVdIDogc3c7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGF0bG5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0aGlzLmV4dGVuZChsYXRsbmdzW2ldKTtcbiAgICB9XG59XG5cbkxhdExuZ0JvdW5kcy5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgdGhlIGJvdW5kcyB0byBpbmNsdWRlIGEgZ2l2ZW4gTGF0TG5nIG9yIExhdExuZ0JvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TGF0TG5nfExhdExuZ0JvdW5kc30gb2JqIG9iamVjdCB0byBleHRlbmQgdG9cbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nQm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBleHRlbmQ6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICB2YXIgc3cgPSB0aGlzLl9zdyxcbiAgICAgICAgICAgIG5lID0gdGhpcy5fbmUsXG4gICAgICAgICAgICBzdzIsIG5lMjtcblxuICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgICAgICAgICBzdzIgPSBvYmo7XG4gICAgICAgICAgICBuZTIgPSBvYmo7XG5cbiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iai5fc3c7XG4gICAgICAgICAgICBuZTIgPSBvYmouX25lO1xuXG4gICAgICAgICAgICBpZiAoIXN3MiB8fCAhbmUyKSByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiA/IHRoaXMuZXh0ZW5kKExhdExuZy5jb252ZXJ0KG9iaikgfHwgTGF0TG5nQm91bmRzLmNvbnZlcnQob2JqKSkgOiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExhdExuZyhzdzIubGF0LCBzdzIubG5nKTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExhdExuZyhuZTIubGF0LCBuZTIubG5nKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubGF0ID0gTWF0aC5taW4oc3cyLmxhdCwgc3cubGF0KTtcbiAgICAgICAgICAgIHN3LmxuZyA9IE1hdGgubWluKHN3Mi5sbmcsIHN3LmxuZyk7XG4gICAgICAgICAgICBuZS5sYXQgPSBNYXRoLm1heChuZTIubGF0LCBuZS5sYXQpO1xuICAgICAgICAgICAgbmUubG5nID0gTWF0aC5tYXgobmUyLmxuZywgbmUubG5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvaW50IGVxdWlkaXN0YW50IGZyb20gdGhpcyBib3gncyBjb3JuZXJzXG4gICAgICogQHJldHVybnMge0xhdExuZ30gY2VudGVycG9pbnRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBib3VuZHMgPSBuZXcgbWFwYm94Z2wuTGF0TG5nQm91bmRzKFxuICAgICAqICAgbmV3IG1hcGJveGdsLkxhdExuZygxMCwgMTApLFxuICAgICAqICAgbmV3IG1hcGJveGdsLkxhdExuZygtMTAsIC0xMCk7XG4gICAgICogYm91bmRzLmdldENlbnRlcigpOyAvLyBlcXVhbHMgbWFwYm94Z2wuTGF0TG5nKDAsIDApXG4gICAgICovXG4gICAgZ2V0Q2VudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyLCAodGhpcy5fc3cubG5nICsgdGhpcy5fbmUubG5nKSAvIDIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgc291dGh3ZXN0IGNvcm5lclxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IHNvdXRod2VzdFxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zdzsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBub3J0aGVhc3QgY29ybmVyXG4gICAgICogQHJldHVybnMge0xhdExuZ30gbm9ydGhlYXN0XG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX25lOyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vcnRod2VzdCBjb3JuZXJcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfSBub3J0aHdlc3RcbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExhdExuZyh0aGlzLmdldE5vcnRoKCksIHRoaXMuZ2V0V2VzdCgpKTsgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzb3V0aGVhc3QgY29ybmVyXG4gICAgICogQHJldHVybnMge0xhdExuZ30gc291dGhlYXN0XG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMYXRMbmcodGhpcy5nZXRTb3V0aCgpLCB0aGlzLmdldEVhc3QoKSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgd2VzdCBlZGdlIGxvbmdpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHdlc3RcbiAgICAgKi9cbiAgICBnZXRXZXN0OiAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgc291dGggZWRnZSBsYXRpdHVkZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHNvdXRoXG4gICAgICovXG4gICAgZ2V0U291dGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc3cubGF0OyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGVhc3QgZWRnZSBsb25naXR1ZGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBlYXN0XG4gICAgICovXG4gICAgZ2V0RWFzdDogIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vcnRoIGVkZ2UgbGF0aXR1ZGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBub3J0aFxuICAgICAqL1xuICAgIGdldE5vcnRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX25lLmxhdDsgfVxufTtcblxuLyoqXG4gKiBjb25zdHJ1Y3RzIExhdExuZ0JvdW5kcyBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuICogQHBhcmFtIHtMYXRMbmdCb3VuZHN8Kn0gYSBhbnkgaW5wdXRcbiAqIEByZXR1cm5zIHtMYXRMbmdCb3VuZHN8ZmFsc2V9XG4gKiBAZXhhbXBsZVxuICogLy8gY2FsbHMgTGF0TG5nLmNvbnZlcnQgaW50ZXJuYWxseSB0b1xuICogLy8gc3VwcG9ydCBhcnJheXMgYXMgbGF0bG5nIHZhbHVlc1xuICogTGF0TG5nQm91bmRzLmNvbnZlcnQoW1stMTAsIC0xMF0sIFsxMCwgMTBdXSk7XG4gKi9cbkxhdExuZ0JvdW5kcy5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoIWEgfHwgYSBpbnN0YW5jZW9mIExhdExuZ0JvdW5kcykgcmV0dXJuIGE7XG4gICAgcmV0dXJuIG5ldyBMYXRMbmdCb3VuZHMoYSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi9sYXRfbG5nJyksXG4gICAgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpLFxuICAgIENvb3JkaW5hdGUgPSByZXF1aXJlKCcuL2Nvb3JkaW5hdGUnKSxcbiAgICB3cmFwID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJykud3JhcCxcbiAgICBpbnRlcnAgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyksXG4gICAgdmVjNCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLnZlYzQsXG4gICAgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG4vKlxuICogQSBzaW5nbGUgdHJhbnNmb3JtLCBnZW5lcmFsbHkgdXNlZCBmb3IgYSBzaW5nbGUgdGlsZSB0byBiZVxuICogc2NhbGVkLCByb3RhdGVkLCBhbmQgem9vbWVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5ab29tXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4Wm9vbVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gVHJhbnNmb3JtKG1pblpvb20sIG1heFpvb20pIHtcbiAgICB0aGlzLnRpbGVTaXplID0gNTEyOyAvLyBjb25zdGFudFxuXG4gICAgdGhpcy5fbWluWm9vbSA9IG1pblpvb20gfHwgMDtcbiAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcblxuICAgIHRoaXMubGF0UmFuZ2UgPSBbLTg1LjA1MTEzLCA4NS4wNTExM107XG5cbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdGhpcy56b29tID0gMDtcbiAgICB0aGlzLmNlbnRlciA9IG5ldyBMYXRMbmcoMCwgMCk7XG4gICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgdGhpcy5fYWx0aXR1ZGUgPSAxLjU7XG4gICAgdGhpcy5fcGl0Y2ggPSAwO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICAgIGdldCBtaW5ab29tKCkgeyByZXR1cm4gdGhpcy5fbWluWm9vbTsgfSxcbiAgICBzZXQgbWluWm9vbSh6b29tKSB7XG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCh0aGlzLnpvb20sIHpvb20pO1xuICAgIH0sXG5cbiAgICBnZXQgbWF4Wm9vbSgpIHsgcmV0dXJuIHRoaXMuX21heFpvb207IH0sXG4gICAgc2V0IG1heFpvb20oem9vbSkge1xuICAgICAgICB0aGlzLl9tYXhab29tID0gem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy56b29tLCB6b29tKTtcbiAgICB9LFxuXG4gICAgZ2V0IHdvcmxkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZVNpemUgKiB0aGlzLnNjYWxlO1xuICAgIH0sXG5cbiAgICBnZXQgY2VudGVyUG9pbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemUuX2RpdigyKTtcbiAgICB9LFxuXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICBnZXQgYmVhcmluZygpIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LFxuICAgIHNldCBiZWFyaW5nKGJlYXJpbmcpIHtcbiAgICAgICAgdGhpcy5hbmdsZSA9IC13cmFwKGJlYXJpbmcsIC0xODAsIDE4MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIH0sXG5cbiAgICBnZXQgcGl0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXRjaCAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcbiAgICBzZXQgcGl0Y2gocGl0Y2gpIHtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBNYXRoLm1pbig2MCwgcGl0Y2gpIC8gMTgwICogTWF0aC5QSTtcbiAgICB9LFxuXG4gICAgZ2V0IGFsdGl0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWx0aXR1ZGU7XG4gICAgfSxcbiAgICBzZXQgYWx0aXR1ZGUoYWx0aXR1ZGUpIHtcbiAgICAgICAgdGhpcy5fYWx0aXR1ZGUgPSBNYXRoLm1heCgwLjc1LCBhbHRpdHVkZSk7XG4gICAgfSxcblxuICAgIGdldCB6b29tKCkgeyByZXR1cm4gdGhpcy5fem9vbTsgfSxcbiAgICBzZXQgem9vbSh6b29tKSB7XG4gICAgICAgIHpvb20gPSBNYXRoLm1pbihNYXRoLm1heCh6b29tLCB0aGlzLm1pblpvb20pLCB0aGlzLm1heFpvb20pO1xuICAgICAgICB0aGlzLl96b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKHpvb20pO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcih6b29tKTtcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6b29tIC0gdGhpcy50aWxlWm9vbTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgfSxcblxuICAgIHpvb21TY2FsZTogZnVuY3Rpb24oem9vbSkgeyByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7IH0sXG4gICAgc2NhbGVab29tOiBmdW5jdGlvbihzY2FsZSkgeyByZXR1cm4gTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjI7IH0sXG5cbiAgICBwcm9qZWN0OiBmdW5jdGlvbihsYXRsbmcsIHdvcmxkU2l6ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxhdGxuZy5sbmcsIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICB0aGlzLmxhdFkobGF0bG5nLmxhdCwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIHVucHJvamVjdDogZnVuY3Rpb24ocG9pbnQsIHdvcmxkU2l6ZSkge1xuICAgICAgICByZXR1cm4gbmV3IExhdExuZyhcbiAgICAgICAgICAgIHRoaXMueUxhdChwb2ludC55LCB3b3JsZFNpemUpLFxuICAgICAgICAgICAgdGhpcy54TG5nKHBvaW50LngsIHdvcmxkU2l6ZSkpO1xuICAgIH0sXG5cbiAgICBnZXQgeCgpIHsgcmV0dXJuIHRoaXMubG5nWCh0aGlzLmNlbnRlci5sbmcpOyB9LFxuICAgIGdldCB5KCkgeyByZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCk7IH0sXG5cbiAgICBnZXQgcG9pbnQoKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgLyoqXG4gICAgICogbGF0L2xvbiA8LT4gYWJzb2x1dGUgcGl4ZWwgY29vcmRzIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3b3JsZFNpemU9dGhpcy53b3JsZFNpemVdXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG5nWDogZnVuY3Rpb24obG9uLCB3b3JsZFNpemUpIHtcbiAgICAgICAgcmV0dXJuICgxODAgKyBsb24pICogKHdvcmxkU2l6ZSB8fCB0aGlzLndvcmxkU2l6ZSkgLyAzNjA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBsYXRpdHVkZSB0byBhYnNvbHV0ZSB5IGNvb3JkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGF0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3b3JsZFNpemU9dGhpcy53b3JsZFNpemVdXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbGF0WTogZnVuY3Rpb24obGF0LCB3b3JsZFNpemUpIHtcbiAgICAgICAgdmFyIHkgPSAxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSk7XG4gICAgICAgIHJldHVybiAoMTgwIC0geSkgKiAod29ybGRTaXplIHx8IHRoaXMud29ybGRTaXplKSAvIDM2MDtcbiAgICB9LFxuXG4gICAgeExuZzogZnVuY3Rpb24oeCwgd29ybGRTaXplKSB7XG4gICAgICAgIHJldHVybiB4ICogMzYwIC8gKHdvcmxkU2l6ZSB8fCB0aGlzLndvcmxkU2l6ZSkgLSAxODA7XG4gICAgfSxcbiAgICB5TGF0OiBmdW5jdGlvbih5LCB3b3JsZFNpemUpIHtcbiAgICAgICAgdmFyIHkyID0gMTgwIC0geSAqIDM2MCAvICh3b3JsZFNpemUgfHwgdGhpcy53b3JsZFNpemUpO1xuICAgICAgICByZXR1cm4gMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwO1xuICAgIH0sXG5cbiAgICBwYW5CeTogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuY2VudGVyUG9pbnQuX2FkZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMucG9pbnRMb2NhdGlvbihwb2ludCk7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgIH0sXG5cbiAgICBzZXRMb2NhdGlvbkF0UG9pbnQ6IGZ1bmN0aW9uKGxhdGxuZywgcG9pbnQpIHtcbiAgICAgICAgdmFyIGMgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsYXRsbmcpO1xuICAgICAgICB2YXIgY29vcmRBdFBvaW50ID0gdGhpcy5wb2ludENvb3JkaW5hdGUocG9pbnQpO1xuICAgICAgICB2YXIgY29vcmRDZW50ZXIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KTtcblxuICAgICAgICB2YXIgdHJhbnNsYXRlID0gY29vcmRBdFBvaW50Ll9zdWIoYyk7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24oY29vcmRDZW50ZXIuX3N1Yih0cmFuc2xhdGUpKTtcblxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICB9LFxuXG4gICAgc2V0Wm9vbUFyb3VuZDogZnVuY3Rpb24oem9vbSwgY2VudGVyKSB7XG4gICAgICAgIHZhciBwO1xuICAgICAgICBpZiAoY2VudGVyKSBwID0gdGhpcy5sb2NhdGlvblBvaW50KGNlbnRlcik7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIGlmIChjZW50ZXIpIHRoaXMuc2V0TG9jYXRpb25BdFBvaW50KGNlbnRlciwgcCk7XG4gICAgfSxcblxuICAgIHNldEJlYXJpbmdBcm91bmQ6IGZ1bmN0aW9uKGJlYXJpbmcsIGNlbnRlcikge1xuICAgICAgICB2YXIgcDtcbiAgICAgICAgaWYgKGNlbnRlcikgcCA9IHRoaXMubG9jYXRpb25Qb2ludChjZW50ZXIpO1xuICAgICAgICB0aGlzLmJlYXJpbmcgPSBiZWFyaW5nO1xuICAgICAgICBpZiAoY2VudGVyKSB0aGlzLnNldExvY2F0aW9uQXRQb2ludChjZW50ZXIsIHApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGxvY2F0aW9uLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZyBsb2NhdGlvblxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50OiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxhdGxuZykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsYXRsbmdcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHNjcmVlbiBwb2ludFxuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9IGxhdGxuZyBsb2NhdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcG9pbnRMb2NhdGlvbjogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5wb2ludENvb3JkaW5hdGUocCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsYXRsbmcsIHJldHVybiBhbiB1bnJvdW5kZWRcbiAgICAgKiBjb29yZGluYXRlIHRoYXQgcmVwcmVzZW50cyBpdCBhdCB0aGlzIHRyYW5zZm9ybSdzIHpvb20gbGV2ZWwgYW5kXG4gICAgICogd29ybGRzaXplLlxuICAgICAqIEBwYXJhbSB7TGF0TG5nfSBsYXRsbmdcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZTogZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgIHZhciBrID0gdGhpcy56b29tU2NhbGUodGhpcy50aWxlWm9vbSkgLyB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxhdGxuZy5sbmcpICogayxcbiAgICAgICAgICAgIHRoaXMubGF0WShsYXRsbmcubGF0KSAqIGssXG4gICAgICAgICAgICB0aGlzLnRpbGVab29tKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBDb29yZGluYXRlLCByZXR1cm4gaXRzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge0xhdExuZ30gbGF0bG5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb29yZGluYXRlTG9jYXRpb246IGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgIHZhciB3b3JsZFNpemUgPSB0aGlzLnpvb21TY2FsZShjb29yZC56b29tKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmcoXG4gICAgICAgICAgICB0aGlzLnlMYXQoY29vcmQucm93LCB3b3JsZFNpemUpLFxuICAgICAgICAgICAgdGhpcy54TG5nKGNvb3JkLmNvbHVtbiwgd29ybGRTaXplKSk7XG4gICAgfSxcblxuICAgIHBvaW50Q29vcmRpbmF0ZTogZnVuY3Rpb24ocCwgdGFyZ2V0Wikge1xuXG4gICAgICAgIGlmICh0YXJnZXRaID09PSB1bmRlZmluZWQpIHRhcmdldFogPSAwO1xuXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKTtcbiAgICAgICAgdmFyIGludmVydGVkID0gbWF0NC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIG1hdHJpeCk7XG5cbiAgICAgICAgaWYgKCFpbnZlcnRlZCkgdGhyb3cgXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiO1xuXG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3QgcHJvamVjdGVkIHogdmFsdWUgZm9yIHRoZSBwb2ludCxcbiAgICAgICAgLy8gdW5wcm9qZWN0IHR3byBwb2ludHMgdG8gZ2V0IGEgbGluZSBhbmQgdGhlbiBmaW5kIHRoZSBwb2ludCBvbiB0aGF0XG4gICAgICAgIC8vIGxpbmUgd2l0aCB6PTBcblxuICAgICAgICB2YXIgY29vcmQwID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIDAsIDFdLCBpbnZlcnRlZCk7XG4gICAgICAgIHZhciBjb29yZDEgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgMSwgMV0sIGludmVydGVkKTtcblxuICAgICAgICB2YXIgdzAgPSBjb29yZDBbM107XG4gICAgICAgIHZhciB3MSA9IGNvb3JkMVszXTtcbiAgICAgICAgdmFyIHgwID0gY29vcmQwWzBdIC8gdzA7XG4gICAgICAgIHZhciB4MSA9IGNvb3JkMVswXSAvIHcxO1xuICAgICAgICB2YXIgeTAgPSBjb29yZDBbMV0gLyB3MDtcbiAgICAgICAgdmFyIHkxID0gY29vcmQxWzFdIC8gdzE7XG4gICAgICAgIHZhciB6MCA9IGNvb3JkMFsyXSAvIHcwO1xuICAgICAgICB2YXIgejEgPSBjb29yZDFbMl0gLyB3MTtcblxuXG4gICAgICAgIHZhciB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycCh4MCwgeDEsIHQpLFxuICAgICAgICAgICAgaW50ZXJwKHkwLCB5MSwgdCksXG4gICAgICAgICAgICB0aGlzLnRpbGVab29tKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb29yZGluYXRlUG9pbnQ6IGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeChjb29yZC56b29tKTtcbiAgICAgICAgdmFyIHAgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtjb29yZC5jb2x1bW4sIGNvb3JkLnJvdywgMCwgMV0sIG1hdHJpeCk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQocFswXSAvIHBbM10sIHBbMV0gLyBwWzNdKTtcbiAgICB9LFxuXG4gICAgY29vcmRpbmF0ZVBvaW50TWF0cml4OiBmdW5jdGlvbih6KSB7XG4gICAgICAgIHZhciBwcm9qID0gdGhpcy5nZXRQcm9qTWF0cml4KCk7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMud29ybGRTaXplIC8gdGhpcy56b29tU2NhbGUoeik7XG4gICAgICAgIG1hdDQuc2NhbGUocHJvaiwgcHJvaiwgW3NjYWxlLCBzY2FsZSwgMV0pO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHByb2osIHRoaXMuZ2V0UGl4ZWxNYXRyaXgoKSwgcHJvaik7XG4gICAgICAgIHJldHVybiBwcm9qO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBnbCBjb29yZGluYXRlcyAtMS4uMSB0byBwaXhlbHMgMC4ud2lkdGhcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBtYXRyaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFBpeGVsTWF0cml4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFt0aGlzLndpZHRoIC8gMiwgLXRoaXMuaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfSxcblxuICAgIF9jb25zdHJhaW46IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2VudGVyKSByZXR1cm47XG5cbiAgICAgICAgdmFyIG1pblksIG1heFksIG1pblgsIG1heFgsIHN5LCBzeCwgeDIsIHkyLFxuICAgICAgICAgICAgc2l6ZSA9IHRoaXMuc2l6ZTtcblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgbWluWSA9IHRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKTtcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLmxhdFkodGhpcy5sYXRSYW5nZVswXSk7XG4gICAgICAgICAgICBzeSA9IG1heFkgLSBtaW5ZIDwgc2l6ZS55ID8gc2l6ZS55IC8gKG1heFkgLSBtaW5ZKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgbWluWCA9IHRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKTtcbiAgICAgICAgICAgIG1heFggPSB0aGlzLmxuZ1godGhpcy5sbmdSYW5nZVsxXSk7XG4gICAgICAgICAgICBzeCA9IG1heFggLSBtaW5YIDwgc2l6ZS54ID8gc2l6ZS54IC8gKG1heFggLSBtaW5YKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBob3cgbXVjaCB0aGUgbWFwIHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIHNjcmVlbiBpbnRvIGdpdmVuIGxhdGl0dWRlL2xvbmdpdHVkZSByYW5nZXNcbiAgICAgICAgdmFyIHMgPSBNYXRoLm1heChzeCB8fCAwLCBzeSB8fCAwKTtcblxuICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgc3ggPyAobWF4WCArIG1pblgpIC8gMiA6IHRoaXMueCxcbiAgICAgICAgICAgICAgICBzeSA/IChtYXhZICsgbWluWSkgLyAyIDogdGhpcy55KSk7XG4gICAgICAgICAgICB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20ocyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgdmFyIHkgPSB0aGlzLnksXG4gICAgICAgICAgICAgICAgaDIgPSBzaXplLnkgLyAyO1xuXG4gICAgICAgICAgICBpZiAoeSAtIGgyIDwgbWluWSkgeTIgPSBtaW5ZICsgaDI7XG4gICAgICAgICAgICBpZiAoeSArIGgyID4gbWF4WSkgeTIgPSBtYXhZIC0gaDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgdmFyIHggPSB0aGlzLngsXG4gICAgICAgICAgICAgICAgdzIgPSBzaXplLnggLyAyO1xuXG4gICAgICAgICAgICBpZiAoeCAtIHcyIDwgbWluWCkgeDIgPSBtaW5YICsgdzI7XG4gICAgICAgICAgICBpZiAoeCArIHcyID4gbWF4WCkgeDIgPSBtYXhYIC0gdzI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW4gdGhlIG1hcCBpZiB0aGUgc2NyZWVuIGdvZXMgb2ZmIHRoZSByYW5nZVxuICAgICAgICBpZiAoeDIgIT09IHVuZGVmaW5lZCB8fCB5MiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICB4MiAhPT0gdW5kZWZpbmVkID8geDIgOiB0aGlzLngsXG4gICAgICAgICAgICAgICAgeTIgIT09IHVuZGVmaW5lZCA/IHkyIDogdGhpcy55KSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0UHJvak1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IHRvIHRoZSBjZW50ZXIgdG9wIGluIGFsdGl0dWRlIHVuaXRzIHVzaW5nIGxhdyBvZiBzaW5lcy5cbiAgICAgICAgdmFyIGhhbGZGb3YgPSBNYXRoLmF0YW4oMC41IC8gdGhpcy5hbHRpdHVkZSk7XG4gICAgICAgIHZhciB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oaGFsZkZvdikgKiB0aGlzLmFsdGl0dWRlIC8gTWF0aC5zaW4oTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCAtIGhhbGZGb3YpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgeiB2YWx1ZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAgICAgIHZhciBmYXJaID0gTWF0aC5jb3MoTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCkgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgdGhpcy5hbHRpdHVkZTtcblxuICAgICAgICBtYXQ0LnBlcnNwZWN0aXZlKG0sIDIgKiBNYXRoLmF0YW4oKHRoaXMuaGVpZ2h0IC8gMikgLyB0aGlzLmFsdGl0dWRlKSwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCAwLjEsIGZhclopO1xuXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFswLCAwLCAtdGhpcy5hbHRpdHVkZV0pO1xuXG4gICAgICAgIC8vIEFmdGVyIHRoZSByb3RhdGVYLCB6IHZhbHVlcyBhcmUgaW4gcGl4ZWwgdW5pdHMuIENvbnZlcnQgdGhlbSB0b1xuICAgICAgICAvLyBhbHRpdHVkZSB1bml0ZXMuIDEgYWx0aXR1ZGUgdW5pdCA9IHRoZSBzY3JlZW4gaGVpZ2h0LlxuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAtMSwgMSAvIHRoaXMuaGVpZ2h0XSk7XG5cbiAgICAgICAgbWF0NC5yb3RhdGVYKG0sIG0sIHRoaXMuX3BpdGNoKTtcbiAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRoaXMuYW5nbGUpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLXRoaXMueCwgLXRoaXMueSwgMF0pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBGb250IGRhdGEgRnJvbSBIZXJzaGV5IFNpbXBsZXggRm9udFxuLy8gaHR0cDovL3BhdWxib3Vya2UubmV0L2RhdGFmb3JtYXRzL2hlcnNoZXkvXG52YXIgc2ltcGxleEZvbnQgPSB7XG4gICAgXCIgXCI6IFsxNiwgW11dLFxuICAgIFwiIVwiOiBbMTAsIFs1LCAyMSwgNSwgNywgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCJcXFwiXCI6IFsxNiwgWzQsIDIxLCA0LCAxNCwgLTEsIC0xLCAxMiwgMjEsIDEyLCAxNF1dLFxuICAgIFwiI1wiOiBbMjEsIFsxMSwgMjUsIDQsIC03LCAtMSwgLTEsIDE3LCAyNSwgMTAsIC03LCAtMSwgLTEsIDQsIDEyLCAxOCwgMTIsIC0xLCAtMSwgMywgNiwgMTcsIDZdXSxcbiAgICBcIiRcIjogWzIwLCBbOCwgMjUsIDgsIC00LCAtMSwgLTEsIDEyLCAyNSwgMTIsIC00LCAtMSwgLTEsIDE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIiVcIjogWzI0LCBbMjEsIDIxLCAzLCAwLCAtMSwgLTEsIDgsIDIxLCAxMCwgMTksIDEwLCAxNywgOSwgMTUsIDcsIDE0LCA1LCAxNCwgMywgMTYsIDMsIDE4LCA0LCAyMCwgNiwgMjEsIDgsIDIxLCAxMCwgMjAsIDEzLCAxOSwgMTYsIDE5LCAxOSwgMjAsIDIxLCAyMSwgLTEsIC0xLCAxNywgNywgMTUsIDYsIDE0LCA0LCAxNCwgMiwgMTYsIDAsIDE4LCAwLCAyMCwgMSwgMjEsIDMsIDIxLCA1LCAxOSwgNywgMTcsIDddXSxcbiAgICBcIiZcIjogWzI2LCBbMjMsIDEyLCAyMywgMTMsIDIyLCAxNCwgMjEsIDE0LCAyMCwgMTMsIDE5LCAxMSwgMTcsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDcsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDYsIDQsIDgsIDUsIDksIDEyLCAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LCAxOCwgMTMsIDIwLCAxMSwgMjEsIDksIDIwLCA4LCAxOCwgOCwgMTYsIDksIDEzLCAxMSwgMTAsIDE2LCAzLCAxOCwgMSwgMjAsIDAsIDIyLCAwLCAyMywgMSwgMjMsIDJdXSxcbiAgICBcIidcIjogWzEwLCBbNSwgMTksIDQsIDIwLCA1LCAyMSwgNiwgMjAsIDYsIDE4LCA1LCAxNiwgNCwgMTVdXSxcbiAgICBcIihcIjogWzE0LCBbMTEsIDI1LCA5LCAyMywgNywgMjAsIDUsIDE2LCA0LCAxMSwgNCwgNywgNSwgMiwgNywgLTIsIDksIC01LCAxMSwgLTddXSxcbiAgICBcIilcIjogWzE0LCBbMywgMjUsIDUsIDIzLCA3LCAyMCwgOSwgMTYsIDEwLCAxMSwgMTAsIDcsIDksIDIsIDcsIC0yLCA1LCAtNSwgMywgLTddXSxcbiAgICBcIipcIjogWzE2LCBbOCwgMjEsIDgsIDksIC0xLCAtMSwgMywgMTgsIDEzLCAxMiwgLTEsIC0xLCAxMywgMTgsIDMsIDEyXV0sXG4gICAgXCIrXCI6IFsyNiwgWzEzLCAxOCwgMTMsIDAsIC0xLCAtMSwgNCwgOSwgMjIsIDldXSxcbiAgICBcIixcIjogWzEwLCBbNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiLVwiOiBbMjYsIFs0LCA5LCAyMiwgOV1dLFxuICAgIFwiLlwiOiBbMTAsIFs1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCIvXCI6IFsyMiwgWzIwLCAyNSwgMiwgLTddXSxcbiAgICBcIjBcIjogWzIwLCBbOSwgMjEsIDYsIDIwLCA0LCAxNywgMywgMTIsIDMsIDksIDQsIDQsIDYsIDEsIDksIDAsIDExLCAwLCAxNCwgMSwgMTYsIDQsIDE3LCA5LCAxNywgMTIsIDE2LCAxNywgMTQsIDIwLCAxMSwgMjEsIDksIDIxXV0sXG4gICAgXCIxXCI6IFsyMCwgWzYsIDE3LCA4LCAxOCwgMTEsIDIxLCAxMSwgMF1dLFxuICAgIFwiMlwiOiBbMjAsIFs0LCAxNiwgNCwgMTcsIDUsIDE5LCA2LCAyMCwgOCwgMjEsIDEyLCAyMSwgMTQsIDIwLCAxNSwgMTksIDE2LCAxNywgMTYsIDE1LCAxNSwgMTMsIDEzLCAxMCwgMywgMCwgMTcsIDBdXSxcbiAgICBcIjNcIjogWzIwLCBbNSwgMjEsIDE2LCAyMSwgMTAsIDEzLCAxMywgMTMsIDE1LCAxMiwgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjRcIjogWzIwLCBbMTMsIDIxLCAzLCA3LCAxOCwgNywgLTEsIC0xLCAxMywgMjEsIDEzLCAwXV0sXG4gICAgXCI1XCI6IFsyMCwgWzE1LCAyMSwgNSwgMjEsIDQsIDEyLCA1LCAxMywgOCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNlwiOiBbMjAsIFsxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCAxMCwgMjEsIDcsIDIwLCA1LCAxNywgNCwgMTIsIDQsIDcsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMSwgMCwgMTQsIDEsIDE2LCAzLCAxNywgNiwgMTcsIDcsIDE2LCAxMCwgMTQsIDEyLCAxMSwgMTMsIDEwLCAxMywgNywgMTIsIDUsIDEwLCA0LCA3XV0sXG4gICAgXCI3XCI6IFsyMCwgWzE3LCAyMSwgNywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxXV0sXG4gICAgXCI4XCI6IFsyMCwgWzgsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNCwgNywgMTMsIDExLCAxMiwgMTQsIDExLCAxNiwgOSwgMTcsIDcsIDE3LCA0LCAxNiwgMiwgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA3LCA0LCA5LCA2LCAxMSwgOSwgMTIsIDEzLCAxMywgMTUsIDE0LCAxNiwgMTYsIDE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxXV0sXG4gICAgXCI5XCI6IFsyMCwgWzE2LCAxNCwgMTUsIDExLCAxMywgOSwgMTAsIDgsIDksIDgsIDYsIDksIDQsIDExLCAzLCAxNCwgMywgMTUsIDQsIDE4LCA2LCAyMCwgOSwgMjEsIDEwLCAyMSwgMTMsIDIwLCAxNSwgMTgsIDE2LCAxNCwgMTYsIDksIDE1LCA0LCAxMywgMSwgMTAsIDAsIDgsIDAsIDUsIDEsIDQsIDNdXSxcbiAgICBcIjpcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIjtcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIjxcIjogWzI0LCBbMjAsIDE4LCA0LCA5LCAyMCwgMF1dLFxuICAgIFwiPVwiOiBbMjYsIFs0LCAxMiwgMjIsIDEyLCAtMSwgLTEsIDQsIDYsIDIyLCA2XV0sXG4gICAgXCI+XCI6IFsyNCwgWzQsIDE4LCAyMCwgOSwgNCwgMF1dLFxuICAgIFwiP1wiOiBbMTgsIFszLCAxNiwgMywgMTcsIDQsIDE5LCA1LCAyMCwgNywgMjEsIDExLCAyMSwgMTMsIDIwLCAxNCwgMTksIDE1LCAxNywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgOSwgMTAsIDksIDcsIC0xLCAtMSwgOSwgMiwgOCwgMSwgOSwgMCwgMTAsIDEsIDksIDJdXSxcbiAgICBcIkBcIjogWzI3LCBbMTgsIDEzLCAxNywgMTUsIDE1LCAxNiwgMTIsIDE2LCAxMCwgMTUsIDksIDE0LCA4LCAxMSwgOCwgOCwgOSwgNiwgMTEsIDUsIDE0LCA1LCAxNiwgNiwgMTcsIDgsIC0xLCAtMSwgMTIsIDE2LCAxMCwgMTQsIDksIDExLCA5LCA4LCAxMCwgNiwgMTEsIDUsIC0xLCAtMSwgMTgsIDE2LCAxNywgOCwgMTcsIDYsIDE5LCA1LCAyMSwgNSwgMjMsIDcsIDI0LCAxMCwgMjQsIDEyLCAyMywgMTUsIDIyLCAxNywgMjAsIDE5LCAxOCwgMjAsIDE1LCAyMSwgMTIsIDIxLCA5LCAyMCwgNywgMTksIDUsIDE3LCA0LCAxNSwgMywgMTIsIDMsIDksIDQsIDYsIDUsIDQsIDcsIDIsIDksIDEsIDEyLCAwLCAxNSwgMCwgMTgsIDEsIDIwLCAyLCAyMSwgMywgLTEsIC0xLCAxOSwgMTYsIDE4LCA4LCAxOCwgNiwgMTksIDVdXSxcbiAgICBcIkFcIjogWzE4LCBbOSwgMjEsIDEsIDAsIC0xLCAtMSwgOSwgMjEsIDE3LCAwLCAtMSwgLTEsIDQsIDcsIDE0LCA3XV0sXG4gICAgXCJCXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgLTEsIC0xLCA0LCAxMSwgMTMsIDExLCAxNiwgMTAsIDE3LCA5LCAxOCwgNywgMTgsIDQsIDE3LCAyLCAxNiwgMSwgMTMsIDAsIDQsIDBdXSxcbiAgICBcIkNcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1XV0sXG4gICAgXCJEXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMSwgMjEsIDE0LCAyMCwgMTYsIDE4LCAxNywgMTYsIDE4LCAxMywgMTgsIDgsIDE3LCA1LCAxNiwgMywgMTQsIDEsIDExLCAwLCA0LCAwXV0sXG4gICAgXCJFXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMSwgLTEsIC0xLCA0LCAwLCAxNywgMF1dLFxuICAgIFwiRlwiOiBbMTgsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTFdXSxcbiAgICBcIkdcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOCwgOCwgLTEsIC0xLCAxMywgOCwgMTgsIDhdXSxcbiAgICBcIkhcIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMCwgLTEsIC0xLCA0LCAxMSwgMTgsIDExXV0sXG4gICAgXCJJXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIkpcIjogWzE2LCBbMTIsIDIxLCAxMiwgNSwgMTEsIDIsIDEwLCAxLCA4LCAwLCA2LCAwLCA0LCAxLCAzLCAyLCAyLCA1LCAyLCA3XV0sXG4gICAgXCJLXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgNCwgNywgLTEsIC0xLCA5LCAxMiwgMTgsIDBdXSxcbiAgICBcIkxcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMCwgMTYsIDBdXSxcbiAgICBcIk1cIjogWzI0LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAyMCwgMF1dLFxuICAgIFwiTlwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTgsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMF1dLFxuICAgIFwiT1wiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxXV0sXG4gICAgXCJQXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNCwgMTcsIDEyLCAxNiwgMTEsIDEzLCAxMCwgNCwgMTBdXSxcbiAgICBcIlFcIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgLTEsIC0xLCAxMiwgNCwgMTgsIC0yXV0sXG4gICAgXCJSXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgNCwgMTEsIC0xLCAtMSwgMTEsIDExLCAxOCwgMF1dLFxuICAgIFwiU1wiOiBbMjAsIFsxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCJUXCI6IFsxNiwgWzgsIDIxLCA4LCAwLCAtMSwgLTEsIDEsIDIxLCAxNSwgMjFdXSxcbiAgICBcIlVcIjogWzIyLCBbNCwgMjEsIDQsIDYsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMiwgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNiwgMTgsIDIxXV0sXG4gICAgXCJWXCI6IFsxOCwgWzEsIDIxLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMF1dLFxuICAgIFwiV1wiOiBbMjQsIFsyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCAxNywgMCwgLTEsIC0xLCAyMiwgMjEsIDE3LCAwXV0sXG4gICAgXCJYXCI6IFsyMCwgWzMsIDIxLCAxNywgMCwgLTEsIC0xLCAxNywgMjEsIDMsIDBdXSxcbiAgICBcIllcIjogWzE4LCBbMSwgMjEsIDksIDExLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMTFdXSxcbiAgICBcIlpcIjogWzIwLCBbMTcsIDIxLCAzLCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjEsIC0xLCAtMSwgMywgMCwgMTcsIDBdXSxcbiAgICBcIltcIjogWzE0LCBbNCwgMjUsIDQsIC03LCAtMSwgLTEsIDUsIDI1LCA1LCAtNywgLTEsIC0xLCA0LCAyNSwgMTEsIDI1LCAtMSwgLTEsIDQsIC03LCAxMSwgLTddXSxcbiAgICBcIlxcXFxcIjogWzE0LCBbMCwgMjEsIDE0LCAtM11dLFxuICAgIFwiXVwiOiBbMTQsIFs5LCAyNSwgOSwgLTcsIC0xLCAtMSwgMTAsIDI1LCAxMCwgLTcsIC0xLCAtMSwgMywgMjUsIDEwLCAyNSwgLTEsIC0xLCAzLCAtNywgMTAsIC03XV0sXG4gICAgXCJeXCI6IFsxNiwgWzYsIDE1LCA4LCAxOCwgMTAsIDE1LCAtMSwgLTEsIDMsIDEyLCA4LCAxNywgMTMsIDEyLCAtMSwgLTEsIDgsIDE3LCA4LCAwXV0sXG4gICAgXCJfXCI6IFsxNiwgWzAsIC0yLCAxNiwgLTJdXSxcbiAgICBcImBcIjogWzEwLCBbNiwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE1LCA2LCAxNiwgNSwgMTddXSxcbiAgICBcImFcIjogWzE5LCBbMTUsIDE0LCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJiXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwiY1wiOiBbMTgsIFsxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJkXCI6IFsxOSwgWzE1LCAyMSwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZVwiOiBbMTgsIFszLCA4LCAxNSwgOCwgMTUsIDEwLCAxNCwgMTIsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJmXCI6IFsxMiwgWzEwLCAyMSwgOCwgMjEsIDYsIDIwLCA1LCAxNywgNSwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcImdcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTIsIDE0LCAtNSwgMTMsIC02LCAxMSwgLTcsIDgsIC03LCA2LCAtNiwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJoXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJpXCI6IFs4LCBbMywgMjEsIDQsIDIwLCA1LCAyMSwgNCwgMjIsIDMsIDIxLCAtMSwgLTEsIDQsIDE0LCA0LCAwXV0sXG4gICAgXCJqXCI6IFsxMCwgWzUsIDIxLCA2LCAyMCwgNywgMjEsIDYsIDIyLCA1LCAyMSwgLTEsIC0xLCA2LCAxNCwgNiwgLTMsIDUsIC02LCAzLCAtNywgMSwgLTddXSxcbiAgICBcImtcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTQsIDE0LCA0LCA0LCAtMSwgLTEsIDgsIDgsIDE1LCAwXV0sXG4gICAgXCJsXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIm1cIjogWzMwLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDAsIC0xLCAtMSwgMTUsIDEwLCAxOCwgMTMsIDIwLCAxNCwgMjMsIDE0LCAyNSwgMTMsIDI2LCAxMCwgMjYsIDBdXSxcbiAgICBcIm5cIjogWzE5LCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcIm9cIjogWzE5LCBbOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgMywgMTYsIDYsIDE2LCA4LCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNF1dLFxuICAgIFwicFwiOiBbMTksIFs0LCAxNCwgNCwgLTcsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJxXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC03LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcInJcIjogWzEzLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgOCwgNSwgMTEsIDcsIDEzLCA5LCAxNCwgMTIsIDE0XV0sXG4gICAgXCJzXCI6IFsxNywgWzE0LCAxMSwgMTMsIDEzLCAxMCwgMTQsIDcsIDE0LCA0LCAxMywgMywgMTEsIDQsIDksIDYsIDgsIDExLCA3LCAxMywgNiwgMTQsIDQsIDE0LCAzLCAxMywgMSwgMTAsIDAsIDcsIDAsIDQsIDEsIDMsIDNdXSxcbiAgICBcInRcIjogWzEyLCBbNSwgMjEsIDUsIDQsIDYsIDEsIDgsIDAsIDEwLCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwidVwiOiBbMTksIFs0LCAxNCwgNCwgNCwgNSwgMSwgNywgMCwgMTAsIDAsIDEyLCAxLCAxNSwgNCwgLTEsIC0xLCAxNSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ2XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMF1dLFxuICAgIFwid1wiOiBbMjIsIFszLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCAxNSwgMCwgLTEsIC0xLCAxOSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ4XCI6IFsxNywgWzMsIDE0LCAxNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDMsIDBdXSxcbiAgICBcInlcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwLCA2LCAtNCwgNCwgLTYsIDIsIC03LCAxLCAtN11dLFxuICAgIFwielwiOiBbMTcsIFsxNCwgMTQsIDMsIDAsIC0xLCAtMSwgMywgMTQsIDE0LCAxNCwgLTEsIC0xLCAzLCAwLCAxNCwgMF1dLFxuICAgIFwie1wiOiBbMTQsIFs5LCAyNSwgNywgMjQsIDYsIDIzLCA1LCAyMSwgNSwgMTksIDYsIDE3LCA3LCAxNiwgOCwgMTQsIDgsIDEyLCA2LCAxMCwgLTEsIC0xLCA3LCAyNCwgNiwgMjIsIDYsIDIwLCA3LCAxOCwgOCwgMTcsIDksIDE1LCA5LCAxMywgOCwgMTEsIDQsIDksIDgsIDcsIDksIDUsIDksIDMsIDgsIDEsIDcsIDAsIDYsIC0yLCA2LCAtNCwgNywgLTYsIC0xLCAtMSwgNiwgOCwgOCwgNiwgOCwgNCwgNywgMiwgNiwgMSwgNSwgLTEsIDUsIC0zLCA2LCAtNSwgNywgLTYsIDksIC03XV0sXG4gICAgXCJ8XCI6IFs4LCBbNCwgMjUsIDQsIC03XV0sXG4gICAgXCJ9XCI6IFsxNCwgWzUsIDI1LCA3LCAyNCwgOCwgMjMsIDksIDIxLCA5LCAxOSwgOCwgMTcsIDcsIDE2LCA2LCAxNCwgNiwgMTIsIDgsIDEwLCAtMSwgLTEsIDcsIDI0LCA4LCAyMiwgOCwgMjAsIDcsIDE4LCA2LCAxNywgNSwgMTUsIDUsIDEzLCA2LCAxMSwgMTAsIDksIDYsIDcsIDUsIDUsIDUsIDMsIDYsIDEsIDcsIDAsIDgsIC0yLCA4LCAtNCwgNywgLTYsIC0xLCAtMSwgOCwgOCwgNiwgNiwgNiwgNCwgNywgMiwgOCwgMSwgOSwgLTEsIDksIC0zLCA4LCAtNSwgNywgLTYsIDUsIC03XV0sXG4gICAgXCJ+XCI6IFsyNCwgWzMsIDYsIDMsIDgsIDQsIDExLCA2LCAxMiwgOCwgMTIsIDEwLCAxMSwgMTQsIDgsIDE2LCA3LCAxOCwgNywgMjAsIDgsIDIxLCAxMCwgLTEsIC0xLCAzLCA4LCA0LCAxMCwgNiwgMTEsIDgsIDExLCAxMCwgMTAsIDE0LCA3LCAxNiwgNiwgMTgsIDYsIDIwLCA3LCAyMSwgMTAsIDIxLCAxMl1dXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRleHRWZXJ0aWNlcyh0ZXh0LCBsZWZ0LCBiYXNlbGluZSwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDE7XG5cbiAgICB2YXIgc3Ryb2tlcyA9IFtdLFxuICAgICAgICBpLCBsZW4sIGosIGxlbjIsIGdseXBoLCB4LCB5LCBwcmV2O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBnbHlwaCA9IHNpbXBsZXhGb250W3RleHRbaV1dO1xuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMiA9IGdseXBoWzFdLmxlbmd0aDsgaiA8IGxlbjI7IGogKz0gMikge1xuICAgICAgICAgICAgaWYgKGdseXBoWzFdW2pdID09PSAtMSAmJiBnbHlwaFsxXVtqICsgMV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBnbHlwaFsxXVtqXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHkgPSBiYXNlbGluZSAtIGdseXBoWzFdW2ogKyAxXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZXMucHVzaChwcmV2LngsIHByZXYueSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSB7eDogeCwgeTogeX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGVmdCArPSBnbHlwaFswXSAqIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJva2VzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBtYXBib3hnbCBpcyBhIEEgV2ViR0wgSmF2YVNjcmlwdCBpbnRlcmFjdGl2ZSBtYXBzIGxpYnJhcnkgdGhhdCBjYW4gcmVuZGVyXG4gKiBbTWFwYm94IHZlY3RvciB0aWxlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL3ZlY3Rvci10aWxlcy8pLlxuICpcbiAqIEBtb2R1bGUgbWFwYm94Z2xcbiAqIEBzdW1tYXJ5IFdlYkdMIEphdmFTY3JpcHQgbWFwIGxpYnJhcnlcbiAqL1xuXG4vLyBqc2hpbnQgLVcwNzlcbnZhciBtYXBib3hnbCA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbm1hcGJveGdsLk1hcCA9IHJlcXVpcmUoJy4vdWkvbWFwJyk7XG5tYXBib3hnbC5OYXZpZ2F0aW9uID0gcmVxdWlyZSgnLi91aS9jb250cm9sL25hdmlnYXRpb24nKTtcbm1hcGJveGdsLkF0dHJpYnV0aW9uID0gcmVxdWlyZSgnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uJyk7XG5tYXBib3hnbC5Qb3B1cCA9IHJlcXVpcmUoJy4vdWkvcG9wdXAnKTtcblxubWFwYm94Z2wuR2VvSlNPTlNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlL2dlb2pzb25fc291cmNlJyk7XG5tYXBib3hnbC5WaWRlb1NvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlL3ZpZGVvX3NvdXJjZScpO1xuXG5tYXBib3hnbC5TdHlsZSA9IHJlcXVpcmUoJy4vc3R5bGUvc3R5bGUnKTtcblxubWFwYm94Z2wuTGF0TG5nID0gcmVxdWlyZSgnLi9nZW8vbGF0X2xuZycpO1xubWFwYm94Z2wuTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi9nZW8vbGF0X2xuZ19ib3VuZHMnKTtcbm1hcGJveGdsLlBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubWFwYm94Z2wuRXZlbnRlZCA9IHJlcXVpcmUoJy4vdXRpbC9ldmVudGVkJyk7XG5tYXBib3hnbC51dGlsID0gcmVxdWlyZSgnLi91dGlsL3V0aWwnKTtcblxubWFwYm94Z2wuc3VwcG9ydGVkID0gcmVxdWlyZSgnLi91dGlsL2Jyb3dzZXInKS5zdXBwb3J0ZWQ7XG5cbnZhciBhamF4ID0gcmVxdWlyZSgnLi91dGlsL2FqYXgnKTtcbm1hcGJveGdsLnV0aWwuZ2V0SlNPTiA9IGFqYXguZ2V0SlNPTjtcbm1hcGJveGdsLnV0aWwuZ2V0QXJyYXlCdWZmZXIgPSBhamF4LmdldEFycmF5QnVmZmVyO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi91dGlsL2NvbmZpZycpO1xubWFwYm94Z2wuY29uZmlnID0gY29uZmlnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobWFwYm94Z2wsICdhY2Nlc3NUb2tlbicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29uZmlnLkFDQ0VTU19UT0tFTjsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHRva2VuKSB7IGNvbmZpZy5BQ0NFU1NfVE9LRU4gPSB0b2tlbjsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtYXQzID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0MztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3QmFja2dyb3VuZDtcblxuZnVuY3Rpb24gZHJhd0JhY2tncm91bmQocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCkge1xuICAgIHZhciBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgdmFyIGNvbG9yID0gbGF5ZXIucGFpbnRbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICB2YXIgaW1hZ2UgPSBsYXllci5wYWludFsnYmFja2dyb3VuZC1pbWFnZSddO1xuICAgIHZhciBvcGFjaXR5ID0gbGF5ZXIucGFpbnRbJ2JhY2tncm91bmQtb3BhY2l0eSddO1xuICAgIHZhciBzaGFkZXI7XG5cbiAgICB2YXIgaW1hZ2VQb3NBID0gaW1hZ2UgPyBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpIDogbnVsbDtcbiAgICB2YXIgaW1hZ2VQb3NCID0gaW1hZ2UgPyBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLnRvLCB0cnVlKSA6IG51bGw7XG5cbiAgICBpZiAoaW1hZ2VQb3NBICYmIGltYWdlUG9zQikge1xuICAgICAgICAvLyBEcmF3IHRleHR1cmUgZmlsbFxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLnBhdHRlcm5TaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV9pbWFnZSwgMCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfb3BhY2l0eSwgb3BhY2l0eSk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICB2YXIgc2l6ZUEgPSBpbWFnZVBvc0Euc2l6ZTtcbiAgICAgICAgdmFyIHNpemVCID0gaW1hZ2VQb3NCLnNpemU7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKHRyYW5zZm9ybS5jZW50ZXIpO1xuICAgICAgICB2YXIgc2NhbGUgPSAxIC8gTWF0aC5wb3coMiwgdHJhbnNmb3JtLnpvb21GcmFjdGlvbik7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21peCwgaW1hZ2UudCk7XG5cbiAgICAgICAgdmFyIG1hdHJpeEEgPSBtYXQzLmNyZWF0ZSgpO1xuICAgICAgICBtYXQzLnNjYWxlKG1hdHJpeEEsIG1hdHJpeEEsIFtcbiAgICAgICAgICAgIDEgLyAoc2l6ZUFbMF0gKiBpbWFnZS5mcm9tU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChzaXplQVsxXSAqIGltYWdlLmZyb21TY2FsZSlcbiAgICAgICAgXSk7XG4gICAgICAgIG1hdDMudHJhbnNsYXRlKG1hdHJpeEEsIG1hdHJpeEEsIFtcbiAgICAgICAgICAgIChjZW50ZXIuY29sdW1uICogdHJhbnNmb3JtLnRpbGVTaXplKSAlIChzaXplQVswXSAqIGltYWdlLmZyb21TY2FsZSksXG4gICAgICAgICAgICAoY2VudGVyLnJvdyAgICAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUFbMV0gKiBpbWFnZS5mcm9tU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnJvdGF0ZShtYXRyaXhBLCBtYXRyaXhBLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgbWF0My5zY2FsZShtYXRyaXhBLCBtYXRyaXhBLCBbXG4gICAgICAgICAgICBzY2FsZSAqIHRyYW5zZm9ybS53aWR0aCAgLyAyLFxuICAgICAgICAgICAtc2NhbGUgKiB0cmFuc2Zvcm0uaGVpZ2h0IC8gMlxuICAgICAgICBdKTtcblxuICAgICAgICB2YXIgbWF0cml4QiA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgMSAvIChzaXplQlswXSAqIGltYWdlLnRvU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChzaXplQlsxXSAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnRyYW5zbGF0ZShtYXRyaXhCLCBtYXRyaXhCLCBbXG4gICAgICAgICAgICAoY2VudGVyLmNvbHVtbiAqIHRyYW5zZm9ybS50aWxlU2l6ZSkgJSAoc2l6ZUJbMF0gKiBpbWFnZS50b1NjYWxlKSxcbiAgICAgICAgICAgIChjZW50ZXIucm93ICAgICogdHJhbnNmb3JtLnRpbGVTaXplKSAlIChzaXplQlsxXSAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuICAgICAgICBtYXQzLnJvdGF0ZShtYXRyaXhCLCBtYXRyaXhCLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgbWF0My5zY2FsZShtYXRyaXhCLCBtYXRyaXhCLCBbXG4gICAgICAgICAgICBzY2FsZSAqIHRyYW5zZm9ybS53aWR0aCAgLyAyLFxuICAgICAgICAgICAtc2NhbGUgKiB0cmFuc2Zvcm0uaGVpZ2h0IC8gMlxuICAgICAgICBdKTtcblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYSwgZmFsc2UsIG1hdHJpeEEpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHNoYWRlci51X3BhdHRlcm5tYXRyaXhfYiwgZmFsc2UsIG1hdHJpeEIpO1xuXG4gICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgdHJ1ZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEcmF3IGZpbGxpbmcgcmVjdGFuZ2xlLlxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmZpbGxTaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9jb2xvcik7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgY29sb3IpO1xuICAgIH1cblxuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci5iYWNrZ3JvdW5kQnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgcGFpbnRlci5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHBhaW50ZXIuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQpO1xuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwMCk7XG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdQbGFjZW1lbnREZWJ1ZztcblxuZnVuY3Rpb24gZHJhd1BsYWNlbWVudERlYnVnKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcblxuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGlsZS5lbGVtZW50R3JvdXBzW2xheWVyLnJlZiB8fCBsYXllci5pZF0uY29sbGlzaW9uQm94O1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGdsID0gcGFpbnRlci5nbDtcbiAgICB2YXIgYnVmZmVyID0gdGlsZS5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICB2YXIgc2hhZGVyID0gcGFpbnRlci5jb2xsaXNpb25Cb3hTaGFkZXI7XG5cbiAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcblxuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG4gICAgYnVmZmVyLmJpbmQoZ2wsIHNoYWRlcik7XG4gICAgZ2wubGluZVdpZHRoKDEpO1xuXG4gICAgdmFyIHN0cmlkZSA9IDEyO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9leHRydWRlLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgNCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9kYXRhLCAyLCBnbC5VTlNJR05FRF9CWVRFLCBmYWxzZSwgc3RyaWRlLCA4KTtcblxuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9zY2FsZSwgTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSAtIHRpbGUuY29vcmQueikpO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV96b29tLCBwYWludGVyLnRyYW5zZm9ybS56b29tICogMTApO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9tYXh6b29tLCAodGlsZS5jb29yZC56ICsgMSkgKiAxMCk7XG5cbiAgICB2YXIgYmVnaW4gPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1swXS52ZXJ0ZXhTdGFydEluZGV4O1xuICAgIHZhciBsZW4gPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1swXS52ZXJ0ZXhMZW5ndGg7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUywgYmVnaW4sIGxlbik7XG5cbiAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0ZXh0VmVydGljZXMgPSByZXF1aXJlKCcuLi9saWIvZGVidWd0ZXh0Jyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdEZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0RlYnVnKHBhaW50ZXIsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgLy8gQmxlbmQgdG8gdGhlIGZyb250LCBub3QgdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5kZWJ1Z1NoYWRlciwgdGlsZS5wb3NNYXRyaXgpO1xuXG4gICAgLy8gZHJhdyBib3VuZGluZyByZWN0YW5nbGVcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci5kZWJ1Z0J1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmRlYnVnU2hhZGVyLmFfcG9zLCBwYWludGVyLmRlYnVnQnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLnVuaWZvcm00ZihwYWludGVyLmRlYnVnU2hhZGVyLnVfY29sb3IsIDEsIDAsIDAsIDEpO1xuICAgIGdsLmxpbmVXaWR0aCg0KTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVfU1RSSVAsIDAsIHBhaW50ZXIuZGVidWdCdWZmZXIuaXRlbUNvdW50KTtcblxuICAgIHZhciB2ZXJ0aWNlcyA9IHRleHRWZXJ0aWNlcyh0aWxlLmNvb3JkLnRvU3RyaW5nKCksIDUwLCAyMDAsIDUpO1xuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHBhaW50ZXIuZGVidWdUZXh0QnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEludDE2QXJyYXkodmVydGljZXMpLCBnbC5TVFJFQU1fRFJBVyk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmRlYnVnU2hhZGVyLmFfcG9zLCBwYWludGVyLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSwgZ2wuU0hPUlQsIGZhbHNlLCAwLCAwKTtcbiAgICBnbC5saW5lV2lkdGgoOCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgZ2wudW5pZm9ybTRmKHBhaW50ZXIuZGVidWdTaGFkZXIudV9jb2xvciwgMSwgMSwgMSwgMSk7XG4gICAgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUywgMCwgdmVydGljZXMubGVuZ3RoIC8gcGFpbnRlci5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUpO1xuICAgIGdsLmxpbmVXaWR0aCgyICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICBnbC51bmlmb3JtNGYocGFpbnRlci5kZWJ1Z1NoYWRlci51X2NvbG9yLCAwLCAwLCAwLCAxKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCAwLCB2ZXJ0aWNlcy5sZW5ndGggLyBwYWludGVyLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSk7XG5cbiAgICAvLyBSZXZlcnQgYmxlbmRpbmcgbW9kZSB0byBibGVuZCB0byB0aGUgYmFjay5cbiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgZ2wuT05FKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBtYXQzID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0MztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3RmlsbDtcblxuZnVuY3Rpb24gZHJhd0ZpbGwocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSkge1xuICAgIC8vIE5vIGRhdGFcbiAgICBpZiAoIXRpbGUuYnVmZmVycykgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50R3JvdXBzID0gdGlsZS5lbGVtZW50R3JvdXBzW2xheWVyLnJlZiB8fCBsYXllci5pZF07XG4gICAgaWYgKCFlbGVtZW50R3JvdXBzKSByZXR1cm47XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuICAgIHZhciB0cmFuc2xhdGVkUG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVNYXRyaXgocG9zTWF0cml4LCB0aWxlLCBsYXllci5wYWludFsnZmlsbC10cmFuc2xhdGUnXSwgbGF5ZXIucGFpbnRbJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvciddKTtcblxuICAgIHZhciBjb2xvciA9IGxheWVyLnBhaW50WydmaWxsLWNvbG9yJ107XG5cbiAgICB2YXIgdmVydGV4LCBlbGVtZW50cywgZ3JvdXAsIGNvdW50O1xuXG4gICAgLy8gRHJhdyB0aGUgc3RlbmNpbCBtYXNrLlxuXG4gICAgLy8gV2UncmUgb25seSBkcmF3aW5nIHRvIHRoZSBmaXJzdCBzZXZlbiBiaXRzICg9PSBzdXBwb3J0IGEgbWF4aW11bSBvZlxuICAgIC8vIDEyNyBvdmVybGFwcGluZyBwb2x5Z29ucyBpbiBvbmUgcGxhY2UgYmVmb3JlIHdlIGdldCByZW5kZXJpbmcgZXJyb3JzKS5cbiAgICBnbC5zdGVuY2lsTWFzaygweDNGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuXG4gICAgLy8gRHJhdyBmcm9udCBmYWNpbmcgdHJpYW5nbGVzLiBXaGVyZXZlciB0aGUgMHg4MCBiaXQgaXMgMSwgd2UgYXJlXG4gICAgLy8gaW5jcmVhc2luZyB0aGUgbG93ZXIgNyBiaXRzIGJ5IG9uZSBpZiB0aGUgdHJpYW5nbGUgaXMgYSBmcm9udC1mYWNpbmdcbiAgICAvLyB0cmlhbmdsZS4gVGhpcyBtZWFucyB0aGF0IGFsbCB2aXNpYmxlIHBvbHlnb25zIHNob3VsZCBiZSBpbiBDQ1dcbiAgICAvLyBvcmllbnRhdGlvbiwgd2hpbGUgYWxsIGhvbGVzIChzZWUgYmVsb3cpIGFyZSBpbiBDVyBvcmllbnRhdGlvbi5cbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgMHg4MCwgMHg4MCk7XG5cbiAgICAvLyBXaGVuIHdlIGRvIGEgbm9uemVybyBmaWxsLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcGl4ZWwgaXNcbiAgICAvLyBjb3ZlcmVkIGJ5IGEgY291bnRlcmNsb2Nrd2lzZSBwb2x5Z29uLCBhbmQgc3VidHJhY3QgdGhlIG51bWJlciBvZlxuICAgIC8vIHRpbWVzIGl0IGlzIFwidW5jb3ZlcmVkXCIgYnkgYSBjbG9ja3dpc2UgcG9seWdvbi5cbiAgICBnbC5zdGVuY2lsT3BTZXBhcmF0ZShnbC5GUk9OVCwgZ2wuSU5DUl9XUkFQLCBnbC5LRUVQLCBnbC5LRUVQKTtcbiAgICBnbC5zdGVuY2lsT3BTZXBhcmF0ZShnbC5CQUNLLCBnbC5ERUNSX1dSQVAsIGdsLktFRVAsIGdsLktFRVApO1xuXG4gICAgLy8gV2hlbiBkcmF3aW5nIGEgc2hhcGUsIHdlIGZpcnN0IGRyYXcgYWxsIHNoYXBlcyB0byB0aGUgc3RlbmNpbCBidWZmZXJcbiAgICAvLyBhbmQgaW5jcmVtZW50aW5nIGFsbCBhcmVhcyB3aGVyZSBwb2x5Z29ucyBhcmVcbiAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgLy8gRHJhdyB0aGUgYWN0dWFsIHRyaWFuZ2xlIGZhbiBpbnRvIHRoZSBzdGVuY2lsIGJ1ZmZlci5cbiAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5maWxsU2hhZGVyLCB0cmFuc2xhdGVkUG9zTWF0cml4KTtcblxuICAgIC8vIERyYXcgYWxsIGJ1ZmZlcnNcbiAgICB2ZXJ0ZXggPSB0aWxlLmJ1ZmZlcnMuZmlsbFZlcnRleDtcbiAgICB2ZXJ0ZXguYmluZChnbCk7XG4gICAgZWxlbWVudHMgPSB0aWxlLmJ1ZmZlcnMuZmlsbEVsZW1lbnQ7XG4gICAgZWxlbWVudHMuYmluZChnbCk7XG5cbiAgICB2YXIgb2Zmc2V0LCBlbGVtZW50T2Zmc2V0O1xuXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHBhaW50ZXIuZmlsbFNoYWRlci5hX2NvbG9yKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudEdyb3Vwcy5ncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tpXTtcbiAgICAgICAgb2Zmc2V0ID0gZ3JvdXAudmVydGV4U3RhcnRJbmRleCAqIHZlcnRleC5pdGVtU2l6ZTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwYWludGVyLmZpbGxTaGFkZXIuYV9wb3MsIDIsIGdsLlNIT1JULCBmYWxzZSwgNCwgb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgZWxlbWVudE9mZnNldCA9IGdyb3VwLmVsZW1lbnRTdGFydEluZGV4ICogZWxlbWVudHMuaXRlbVNpemU7XG4gICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgc3RlbmNpbCBtYXNrIGluIHRoZSBzdGVuY2lsIGJ1ZmZlciwgd2UgY2FuIHN0YXJ0XG4gICAgLy8gd3JpdGluZyB0byB0aGUgY29sb3IgYnVmZmVyLlxuICAgIGdsLmNvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcblxuICAgIC8vIEZyb20gbm93IG9uLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSB0aGUgc3RlbmNpbCBidWZmZXIgYW55bW9yZS5cbiAgICBnbC5zdGVuY2lsT3AoZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwKTtcblxuICAgIHZhciBzdHJva2VDb2xvciA9IGxheWVyLnBhaW50WydmaWxsLW91dGxpbmUtY29sb3InXTtcblxuICAgIC8vIEJlY2F1c2Ugd2UncmUgZHJhd2luZyB0b3AtdG8tYm90dG9tLCBhbmQgd2UgdXBkYXRlIHRoZSBzdGVuY2lsIG1hc2tcbiAgICAvLyBiZWxvdywgd2UgaGF2ZSB0byBkcmF3IHRoZSBvdXRsaW5lIGZpcnN0ICghKVxuICAgIGlmIChsYXllci5wYWludFsnZmlsbC1hbnRpYWxpYXMnXSA9PT0gdHJ1ZSAmJiAhKGxheWVyLnBhaW50WydmaWxsLWltYWdlJ10gJiYgIXN0cm9rZUNvbG9yKSkge1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIocGFpbnRlci5vdXRsaW5lU2hhZGVyLCB0cmFuc2xhdGVkUG9zTWF0cml4KTtcbiAgICAgICAgZ2wubGluZVdpZHRoKDIgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgICAgIGlmIChzdHJva2VDb2xvcikge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGVmaW5lZCBhIGRpZmZlcmVudCBjb2xvciBmb3IgdGhlIGZpbGwgb3V0bGluZSwgd2UgYXJlXG4gICAgICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgzRiBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgICAgIC8vIGNsaXBwaW5nIG1hc2suXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgMHg4MCwgMHg4MCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIG9ubHkgd2FudCB0byBkcmF3IHRoZSBhbnRpYWxpYXNlZCBwYXJ0cyB0aGF0IGFyZVxuICAgICAgICAgICAgLy8gKm91dHNpZGUqIHRoZSBjdXJyZW50IHNoYXBlLiBUaGlzIGlzIGltcG9ydGFudCBpbiBjYXNlIHRoZSBmaWxsXG4gICAgICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2hhcGUsIHNvbWUgcGl4ZWxzIGZyb20gdGhlIG91dGxpbmUgc3Ryb2tlIG92ZXJsYXBwZWRcbiAgICAgICAgICAgIC8vIHRoZSAobm9uLWFudGlhbGlhc2VkKSBmaWxsLlxuICAgICAgICAgICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4QkYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmKHBhaW50ZXIub3V0bGluZVNoYWRlci51X3dvcmxkLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQpO1xuXG4gICAgICAgIC8vIERyYXcgYWxsIGJ1ZmZlcnNcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmZpbGxWZXJ0ZXg7XG4gICAgICAgIGVsZW1lbnRzID0gdGlsZS5idWZmZXJzLm91dGxpbmVFbGVtZW50O1xuICAgICAgICBlbGVtZW50cy5iaW5kKGdsKTtcblxuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocGFpbnRlci5vdXRsaW5lU2hhZGVyLmFfY29sb3IpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWI0ZnYocGFpbnRlci5vdXRsaW5lU2hhZGVyLmFfY29sb3IsIHN0cm9rZUNvbG9yID8gc3Ryb2tlQ29sb3IgOiBjb2xvcik7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1trXTtcbiAgICAgICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIub3V0bGluZVNoYWRlci5hX3BvcywgMiwgZ2wuU0hPUlQsIGZhbHNlLCA0LCBvZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgY291bnQgPSBncm91cC5zZWNvbmRFbGVtZW50TGVuZ3RoICogMjtcbiAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5zZWNvbmRFbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLkxJTkVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2ZpbGwtaW1hZ2UnXTtcbiAgICB2YXIgb3BhY2l0eSA9IGxheWVyLnBhaW50WydmaWxsLW9wYWNpdHknXSB8fCAxO1xuICAgIHZhciBzaGFkZXI7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgLy8gRHJhdyB0ZXh0dXJlIGZpbGxcbiAgICAgICAgdmFyIGltYWdlUG9zQSA9IHBhaW50ZXIuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaW1hZ2UuZnJvbSwgdHJ1ZSk7XG4gICAgICAgIHZhciBpbWFnZVBvc0IgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLnRvLCB0cnVlKTtcbiAgICAgICAgaWYgKCFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQikgcmV0dXJuO1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIucGF0dGVyblNoYWRlcjtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2EsIGltYWdlUG9zQS50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9hLCBpbWFnZVBvc0EuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fdGxfYiwgaW1hZ2VQb3NCLnRsKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX2JyX2IsIGltYWdlUG9zQi5icik7XG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5LCBvcGFjaXR5KTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21peCwgaW1hZ2UudCk7XG5cbiAgICAgICAgdmFyIGZhY3RvciA9ICh0aWxlLnRpbGVFeHRlbnQgLyB0aWxlLnRpbGVTaXplKSAvIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tIC0gdGlsZS5jb29yZC56KTtcblxuICAgICAgICB2YXIgbWF0cml4QSA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QSwgbWF0cml4QSwgW1xuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Euc2l6ZVswXSAqIGZhY3RvciAqIGltYWdlLmZyb21TY2FsZSksXG4gICAgICAgICAgICAxIC8gKGltYWdlUG9zQS5zaXplWzFdICogZmFjdG9yICogaW1hZ2UuZnJvbVNjYWxlKVxuICAgICAgICBdKTtcblxuICAgICAgICB2YXIgbWF0cml4QiA9IG1hdDMuY3JlYXRlKCk7XG4gICAgICAgIG1hdDMuc2NhbGUobWF0cml4QiwgbWF0cml4QiwgW1xuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Iuc2l6ZVswXSAqIGZhY3RvciAqIGltYWdlLnRvU2NhbGUpLFxuICAgICAgICAgICAgMSAvIChpbWFnZVBvc0Iuc2l6ZVsxXSAqIGZhY3RvciAqIGltYWdlLnRvU2NhbGUpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoc2hhZGVyLnVfcGF0dGVybm1hdHJpeF9hLCBmYWxzZSwgbWF0cml4QSk7XG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoc2hhZGVyLnVfcGF0dGVybm1hdHJpeF9iLCBmYWxzZSwgbWF0cml4Qik7XG5cbiAgICAgICAgcGFpbnRlci5zcHJpdGVBdGxhcy5iaW5kKGdsLCB0cnVlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERyYXcgZmlsbGluZyByZWN0YW5nbGUuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIuZmlsbFNoYWRlcjtcbiAgICAgICAgZ2wuc3dpdGNoU2hhZGVyKHNoYWRlciwgcG9zTWF0cml4KTtcbiAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX2NvbG9yKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliNGZ2KHNoYWRlci5hX2NvbG9yLCBjb2xvcik7XG4gICAgfVxuXG4gICAgLy8gT25seSBkcmF3IHJlZ2lvbnMgdGhhdCB3ZSBtYXJrZWRcbiAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgMHgwLCAweDNGKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3BvcywgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDAsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHBhaW50ZXIudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgZ2wuc3RlbmNpbE1hc2soMHgwMCk7XG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIG1hdDIgPSByZXF1aXJlKCdnbC1tYXRyaXgnKS5tYXQyO1xuXG4vKipcbiAqIERyYXcgYSBsaW5lLiBVbmRlciB0aGUgaG9vZCB0aGlzIHdpbGwgcmVhZCBlbGVtZW50cyBmcm9tXG4gKiBhIHRpbGUsIGRhc2ggdGV4dHVyZXMgZnJvbSBhIGxpbmVBdGxhcywgYW5kIHN0eWxlIHByb3BlcnRpZXMgZnJvbSBhIGxheWVyLlxuICogQHBhcmFtIHtPYmplY3R9IHBhaW50ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllclxuICogQHBhcmFtIHtPYmplY3R9IHBvc01hdHJpeFxuICogQHBhcmFtIHtUaWxlfSB0aWxlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSBkcmF3cyB3aXRoIHRoZSBwYWludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICAvLyBObyBkYXRhXG4gICAgaWYgKCF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGdsID0gcGFpbnRlci5nbDtcblxuICAgIC8vIGRvbid0IGRyYXcgemVyby13aWR0aCBsaW5lc1xuICAgIGlmIChsYXllci5wYWludFsnbGluZS13aWR0aCddIDw9IDApIHJldHVybjtcblxuICAgIC8vIHRoZSBkaXN0YW5jZSBvdmVyIHdoaWNoIHRoZSBsaW5lIGVkZ2UgZmFkZXMgb3V0LlxuICAgIC8vIFJldGluYSBkZXZpY2VzIG5lZWQgYSBzbWFsbGVyIGRpc3RhbmNlIHRvIGF2b2lkIGFsaWFzaW5nLlxuICAgIHZhciBhbnRpYWxpYXNpbmcgPSAxIC8gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgdmFyIGJsdXIgPSBsYXllci5wYWludFsnbGluZS1ibHVyJ10gKyBhbnRpYWxpYXNpbmc7XG4gICAgdmFyIGVkZ2VXaWR0aCA9IGxheWVyLnBhaW50WydsaW5lLXdpZHRoJ10gLyAyO1xuICAgIHZhciBpbnNldCA9IC0xO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIHZhciBzaGlmdCA9IDA7XG5cbiAgICBpZiAobGF5ZXIucGFpbnRbJ2xpbmUtZ2FwLXdpZHRoJ10gPiAwKSB7XG4gICAgICAgIGluc2V0ID0gbGF5ZXIucGFpbnRbJ2xpbmUtZ2FwLXdpZHRoJ10gLyAyICsgYW50aWFsaWFzaW5nICogMC41O1xuICAgICAgICBlZGdlV2lkdGggPSBsYXllci5wYWludFsnbGluZS13aWR0aCddO1xuXG4gICAgICAgIC8vIHNoaWZ0IG91dGVyIGxpbmVzIGhhbGYgYSBwaXhlbCB0b3dhcmRzIHRoZSBtaWRkbGUgdG8gZWxpbWluYXRlIHRoZSBjcmFja1xuICAgICAgICBvZmZzZXQgPSBpbnNldCAtIGFudGlhbGlhc2luZyAvIDI7XG4gICAgfVxuXG4gICAgdmFyIG91dHNldCA9IG9mZnNldCArIGVkZ2VXaWR0aCArIGFudGlhbGlhc2luZyAvIDIgKyBzaGlmdDtcblxuICAgIHZhciBjb2xvciA9IGxheWVyLnBhaW50WydsaW5lLWNvbG9yJ107XG4gICAgdmFyIHJhdGlvID0gcGFpbnRlci50cmFuc2Zvcm0uc2NhbGUgLyAoMSA8PCB0aWxlLmNvb3JkLnopIC8gKHRpbGUudGlsZUV4dGVudCAvIHRpbGUudGlsZVNpemUpO1xuICAgIHZhciB2dHhNYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZU1hdHJpeChwb3NNYXRyaXgsIHRpbGUsIGxheWVyLnBhaW50WydsaW5lLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFsnbGluZS10cmFuc2xhdGUtYW5jaG9yJ10pO1xuXG4gICAgdmFyIHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG5cblxuICAgIHZhciBhbnRpYWxpYXNpbmdNYXRyaXggPSBtYXQyLmNyZWF0ZSgpO1xuICAgIG1hdDIuc2NhbGUoYW50aWFsaWFzaW5nTWF0cml4LCBhbnRpYWxpYXNpbmdNYXRyaXgsIFsxLCBNYXRoLmNvcyh0ci5fcGl0Y2gpXSk7XG4gICAgbWF0Mi5yb3RhdGUoYW50aWFsaWFzaW5nTWF0cml4LCBhbnRpYWxpYXNpbmdNYXRyaXgsIHBhaW50ZXIudHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBsb25nZXIgdGhlIHJlYWwgd29ybGQgZGlzdGFuY2UgaXMgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuXG4gICAgLy8gdGhhbiBhdCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uXG4gICAgdmFyIHRvcGVkZ2VsZW5ndGggPSBNYXRoLnNxcnQodHIuaGVpZ2h0ICogdHIuaGVpZ2h0IC8gNCAgKiAoMSArIHRyLmFsdGl0dWRlICogdHIuYWx0aXR1ZGUpKTtcbiAgICB2YXIgeCA9IHRyLmhlaWdodCAvIDIgKiBNYXRoLnRhbih0ci5fcGl0Y2gpO1xuICAgIHZhciBleHRyYSA9ICh0b3BlZGdlbGVuZ3RoICsgeCkgLyB0b3BlZGdlbGVuZ3RoIC0gMTtcblxuICAgIC8vIGhvdyBtdWNoIHRoZSB0aWxlIGlzIG92ZXJzY2FsZWQgYnlcbiAgICB2YXIgb3ZlcnNjYWxpbmcgPSB0aWxlLnRpbGVTaXplIC8gcGFpbnRlci50cmFuc2Zvcm0udGlsZVNpemU7XG5cbiAgICB2YXIgc2hhZGVyO1xuXG5cbiAgICB2YXIgZGFzaGFycmF5ID0gbGF5ZXIucGFpbnRbJ2xpbmUtZGFzaGFycmF5J107XG4gICAgdmFyIGltYWdlID0gbGF5ZXIucGFpbnRbJ2xpbmUtaW1hZ2UnXTtcblxuICAgIGlmIChkYXNoYXJyYXkpIHtcblxuICAgICAgICBzaGFkZXIgPSBwYWludGVyLmxpbmVzZGZwYXR0ZXJuU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuXG4gICAgICAgIHZhciBwb3NBID0gcGFpbnRlci5saW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkuZnJvbSwgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgdmFyIHBvc0IgPSBwYWludGVyLmxpbmVBdGxhcy5nZXREYXNoKGRhc2hhcnJheS50bywgbGF5ZXIubGF5b3V0WydsaW5lLWNhcCddID09PSAncm91bmQnKTtcbiAgICAgICAgcGFpbnRlci5saW5lQXRsYXMuYmluZChnbCk7XG5cbiAgICAgICAgdmFyIHBhdHRlcm5yYXRpbyA9IE1hdGgucG93KDIsIE1hdGguZmxvb3IoTWF0aC5sb2cocGFpbnRlci50cmFuc2Zvcm0uc2NhbGUpIC8gTWF0aC5MTjIpIC0gdGlsZS5jb29yZC56KSAvIDggKiBvdmVyc2NhbGluZztcbiAgICAgICAgdmFyIHNjYWxlQSA9IFtwYXR0ZXJucmF0aW8gLyBwb3NBLndpZHRoIC8gZGFzaGFycmF5LmZyb21TY2FsZSwgLXBvc0EuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUEgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkuZnJvbVNjYWxlICogcG9zQS53aWR0aCAqIDI1NiAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyO1xuICAgICAgICB2YXIgc2NhbGVCID0gW3BhdHRlcm5yYXRpbyAvIHBvc0Iud2lkdGggLyBkYXNoYXJyYXkudG9TY2FsZSwgLXBvc0IuaGVpZ2h0IC8gMl07XG4gICAgICAgIHZhciBnYW1tYUIgPSBwYWludGVyLmxpbmVBdGxhcy53aWR0aCAvIChkYXNoYXJyYXkudG9TY2FsZSAqIHBvc0Iud2lkdGggKiAyNTYgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pIC8gMjtcblxuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5zY2FsZV9hLCBzY2FsZUEpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfdGV4X3lfYSwgcG9zQS55KTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuc2NhbGVfYiwgc2NhbGVCKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3RleF95X2IsIHBvc0IueSk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFpKHNoYWRlci51X2ltYWdlLCAwKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NkZmdhbW1hLCBNYXRoLm1heChnYW1tYUEsIGdhbW1hQikpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfbWl4LCBkYXNoYXJyYXkudCk7XG5cbiAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgIHZhciBpbWFnZVBvc0EgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpO1xuICAgICAgICB2YXIgaW1hZ2VQb3NCID0gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSk7XG4gICAgICAgIGlmICghaW1hZ2VQb3NBIHx8ICFpbWFnZVBvc0IpIHJldHVybjtcbiAgICAgICAgdmFyIGZhY3RvciA9IHRpbGUudGlsZUV4dGVudCAvIHRpbGUudGlsZVNpemUgLyBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSAtIHRpbGUuY29vcmQueikgKiBvdmVyc2NhbGluZztcblxuICAgICAgICBwYWludGVyLnNwcml0ZUF0bGFzLmJpbmQoZ2wsIHRydWUpO1xuXG4gICAgICAgIHNoYWRlciA9IHBhaW50ZXIubGluZXBhdHRlcm5TaGFkZXI7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHZ0eE1hdHJpeCwgdGlsZS5leE1hdHJpeCk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3JhdGlvLCByYXRpbyk7XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYSwgW2ltYWdlUG9zQS5zaXplWzBdICogZmFjdG9yICogaW1hZ2UuZnJvbVNjYWxlLCBpbWFnZVBvc0Iuc2l6ZVsxXSBdKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3NpemVfYiwgW2ltYWdlUG9zQi5zaXplWzBdICogZmFjdG9yICogaW1hZ2UudG9TY2FsZSwgaW1hZ2VQb3NCLnNpemVbMV0gXSk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgZ2wudW5pZm9ybTJmdihzaGFkZXIudV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZSwgaW1hZ2UudCk7XG5cbiAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX29wYWNpdHkpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWIxZihzaGFkZXIuYV9vcGFjaXR5LCBsYXllci5wYWludFsnbGluZS1vcGFjaXR5J10pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5saW5lU2hhZGVyO1xuICAgICAgICBnbC5zd2l0Y2hTaGFkZXIoc2hhZGVyLCB2dHhNYXRyaXgsIHRpbGUuZXhNYXRyaXgpO1xuXG4gICAgICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9yYXRpbywgcmF0aW8pO1xuICAgICAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZXh0cmEsIGV4dHJhKTtcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDJmdihzaGFkZXIudV9hbnRpYWxpYXNpbmdtYXRyaXgsIGZhbHNlLCBhbnRpYWxpYXNpbmdNYXRyaXgpO1xuICAgIH1cblxuICAgIC8vIGxpbmVwYXR0ZXJuIGRvZXMgbm90IGhhdmUgYSBjb2xvciBhdHRyaWJ1dGVcbiAgICBpZiAoc2hhZGVyLmFfY29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfY29sb3IpO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWI0ZnYoc2hhZGVyLmFfY29sb3IsIGNvbG9yKTtcbiAgICB9XG5cbiAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfbGluZXdpZHRoKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWIyZihzaGFkZXIuYV9saW5ld2lkdGgsIG91dHNldCwgaW5zZXQpO1xuXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlci5hX2JsdXIpO1xuICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2JsdXIsIGJsdXIpO1xuXG4gICAgdmFyIHZlcnRleCA9IHRpbGUuYnVmZmVycy5saW5lVmVydGV4O1xuICAgIHZlcnRleC5iaW5kKGdsKTtcbiAgICB2YXIgZWxlbWVudCA9IHRpbGUuYnVmZmVycy5saW5lRWxlbWVudDtcbiAgICBlbGVtZW50LmJpbmQoZ2wpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tpXTtcbiAgICAgICAgdmFyIHZ0eE9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoc2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDgsIHZ0eE9mZnNldCArIDApO1xuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX2RhdGEsIDQsIGdsLkJZVEUsIGZhbHNlLCA4LCB2dHhPZmZzZXQgKyA0KTtcblxuICAgICAgICB2YXIgY291bnQgPSBncm91cC5lbGVtZW50TGVuZ3RoICogMztcbiAgICAgICAgdmFyIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnQuaXRlbVNpemU7XG4gICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3UmFzdGVyO1xuXG5mdW5jdGlvbiBkcmF3UmFzdGVyKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgdmFyIHNoYWRlciA9IHBhaW50ZXIucmFzdGVyU2hhZGVyO1xuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCk7XG5cbiAgICAvLyBjb2xvciBwYXJhbWV0ZXJzXG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2JyaWdodG5lc3NfbG93LCBsYXllci5wYWludFsncmFzdGVyLWJyaWdodG5lc3MtbWluJ10pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9icmlnaHRuZXNzX2hpZ2gsIGxheWVyLnBhaW50WydyYXN0ZXItYnJpZ2h0bmVzcy1tYXgnXSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X3NhdHVyYXRpb25fZmFjdG9yLCBzYXR1cmF0aW9uRmFjdG9yKGxheWVyLnBhaW50WydyYXN0ZXItc2F0dXJhdGlvbiddKSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2NvbnRyYXN0X2ZhY3RvciwgY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnRbJ3Jhc3Rlci1jb250cmFzdCddKSk7XG4gICAgZ2wudW5pZm9ybTNmdihzaGFkZXIudV9zcGluX3dlaWdodHMsIHNwaW5XZWlnaHRzKGxheWVyLnBhaW50WydyYXN0ZXItaHVlLXJvdGF0ZSddKSk7XG5cbiAgICB2YXIgcGFyZW50VGlsZSA9IHRpbGUuc291cmNlICYmIHRpbGUuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQodGlsZS5jb29yZCwgMCwge30pLFxuICAgICAgICBvcGFjaXRpZXMgPSBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHBhaW50ZXIudHJhbnNmb3JtKTtcblxuICAgIHZhciBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG5cbiAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgcGFyZW50VGlsZS50ZXh0dXJlKTtcblxuICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS5jb29yZC56IC0gdGlsZS5jb29yZC56KTtcbiAgICAgICAgcGFyZW50VEwgPSBbdGlsZS5jb29yZC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUuY29vcmQueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcGFjaXRpZXNbMV0gPSAwO1xuICAgIH1cblxuICAgIC8vIGNyb3NzLWZhZGUgcGFyYW1ldGVyc1xuICAgIGdsLnVuaWZvcm0yZnYoc2hhZGVyLnVfdGxfcGFyZW50LCBwYXJlbnRUTCB8fCBbMCwgMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9zY2FsZV9wYXJlbnQsIHBhcmVudFNjYWxlQnkgfHwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2J1ZmZlcl9zY2FsZSwgMSk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X29wYWNpdHkwLCBvcGFjaXRpZXNbMF0pO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9vcGFjaXR5MSwgb3BhY2l0aWVzWzFdKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UwLCAwKTtcbiAgICBnbC51bmlmb3JtMWkoc2hhZGVyLnVfaW1hZ2UxLCAxKTtcblxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aWxlLmJvdW5kc0J1ZmZlciB8fCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIpO1xuXG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihzaGFkZXIuYV9wb3MsICAgICAgICAgMiwgZ2wuU0hPUlQsIGZhbHNlLCA4LCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHNoYWRlci5hX3RleHR1cmVfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIDgsIDQpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xuXG4gICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIHNwaW5XZWlnaHRzKGFuZ2xlKSB7XG4gICAgYW5nbGUgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICB2YXIgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRPcGFjaXRpZXModGlsZSwgcGFyZW50VGlsZSwgbGF5ZXIsIHRyYW5zZm9ybSkge1xuICAgIGlmICghdGlsZS5zb3VyY2UpIHJldHVybiBbMSwgMF07XG5cbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICB2YXIgZmFkZUR1cmF0aW9uID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJ107XG4gICAgdmFyIHNpbmNlVGlsZSA9IChub3cgLSB0aWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb247XG4gICAgdmFyIHNpbmNlUGFyZW50ID0gcGFyZW50VGlsZSA/IChub3cgLSBwYXJlbnRUaWxlLnRpbWVBZGRlZCkgLyBmYWRlRHVyYXRpb24gOiAtMTtcblxuICAgIHZhciBpZGVhbFogPSB0aWxlLnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbCh0cmFuc2Zvcm0pO1xuICAgIHZhciBwYXJlbnRGdXJ0aGVyID0gcGFyZW50VGlsZSA/IE1hdGguYWJzKHBhcmVudFRpbGUuY29vcmQueiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLmNvb3JkLnogLSBpZGVhbFopIDogZmFsc2U7XG5cbiAgICB2YXIgb3BhY2l0eSA9IFtdO1xuICAgIGlmICghcGFyZW50VGlsZSB8fCBwYXJlbnRGdXJ0aGVyKSB7XG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXJcbiAgICAgICAgb3BhY2l0eVswXSA9IHV0aWwuY2xhbXAoc2luY2VUaWxlLCAwLCAxKTtcbiAgICAgICAgb3BhY2l0eVsxXSA9IDEgLSBvcGFjaXR5WzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcmVudCBpcyB5b3VuZ2VyLCB6b29taW5nIG91dFxuICAgICAgICBvcGFjaXR5WzBdID0gdXRpbC5jbGFtcCgxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuICAgICAgICBvcGFjaXR5WzFdID0gMSAtIG9wYWNpdHlbMF07XG4gICAgfVxuXG4gICAgdmFyIG9wID0gbGF5ZXIucGFpbnRbJ3Jhc3Rlci1vcGFjaXR5J107XG4gICAgb3BhY2l0eVswXSAqPSBvcDtcbiAgICBvcGFjaXR5WzFdICo9IG9wO1xuXG4gICAgcmV0dXJuIG9wYWNpdHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgbWF0NCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpLm1hdDQ7XG5cbnZhciBkcmF3Q29sbGlzaW9uRGVidWcgPSByZXF1aXJlKCcuL2RyYXdfY29sbGlzaW9uX2RlYnVnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd1N5bWJvbHM7XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2xzKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICAvLyBObyBkYXRhXG4gICAgaWYgKCF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgdmFyIGRyYXdBY3Jvc3NFZGdlcyA9ICEobGF5ZXIubGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXllci5sYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgIGxheWVyLmxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10gfHwgbGF5ZXIubGF5b3V0WydpY29uLWlnbm9yZS1wbGFjZW1lbnQnXSk7XG5cbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgaWYgKGRyYXdBY3Jvc3NFZGdlcykge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBMYXllcnMgd2l0aCBmZWF0dXJlcyB0aGF0IG1heSBiZSBkcmF3biBvdmVybGFwcGluZyBhcmVuJ3QgY2xpcHBlZC4gVGhlc2VcbiAgICAgICAgLy8gbGF5ZXJzIGFyZSBzb3J0ZWQgaW4gdGhlIHkgZGlyZWN0aW9uLCBhbmQgdG8gZHJhdyB0aGUgY29ycmVjdCBvcmRlcmluZyBuZWFyXG4gICAgICAgIC8vIHRpbGUgZWRnZXMgdGhlIGljb25zIGFyZSBpbmNsdWRlZCBpbiBib3RoIHRpbGVzIGFuZCBjbGlwcGVkIHdoZW4gZHJhd2luZy5cbiAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50R3JvdXBzLnRleHQuZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBkcmF3U3ltYm9sKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUsIGVsZW1lbnRHcm91cHMudGV4dCwgJ3RleHQnLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRHcm91cHMuaWNvbi5ncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3Vwcy5pY29uLCAnaWNvbicsIGVsZW1lbnRHcm91cHMuc2RmSWNvbnMpO1xuICAgIH1cblxuICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBsYXllciwgcG9zTWF0cml4LCB0aWxlKTtcblxuICAgIGlmIChkcmF3QWNyb3NzRWRnZXMpIHtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFNpemVzID0ge1xuICAgIGljb246IDEsXG4gICAgdGV4dDogMjRcbn07XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2wocGFpbnRlciwgbGF5ZXIsIHBvc01hdHJpeCwgdGlsZSwgZWxlbWVudEdyb3VwcywgcHJlZml4LCBzZGYpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgcG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVNYXRyaXgocG9zTWF0cml4LCB0aWxlLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZSddLCBsYXllci5wYWludFtwcmVmaXggKyAnLXRyYW5zbGF0ZS1hbmNob3InXSk7XG5cbiAgICB2YXIgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICB2YXIgYWxpZ25lZFdpdGhNYXAgPSBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCc7XG4gICAgdmFyIHNrZXdlZCA9IGFsaWduZWRXaXRoTWFwO1xuICAgIHZhciBleE1hdHJpeCwgcywgZ2FtbWFTY2FsZTtcblxuICAgIGlmIChza2V3ZWQpIHtcbiAgICAgICAgZXhNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBzID0gdGlsZS50aWxlRXh0ZW50IC8gdGlsZS50aWxlU2l6ZSAvIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSB0aWxlLmNvb3JkLnopO1xuICAgICAgICBnYW1tYVNjYWxlID0gMSAvIE1hdGguY29zKHRyLl9waXRjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXhNYXRyaXggPSBtYXQ0LmNsb25lKHRpbGUuZXhNYXRyaXgpO1xuICAgICAgICBzID0gcGFpbnRlci50cmFuc2Zvcm0uYWx0aXR1ZGU7XG4gICAgICAgIGdhbW1hU2NhbGUgPSAxO1xuICAgIH1cbiAgICBtYXQ0LnNjYWxlKGV4TWF0cml4LCBleE1hdHJpeCwgW3MsIHMsIDFdKTtcblxuICAgIC8vIElmIGxheWVyLnBhaW50LnNpemUgPiBsYXllci5sYXlvdXRbcHJlZml4ICsgJy1tYXgtc2l6ZSddIHRoZW4gbGFiZWxzIG1heSBjb2xsaWRlXG4gICAgdmFyIGZvbnRTaXplID0gbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1zaXplJ107XG4gICAgdmFyIGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gZGVmYXVsdFNpemVzW3ByZWZpeF07XG4gICAgbWF0NC5zY2FsZShleE1hdHJpeCwgZXhNYXRyaXgsIFsgZm9udFNjYWxlLCBmb250U2NhbGUsIDEgXSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggbG9uZ2VyIHRoZSByZWFsIHdvcmxkIGRpc3RhbmNlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlblxuICAgIC8vIHRoYW4gYXQgdGhlIG1pZGRsZSBvZiB0aGUgc2NyZWVuLlxuICAgIHZhciB0b3BlZGdlbGVuZ3RoID0gTWF0aC5zcXJ0KHRyLmhlaWdodCAqIHRyLmhlaWdodCAvIDQgICogKDEgKyB0ci5hbHRpdHVkZSAqIHRyLmFsdGl0dWRlKSk7XG4gICAgdmFyIHggPSB0ci5oZWlnaHQgLyAyICogTWF0aC50YW4odHIuX3BpdGNoKTtcbiAgICB2YXIgZXh0cmEgPSAodG9wZWRnZWxlbmd0aCArIHgpIC8gdG9wZWRnZWxlbmd0aCAtIDE7XG5cbiAgICB2YXIgdGV4dCA9IHByZWZpeCA9PT0gJ3RleHQnO1xuICAgIHZhciBzaGFkZXIsIHZlcnRleCwgZWxlbWVudHMsIHRleHNpemU7XG5cbiAgICBpZiAoIXRleHQgJiYgIXBhaW50ZXIuc3R5bGUuc3ByaXRlLmxvYWRlZCgpKVxuICAgICAgICByZXR1cm47XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcblxuICAgIGlmIChzZGYpIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5zZGZTaGFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hhZGVyID0gcGFpbnRlci5pY29uU2hhZGVyO1xuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHBhaW50ZXIuZ2x5cGhBdGxhcy51cGRhdGVUZXh0dXJlKGdsKTtcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmdseXBoVmVydGV4O1xuICAgICAgICBlbGVtZW50cyA9IHRpbGUuYnVmZmVycy5nbHlwaEVsZW1lbnQ7XG4gICAgICAgIHRleHNpemUgPSBbcGFpbnRlci5nbHlwaEF0bGFzLndpZHRoIC8gNCwgcGFpbnRlci5nbHlwaEF0bGFzLmhlaWdodCAvIDRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgYWxpZ25lZFdpdGhNYXAgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8XG4gICAgICAgICAgICBwYWludGVyLm9wdGlvbnMuem9vbWluZyB8fCBmb250U2NhbGUgIT09IDEgfHwgc2RmIHx8IHBhaW50ZXIudHJhbnNmb3JtLnBpdGNoKTtcbiAgICAgICAgdmVydGV4ID0gdGlsZS5idWZmZXJzLmljb25WZXJ0ZXg7XG4gICAgICAgIGVsZW1lbnRzID0gdGlsZS5idWZmZXJzLmljb25FbGVtZW50O1xuICAgICAgICB0ZXhzaXplID0gW3BhaW50ZXIuc3ByaXRlQXRsYXMud2lkdGggLyA0LCBwYWludGVyLnNwcml0ZUF0bGFzLmhlaWdodCAvIDRdO1xuICAgIH1cblxuICAgIGdsLnN3aXRjaFNoYWRlcihzaGFkZXIsIHBvc01hdHJpeCwgZXhNYXRyaXgpO1xuICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV90ZXh0dXJlLCAwKTtcbiAgICBnbC51bmlmb3JtMmZ2KHNoYWRlci51X3RleHNpemUsIHRleHNpemUpO1xuICAgIGdsLnVuaWZvcm0xaShzaGFkZXIudV9za2V3ZWQsIHNrZXdlZCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X2V4dHJhLCBleHRyYSk7XG5cbiAgICAvLyBhZGp1c3QgbWluL21heCB6b29tcyBmb3IgdmFyaWFibGUgZm9udCBzaWVzXG4gICAgdmFyIHpvb21BZGp1c3QgPSBNYXRoLmxvZyhmb250U2l6ZSAvIGxheWVyLmxheW91dFtwcmVmaXggKyAnLW1heC1zaXplJ10pIC8gTWF0aC5MTjIgfHwgMDtcblxuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV96b29tLCAocGFpbnRlci50cmFuc2Zvcm0uem9vbSAtIHpvb21BZGp1c3QpICogMTApOyAvLyBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgIHZhciBmID0gcGFpbnRlci5mcmFtZUhpc3RvcnkuZ2V0RmFkZVByb3BlcnRpZXMoMzAwKTtcbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZWRpc3QsIGYuZmFkZWRpc3QgKiAxMCk7XG4gICAgZ2wudW5pZm9ybTFmKHNoYWRlci51X21pbmZhZGV6b29tLCBNYXRoLmZsb29yKGYubWluZmFkZXpvb20gKiAxMCkpO1xuICAgIGdsLnVuaWZvcm0xZihzaGFkZXIudV9tYXhmYWRlem9vbSwgTWF0aC5mbG9vcihmLm1heGZhZGV6b29tICogMTApKTtcbiAgICBnbC51bmlmb3JtMWYoc2hhZGVyLnVfZmFkZXpvb20sIChwYWludGVyLnRyYW5zZm9ybS56b29tICsgZi5idW1wKSAqIDEwKTtcblxuICAgIHZhciBncm91cCwgb2Zmc2V0LCBjb3VudCwgZWxlbWVudE9mZnNldDtcblxuICAgIGVsZW1lbnRzLmJpbmQoZ2wpO1xuXG4gICAgaWYgKHNkZikge1xuICAgICAgICB2YXIgc2RmUHggPSA4O1xuICAgICAgICB2YXIgYmx1ck9mZnNldCA9IDEuMTk7XG4gICAgICAgIHZhciBoYWxvT2Zmc2V0ID0gNjtcbiAgICAgICAgdmFyIGdhbW1hID0gMC4xMDUgKiBkZWZhdWx0U2l6ZXNbcHJlZml4XSAvIGZvbnRTaXplIC8gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9nYW1tYSk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2dhbW1hLCBnYW1tYSAqIGdhbW1hU2NhbGUpO1xuXG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShzaGFkZXIuYV9jb2xvcik7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1jb2xvciddKTtcblxuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfYnVmZmVyKTtcbiAgICAgICAgZ2wudmVydGV4QXR0cmliMWYoc2hhZGVyLmFfYnVmZmVyLCAoMjU2IC0gNjQpIC8gMjU2KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRHcm91cHMuZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBncm91cCA9IGVsZW1lbnRHcm91cHMuZ3JvdXBzW2ldO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZ3JvdXAudmVydGV4U3RhcnRJbmRleCAqIHZlcnRleC5pdGVtU2l6ZTtcbiAgICAgICAgICAgIHZlcnRleC5iaW5kKGdsLCBzaGFkZXIsIG9mZnNldCk7XG5cbiAgICAgICAgICAgIGNvdW50ID0gZ3JvdXAuZWxlbWVudExlbmd0aCAqIDM7XG4gICAgICAgICAgICBlbGVtZW50T2Zmc2V0ID0gZ3JvdXAuZWxlbWVudFN0YXJ0SW5kZXggKiBlbGVtZW50cy5pdGVtU2l6ZTtcbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWNvbG9yJ10pIHtcblxuICAgICAgICAgICAgLy8gdmVydGV4IGF0dHJpYiBhcnJheXMgZGlzYWJsZWQgYWJvdmVcbiAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjRmdihzaGFkZXIuYV9jb2xvciwgbGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWNvbG9yJ10pO1xuICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliMWYoc2hhZGVyLmFfYnVmZmVyLCAoaGFsb09mZnNldCAtIGxheWVyLnBhaW50W3ByZWZpeCArICctaGFsby13aWR0aCddIC8gZm9udFNjYWxlKSAvIHNkZlB4KTtcbiAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX2dhbW1hLCAobGF5ZXIucGFpbnRbcHJlZml4ICsgJy1oYWxvLWJsdXInXSAqIGJsdXJPZmZzZXQgLyBmb250U2NhbGUgLyBzZGZQeCArIGdhbW1hKSAqIGdhbW1hU2NhbGUpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZW1lbnRHcm91cHMuZ3JvdXBzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1tqXTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBncm91cC52ZXJ0ZXhTdGFydEluZGV4ICogdmVydGV4Lml0ZW1TaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleC5iaW5kKGdsLCBzaGFkZXIsIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICBjb3VudCA9IGdyb3VwLmVsZW1lbnRMZW5ndGggKiAzO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQgPSBncm91cC5lbGVtZW50U3RhcnRJbmRleCAqIGVsZW1lbnRzLml0ZW1TaXplO1xuICAgICAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGNvdW50LCBnbC5VTlNJR05FRF9TSE9SVCwgZWxlbWVudE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoc2hhZGVyLmFfb3BhY2l0eSk7XG4gICAgICAgIGdsLnZlcnRleEF0dHJpYjFmKHNoYWRlci5hX29wYWNpdHksIGxheWVyLnBhaW50WydpY29uLW9wYWNpdHknXSk7XG5cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtZW50R3JvdXBzLmdyb3Vwcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgZ3JvdXAgPSBlbGVtZW50R3JvdXBzLmdyb3Vwc1trXTtcbiAgICAgICAgICAgIG9mZnNldCA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXggKiB2ZXJ0ZXguaXRlbVNpemU7XG4gICAgICAgICAgICB2ZXJ0ZXguYmluZChnbCwgc2hhZGVyLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICBjb3VudCA9IGdyb3VwLmVsZW1lbnRMZW5ndGggKiAzO1xuICAgICAgICAgICAgZWxlbWVudE9mZnNldCA9IGdyb3VwLmVsZW1lbnRTdGFydEluZGV4ICogZWxlbWVudHMuaXRlbVNpemU7XG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBjb3VudCwgZ2wuVU5TSUdORURfU0hPUlQsIGVsZW1lbnRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIG1hdDQgPSByZXF1aXJlKCdnbC1tYXRyaXgnKS5tYXQ0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdWZXJ0aWNlcztcblxuZnVuY3Rpb24gZHJhd1ZlcnRpY2VzKHBhaW50ZXIsIGxheWVyLCBwb3NNYXRyaXgsIHRpbGUpIHtcbiAgICB2YXIgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgaWYgKCF0aWxlIHx8ICF0aWxlLmJ1ZmZlcnMpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHRpbGUuZWxlbWVudEdyb3Vwc1tsYXllci5yZWYgfHwgbGF5ZXIuaWRdO1xuICAgIGlmICghZWxlbWVudEdyb3VwcykgcmV0dXJuO1xuXG4gICAgLy8gQmxlbmQgdG8gdGhlIGZyb250LCBub3QgdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAvLyBEcmF3IGFsbCBidWZmZXJzXG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdmaWxsJykge1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5maWxsVmVydGV4LCBlbGVtZW50R3JvdXBzLmdyb3VwcywgcG9zTWF0cml4LCA0KTtcbiAgICB9IGVsc2UgaWYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGRyYXdQb2ludHModGlsZS5idWZmZXJzLmljb25WZXJ0ZXgsIGVsZW1lbnRHcm91cHMuaWNvbi5ncm91cHMsIHBvc01hdHJpeCwgMTYpO1xuICAgICAgICBkcmF3UG9pbnRzKHRpbGUuYnVmZmVycy5nbHlwaFZlcnRleCwgZWxlbWVudEdyb3Vwcy50ZXh0Lmdyb3VwcywgcG9zTWF0cml4LCAxNik7XG4gICAgfSBlbHNlIGlmIChsYXllci50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgdmFyIG5ld1Bvc01hdHJpeCA9IG1hdDQuY2xvbmUocG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC5zY2FsZShuZXdQb3NNYXRyaXgsIG5ld1Bvc01hdHJpeCwgWzAuNSwgMC41LCAxXSk7XG4gICAgICAgIGRyYXdQb2ludHModGlsZS5idWZmZXJzLmxpbmVWZXJ0ZXgsIGVsZW1lbnRHcm91cHMuZ3JvdXBzLCBuZXdQb3NNYXRyaXgsIDgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRyYXdQb2ludHModmVydGV4LCBncm91cHMsIG1hdHJpeCwgc3RyaWRlKSB7XG4gICAgICAgIGdsLnN3aXRjaFNoYWRlcihwYWludGVyLmRvdFNoYWRlciwgbWF0cml4KTtcblxuICAgICAgICBnbC51bmlmb3JtMWYocGFpbnRlci5kb3RTaGFkZXIudV9zaXplLCA0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHBhaW50ZXIuZG90U2hhZGVyLnVfYmx1ciwgMC4yNSk7XG4gICAgICAgIGdsLnVuaWZvcm00ZnYocGFpbnRlci5kb3RTaGFkZXIudV9jb2xvciwgWzAuMSwgMCwgMCwgMC4xXSk7XG5cbiAgICAgICAgdmVydGV4LmJpbmQoZ2wsIHBhaW50ZXIuZG90U2hhZGVyLCAwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgICAgIHZhciBiZWdpbiA9IGdyb3VwLnZlcnRleFN0YXJ0SW5kZXg7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBncm91cC52ZXJ0ZXhMZW5ndGg7XG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBhaW50ZXIuZG90U2hhZGVyLmFfcG9zLCAyLCBnbC5TSE9SVCwgZmFsc2UsIHN0cmlkZSwgMCk7XG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgYmVnaW4sIGNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldmVydCBibGVuZGluZyBtb2RlIHRvIGJsZW5kIHRvIHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLCBnbC5PTkUpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lSGlzdG9yeTtcblxuZnVuY3Rpb24gRnJhbWVIaXN0b3J5KCkge1xuICAgIHRoaXMuZnJhbWVIaXN0b3J5ID0gW107XG59XG5cbkZyYW1lSGlzdG9yeS5wcm90b3R5cGUuZ2V0RmFkZVByb3BlcnRpZXMgPSBmdW5jdGlvbihkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSBkdXJhdGlvbiA9IDMwMDtcbiAgICB2YXIgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuXG4gICAgLy8gUmVtb3ZlIGZyYW1lcyB1bnRpbCBvbmx5IG9uZSBpcyBvdXRzaWRlIHRoZSBkdXJhdGlvbiwgb3IgdW50aWwgdGhlcmUgYXJlIG9ubHkgdGhyZWVcbiAgICB3aGlsZSAodGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoID4gMyAmJiB0aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lICsgZHVyYXRpb24gPCBjdXJyZW50VGltZSkge1xuICAgICAgICB0aGlzLmZyYW1lSGlzdG9yeS5zaGlmdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lICsgZHVyYXRpb24gPCBjdXJyZW50VGltZSkge1xuICAgICAgICB0aGlzLmZyYW1lSGlzdG9yeVswXS56ID0gdGhpcy5mcmFtZUhpc3RvcnlbMV0uejtcbiAgICB9XG5cbiAgICB2YXIgZnJhbWVMZW4gPSB0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGg7XG4gICAgaWYgKGZyYW1lTGVuIDwgMykgY29uc29sZS53YXJuKCd0aGVyZSBzaG91bGQgbmV2ZXIgYmUgbGVzcyB0aGFuIHRocmVlIGZyYW1lcyBpbiB0aGUgaGlzdG9yeScpO1xuXG4gICAgLy8gRmluZCB0aGUgcmFuZ2Ugb2Ygem9vbSBsZXZlbHMgd2Ugd2FudCB0byBmYWRlIGJldHdlZW5cbiAgICB2YXIgc3RhcnRpbmdaID0gdGhpcy5mcmFtZUhpc3RvcnlbMF0ueixcbiAgICAgICAgbGFzdEZyYW1lID0gdGhpcy5mcmFtZUhpc3RvcnlbZnJhbWVMZW4gLSAxXSxcbiAgICAgICAgZW5kaW5nWiA9IGxhc3RGcmFtZS56LFxuICAgICAgICBsb3daID0gTWF0aC5taW4oc3RhcnRpbmdaLCBlbmRpbmdaKSxcbiAgICAgICAgaGlnaFogPSBNYXRoLm1heChzdGFydGluZ1osIGVuZGluZ1opO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBzcGVlZCBvZiB6b29taW5nLCBhbmQgaG93IGZhciBpdCB3b3VsZCB6b29tIGluIHRlcm1zIG9mIHpvb20gbGV2ZWxzIGluIG9uZSBkdXJhdGlvblxuICAgIHZhciB6b29tRGlmZiA9IGxhc3RGcmFtZS56IC0gdGhpcy5mcmFtZUhpc3RvcnlbMV0ueixcbiAgICAgICAgdGltZURpZmYgPSBsYXN0RnJhbWUudGltZSAtIHRoaXMuZnJhbWVIaXN0b3J5WzFdLnRpbWU7XG4gICAgdmFyIGZhZGVkaXN0ID0gem9vbURpZmYgLyAodGltZURpZmYgLyBkdXJhdGlvbik7XG5cbiAgICBpZiAoaXNOYU4oZmFkZWRpc3QpKSBjb25zb2xlLndhcm4oJ2ZhZGVkaXN0IHNob3VsZCBuZXZlciBiZSBOYU4nKTtcblxuICAgIC8vIEF0IGVuZCBvZiBhIHpvb20gd2hlbiB0aGUgem9vbSBzdG9wcyBjaGFuZ2luZyBjb250aW51ZSBwcmV0ZW5kaW5nIHRvIHpvb20gYXQgdGhhdCBzcGVlZFxuICAgIC8vIGJ1bXAgaXMgaG93IG11Y2ggZmFydGhlciBpdCB3b3VsZCBoYXZlIGJlZW4gaWYgaXQgaGFkIGNvbnRpbnVlZCB6b29taW5nIGF0IHRoZSBzYW1lIHJhdGVcbiAgICB2YXIgYnVtcCA9IChjdXJyZW50VGltZSAtIGxhc3RGcmFtZS50aW1lKSAvIGR1cmF0aW9uICogZmFkZWRpc3Q7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmYWRlZGlzdDogZmFkZWRpc3QsXG4gICAgICAgIG1pbmZhZGV6b29tOiBsb3daLFxuICAgICAgICBtYXhmYWRlem9vbTogaGlnaFosXG4gICAgICAgIGJ1bXA6IGJ1bXBcbiAgICB9O1xufTtcblxuLy8gUmVjb3JkIGZyYW1lIGhpc3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIGZhZGluZyBwYXJhbXNcbkZyYW1lSGlzdG9yeS5wcm90b3R5cGUucmVjb3JkID0gZnVuY3Rpb24oem9vbSkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cbiAgICAvLyBmaXJzdCBmcmFtZSBldmVyXG4gICAgaWYgKCF0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnkucHVzaCh7dGltZTogMCwgejogem9vbSB9LCB7dGltZTogMCwgejogem9vbSB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RoID09PSAyIHx8IHRoaXMuZnJhbWVIaXN0b3J5W3RoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aCAtIDFdLnogIT09IHpvb20pIHtcbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnkucHVzaCh7XG4gICAgICAgICAgICB0aW1lOiBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIHo6IHpvb21cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNoYWRlcnMgPSByZXF1aXJlKCcuL3NoYWRlcnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIHZhciBvcmlnTGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGgsXG4gICAgICAgIGxpbmVXaWR0aFJhbmdlID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoY29udGV4dC5BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UpO1xuXG4gICAgY29udGV4dC5saW5lV2lkdGggPSBmdW5jdGlvbih3aWR0aCkge1xuICAgICAgICBvcmlnTGluZVdpZHRoLmNhbGwoY29udGV4dCwgdXRpbC5jbGFtcCh3aWR0aCwgbGluZVdpZHRoUmFuZ2VbMF0sIGxpbmVXaWR0aFJhbmdlWzFdKSk7XG4gICAgfTtcblxuICAgIGNvbnRleHQuZ2V0U2hhZGVyID0gZnVuY3Rpb24obmFtZSwgdHlwZSkge1xuICAgICAgICB2YXIga2luZCA9IHR5cGUgPT09IHRoaXMuRlJBR01FTlRfU0hBREVSID8gJ2ZyYWdtZW50JyA6ICd2ZXJ0ZXgnO1xuICAgICAgICBpZiAoIXNoYWRlcnNbbmFtZV0gfHwgIXNoYWRlcnNbbmFtZV1ba2luZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHNoYWRlciBcIiArIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNoYWRlciA9IHRoaXMuY3JlYXRlU2hhZGVyKHR5cGUpO1xuICAgICAgICB2YXIgc2hhZGVyU291cmNlID0gc2hhZGVyc1tuYW1lXVtraW5kXTtcblxuICAgICAgICBpZiAodHlwZW9mIG9yaWVudGF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gb25seSB1c2UgaGlnaHAgcHJlY2lzaW9uIG9uIG1vYmlsZSBicm93c2Vyc1xuICAgICAgICAgICAgc2hhZGVyU291cmNlID0gc2hhZGVyU291cmNlLnJlcGxhY2UoLyBoaWdocCAvZywgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhZGVyU291cmNlKHNoYWRlciwgc2hhZGVyU291cmNlKTtcbiAgICAgICAgdGhpcy5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gICAgICAgIGlmICghdGhpcy5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCB0aGlzLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hhZGVyO1xuICAgIH07XG5cbiAgICBjb250ZXh0LmluaXRpYWxpemVTaGFkZXIgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB1bmlmb3Jtcykge1xuICAgICAgICB2YXIgc2hhZGVyID0ge1xuICAgICAgICAgICAgcHJvZ3JhbTogdGhpcy5jcmVhdGVQcm9ncmFtKCksXG4gICAgICAgICAgICBmcmFnbWVudDogdGhpcy5nZXRTaGFkZXIobmFtZSwgdGhpcy5GUkFHTUVOVF9TSEFERVIpLFxuICAgICAgICAgICAgdmVydGV4OiB0aGlzLmdldFNoYWRlcihuYW1lLCB0aGlzLlZFUlRFWF9TSEFERVIpLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hdHRhY2hTaGFkZXIoc2hhZGVyLnByb2dyYW0sIHNoYWRlci52ZXJ0ZXgpO1xuICAgICAgICB0aGlzLmF0dGFjaFNoYWRlcihzaGFkZXIucHJvZ3JhbSwgc2hhZGVyLmZyYWdtZW50KTtcblxuICAgICAgICAvLyBEaXNhYmxpbmcgYXR0cmliIGxvY2F0aW9uIDAgY2F1c2VzIHdlaXJkIGJlaGF2aW91ci4gVG8gYXZvaWQgdGhlIHByb2JsZW0sIHdlIGFzc2lnblxuICAgICAgICAvLyAnYV9wb3MnIHRvIGF0dHJpYiBsb2NhdGlvbiAwIG1ha2luZyB0aGUgYXNzdW1wdGlvbnMgdGhhdFxuICAgICAgICAvL1xuICAgICAgICAvLyAgIC0gYGFfcG9zYCBpcyBuZXZlciBkaXNhYmxlZFxuICAgICAgICAvLyAgIC0gZXZlcnkgc2hhZGVyIGhhcyBhbiBgYV9wb3NgIGF0dHJpYnV0ZVxuICAgICAgICAvL1xuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYkdML1dlYkdMX2Jlc3RfcHJhY3RpY2VzXG4gICAgICAgIHRoaXMuYmluZEF0dHJpYkxvY2F0aW9uKHNoYWRlci5wcm9ncmFtLCAwLCAnYV9wb3MnKTtcblxuICAgICAgICB0aGlzLmxpbmtQcm9ncmFtKHNoYWRlci5wcm9ncmFtKTtcblxuICAgICAgICBpZiAoIXRoaXMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihzaGFkZXIucHJvZ3JhbSwgdGhpcy5MSU5LX1NUQVRVUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5nZXRQcm9ncmFtSW5mb0xvZyhzaGFkZXIucHJvZ3JhbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2hhZGVyW2F0dHJpYnV0ZXNbaV1dID0gdGhpcy5nZXRBdHRyaWJMb2NhdGlvbihzaGFkZXIucHJvZ3JhbSwgYXR0cmlidXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgc2hhZGVyLmF0dHJpYnV0ZXMucHVzaChzaGFkZXJbYXR0cmlidXRlc1tpXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB1bmlmb3Jtcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHNoYWRlclt1bmlmb3Jtc1trXV0gPSB0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihzaGFkZXIucHJvZ3JhbSwgdW5pZm9ybXNba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoYWRlcjtcbiAgICB9O1xuXG4gICAgLy8gU3dpdGNoZXMgdG8gYSBkaWZmZXJlbnQgc2hhZGVyIHByb2dyYW0uXG4gICAgY29udGV4dC5zd2l0Y2hTaGFkZXIgPSBmdW5jdGlvbihzaGFkZXIsIHBvc01hdHJpeCwgZXhNYXRyaXgpIHtcbiAgICAgICAgaWYgKCFwb3NNYXRyaXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJ3Bvc01hdHJpeCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2hhZGVyICE9PSBzaGFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXNlUHJvZ3JhbShzaGFkZXIucHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYWxsIGF0dHJpYnV0ZSBhcnJheXMgdXNlZCBieSB0aGUgcHJldmlvdXMgc2hhZGVyIGFuZCBlbmFibGUgYWxsIHRoZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIC8vIGFycmF5cyB1c2VkIGJ5IHRoZSBuZXh0IHNoYWRlci4gSWRlYWxseSB3ZSB3b3VsZCBkbyBhIGJldHRlciBqb2IgZGlmZmluZyB0aGVzZSB0b1xuICAgICAgICAgICAgLy8gbWluaW1pemUgb3BlcmF0aW9ucyAoYXMgd2UgZGlkIGluIHByZXZpb3VzbHkpIGJ1dCBpdCBpcyBoYXJkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGVcbiAgICAgICAgICAgIC8vIGluIHNwYWdoZXR0aSBzaGFkZXIgYm9pbGVycGxhdGUgY29kZSBhbmQgaGFyZCB0byBkZWJ1ZyB3aGVuIHRoaW5ncyBnbyB3cm9uZy5cbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuY3VycmVudFNoYWRlciA/IHRoaXMuY3VycmVudFNoYWRlci5hdHRyaWJ1dGVzIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZpb3VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocHJldmlvdXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5leHQgPSBzaGFkZXIuYXR0cmlidXRlcztcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobmV4dFtqXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNoYWRlciA9IHNoYWRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWF0cmljZXMgaWYgbmVjZXNzYXJ5LiBOb3RlOiBUaGlzIHJlbGllcyBvbiBvYmplY3QgaWRlbnRpdHkhXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgY2hhbmdpbmcgdGhlIG1hdHJpeCB2YWx1ZXMgd2l0aG91dCB0aGUgYWN0dWFsIG1hdHJpeCBvYmplY3RcbiAgICAgICAgLy8gd2lsbCBGQUlMIHRvIHVwZGF0ZSB0aGUgbWF0cml4IHByb3Blcmx5LlxuICAgICAgICBpZiAoc2hhZGVyLnBvc01hdHJpeCAhPT0gcG9zTWF0cml4KSB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoc2hhZGVyLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcbiAgICAgICAgICAgIHNoYWRlci5wb3NNYXRyaXggPSBwb3NNYXRyaXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4TWF0cml4ICYmIHNoYWRlci5leE1hdHJpeCAhPT0gZXhNYXRyaXggJiYgc2hhZGVyLnVfZXhtYXRyaXgpIHtcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybU1hdHJpeDRmdihzaGFkZXIudV9leG1hdHJpeCwgZmFsc2UsIGV4TWF0cml4KTtcbiAgICAgICAgICAgIHNoYWRlci5leE1hdHJpeCA9IGV4TWF0cml4O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnRleHQudmVydGV4QXR0cmliMmZ2ID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29udGV4dC52ZXJ0ZXhBdHRyaWIyZihhdHRyaWJ1dGUsIHZhbHVlc1swXSwgdmFsdWVzWzFdKTtcbiAgICB9O1xuXG4gICAgY29udGV4dC52ZXJ0ZXhBdHRyaWIzZnYgPSBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVlcykge1xuICAgICAgICBjb250ZXh0LnZlcnRleEF0dHJpYjNmKGF0dHJpYnV0ZSwgdmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7XG4gICAgfTtcblxuICAgIGNvbnRleHQudmVydGV4QXR0cmliNGZ2ID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29udGV4dC52ZXJ0ZXhBdHRyaWI0ZihhdHRyaWJ1dGUsIHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0sIHZhbHVlc1szXSk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb250ZXh0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQXRsYXM7XG5cbi8qKlxuICogTXVjaCBsaWtlIGEgR2x5cGhBdGxhcywgYSBMaW5lQXRsYXMgbGV0cyB1cyByZXVzZSByZW5kZXJlZCBkYXNoZWQgbGluZXNcbiAqIGJ5IHdyaXRpbmcgbWFueSBvZiB0aGVtIHRvIGEgdGV4dHVyZSBhbmQgdGhlbiBmZXRjaGluZyB0aGVpciBwb3NpdGlvbnNcbiAqIHVzaW5nIC5nZXREYXNoLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gTGluZUF0bGFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5uZXh0Um93ID0gMDtcblxuICAgIHRoaXMuYnl0ZXMgPSA0O1xuICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIHRoaXMuYnl0ZXMpO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSB7fTtcbn1cblxuTGluZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGUgPSBmdW5jdGlvbihzcHJpdGUpIHtcbiAgICB0aGlzLnNwcml0ZSA9IHNwcml0ZTtcbn07XG5cbi8qKlxuICogR2V0IG9yIGNyZWF0ZSBhIGRhc2ggbGluZSBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJvdW5kIHdoZXRoZXIgdG8gYWRkIGNpcmNsZSBjYXBzIGluIGJldHdlZW4gZGFzaCBzZWdtZW50c1xuICogQHJldHVybnMge09iamVjdH0gcG9zaXRpb24gb2YgZGFzaCB0ZXh0dXJlIGluIHsgeSwgaGVpZ2h0LCB3aWR0aCB9XG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lQXRsYXMucHJvdG90eXBlLmdldERhc2ggPSBmdW5jdGlvbihkYXNoYXJyYXksIHJvdW5kKSB7XG4gICAgdmFyIGtleSA9IGRhc2hhcnJheS5qb2luKFwiLFwiKSArIHJvdW5kO1xuXG4gICAgaWYgKCF0aGlzLnBvc2l0aW9uc1trZXldKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25zW2tleV0gPSB0aGlzLmFkZERhc2goZGFzaGFycmF5LCByb3VuZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uc1trZXldO1xufTtcblxuTGluZUF0bGFzLnByb3RvdHlwZS5hZGREYXNoID0gZnVuY3Rpb24oZGFzaGFycmF5LCByb3VuZCkge1xuXG4gICAgdmFyIG4gPSByb3VuZCA/IDcgOiAwO1xuICAgIHZhciBoZWlnaHQgPSAyICogbiArIDE7XG4gICAgdmFyIG9mZnNldCA9IDEyODtcblxuICAgIGlmICh0aGlzLm5leHRSb3cgKyBoZWlnaHQgPiB0aGlzLmhlaWdodCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0xpbmVBdGxhcyBvdXQgb2Ygc3BhY2UnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGVuZ3RoICs9IGRhc2hhcnJheVtpXTtcbiAgICB9XG5cbiAgICB2YXIgc3RyZXRjaCA9IHRoaXMud2lkdGggLyBsZW5ndGg7XG4gICAgdmFyIGhhbGZXaWR0aCA9IHN0cmV0Y2ggLyAyO1xuXG4gICAgLy8gSWYgZGFzaGFycmF5IGhhcyBhbiBvZGQgbGVuZ3RoLCBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwYXJ0c1xuICAgIC8vIGFyZSBkYXNoZXMgYW5kIHNob3VsZCBiZSBqb2luZWQgc2VhbWxlc3NseS5cbiAgICB2YXIgb2RkTGVuZ3RoID0gZGFzaGFycmF5Lmxlbmd0aCAlIDIgPT09IDE7XG5cbiAgICBmb3IgKHZhciB5ID0gLW47IHkgPD0gbjsgeSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLm5leHRSb3cgKyBuICsgeTtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy53aWR0aCAqIHJvdztcblxuICAgICAgICB2YXIgbGVmdCA9IG9kZExlbmd0aCA/IC1kYXNoYXJyYXlbZGFzaGFycmF5Lmxlbmd0aCAtIDFdIDogMDtcbiAgICAgICAgdmFyIHJpZ2h0ID0gZGFzaGFycmF5WzBdO1xuICAgICAgICB2YXIgcGFydEluZGV4ID0gMTtcblxuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuXG4gICAgICAgICAgICB3aGlsZSAocmlnaHQgPCB4IC8gc3RyZXRjaCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICsgZGFzaGFycmF5W3BhcnRJbmRleF07XG5cbiAgICAgICAgICAgICAgICBpZiAob2RkTGVuZ3RoICYmIHBhcnRJbmRleCA9PT0gZGFzaGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgKz0gZGFzaGFycmF5WzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGlzdExlZnQgPSBNYXRoLmFicyh4IC0gbGVmdCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgdmFyIGRpc3RSaWdodCA9IE1hdGguYWJzKHggLSByaWdodCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgdmFyIGRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgIHZhciBpbnNpZGUgPSAocGFydEluZGV4ICUgMikgPT09IDE7XG4gICAgICAgICAgICB2YXIgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBjaXJjbGUgY2Fwc1xuICAgICAgICAgICAgICAgIHZhciBkaXN0TWlkZGxlID0gbiA/IHkgLyBuICogKGhhbGZXaWR0aCArIDEpIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0RWRnZSA9IGhhbGZXaWR0aCAtIE1hdGguYWJzKGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IE1hdGguc3FydChkaXN0ICogZGlzdCArIGRpc3RFZGdlICogZGlzdEVkZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gaGFsZldpZHRoIC0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0ICsgZGlzdE1pZGRsZSAqIGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSAoaW5zaWRlID8gMSA6IC0xKSAqIGRpc3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YVszICsgKGluZGV4ICsgeCkgKiA0XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwb3MgPSB7XG4gICAgICAgIHk6ICh0aGlzLm5leHRSb3cgKyBuICsgMC41KSAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICBoZWlnaHQ6IDIgKiBuIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBsZW5ndGhcbiAgICB9O1xuXG4gICAgdGhpcy5uZXh0Um93ICs9IGhlaWdodDtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgIHJldHVybiBwb3M7XG59O1xuXG5MaW5lQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCkge1xuICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuUkVQRUFUKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcblxuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkxpbmVBdGxhcy5wcm90b3R5cGUuZGVidWcgPSBmdW5jdGlvbigpIHtcblxuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICBjYW52YXMuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmYwJztcblxuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG4gICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuc2RmKSB7XG4gICAgICAgICAgICB2YXIgayA9IGkgKiA0O1xuICAgICAgICAgICAgZGF0YS5kYXRhW2tdID0gZGF0YS5kYXRhW2sgKyAxXSA9IGRhdGEuZGF0YVtrICsgMl0gPSAwO1xuICAgICAgICAgICAgZGF0YS5kYXRhW2sgKyAzXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuZGF0YVtpXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdHgucHV0SW1hZ2VEYXRhKGRhdGEsIDAsIDApO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdsdXRpbCA9IHJlcXVpcmUoJy4vZ2xfdXRpbCcpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBtYXQ0ID0gcmVxdWlyZSgnZ2wtbWF0cml4JykubWF0NDtcbnZhciBGcmFtZUhpc3RvcnkgPSByZXF1aXJlKCcuL2ZyYW1lX2hpc3RvcnknKTtcblxuLypcbiAqIEluaXRpYWxpemUgYSBuZXcgcGFpbnRlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtDYW52YXN9IGdsIGFuIGV4cGVyaW1lbnRhbC13ZWJnbCBkcmF3aW5nIGNvbnRleHRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQYWludGVyO1xuZnVuY3Rpb24gUGFpbnRlcihnbCwgdHJhbnNmb3JtKSB7XG4gICAgdGhpcy5nbCA9IGdsdXRpbC5leHRlbmQoZ2wpO1xuICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzID0ge307XG4gICAgdGhpcy5wcmVGYm9zID0ge307XG5cbiAgICB0aGlzLmZyYW1lSGlzdG9yeSA9IG5ldyBGcmFtZUhpc3RvcnkoKTtcblxuICAgIHRoaXMuc2V0dXAoKTtcbn1cblxuLypcbiAqIFVwZGF0ZSB0aGUgR0wgdmlld3BvcnQsIHByb2plY3Rpb24gbWF0cml4LCBhbmQgdHJhbnNmb3JtcyB0byBjb21wZW5zYXRlXG4gKiBmb3IgYSBuZXcgd2lkdGggYW5kIGhlaWdodCB2YWx1ZS5cbiAqL1xuUGFpbnRlci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG59O1xuXG5cblBhaW50ZXIucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgIGdsLnZlcmJvc2UgPSB0cnVlO1xuXG4gICAgLy8gV2UgYXJlIGJsZW5kaW5nIHRoZSBuZXcgcGl4ZWxzICpiZWhpbmQqIHRoZSBleGlzdGluZyBwaXhlbHMuIFRoYXQgd2F5IHdlIGNhblxuICAgIC8vIGRyYXcgZnJvbnQtdG8tYmFjayBhbmQgdXNlIHRoZW4gc3RlbmNpbCBidWZmZXIgdG8gY3VsbCBvcGFxdWUgcGl4ZWxzIGVhcmx5LlxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLk9ORSk7XG5cbiAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2hhZGVyc1xuICAgIHRoaXMuZGVidWdTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdkZWJ1ZycsXG4gICAgICAgIFsnYV9wb3MnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3BvaW50c2l6ZScsICd1X2NvbG9yJ10pO1xuXG4gICAgdGhpcy5nYXVzc2lhblNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2dhdXNzaWFuJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfaW1hZ2UnLCAndV9vZmZzZXQnXSk7XG5cbiAgICB0aGlzLnJhc3RlclNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ3Jhc3RlcicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV90ZXh0dXJlX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfYnJpZ2h0bmVzc19sb3cnLCAndV9icmlnaHRuZXNzX2hpZ2gnLCAndV9zYXR1cmF0aW9uX2ZhY3RvcicsICd1X3NwaW5fd2VpZ2h0cycsICd1X2NvbnRyYXN0X2ZhY3RvcicsICd1X29wYWNpdHkwJywgJ3Vfb3BhY2l0eTEnLCAndV9pbWFnZTAnLCAndV9pbWFnZTEnLCAndV90bF9wYXJlbnQnLCAndV9zY2FsZV9wYXJlbnQnLCAndV9idWZmZXJfc2NhbGUnXSk7XG5cbiAgICB0aGlzLmxpbmVTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdsaW5lJyxcbiAgICAgICAgWydhX3BvcycsICdhX2RhdGEnLCAnYV9jb2xvcicsICdhX2xpbmV3aWR0aCcsICdhX2JsdXInXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3JhdGlvJywgJ3VfZXh0cmEnLCAndV9hbnRpYWxpYXNpbmdtYXRyaXgnXSk7XG5cbiAgICB0aGlzLmxpbmVwYXR0ZXJuU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignbGluZXBhdHRlcm4nLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZGF0YScsICdhX2xpbmV3aWR0aCcsICdhX2JsdXInLCAnYV9vcGFjaXR5J10sXG4gICAgICAgIFsndV9tYXRyaXgnLCAndV9leG1hdHJpeCcsICd1X3JhdGlvJywgJ3VfcGF0dGVybl9zaXplX2EnLCAndV9wYXR0ZXJuX3NpemVfYicsICd1X3BhdHRlcm5fdGxfYScsICd1X3BhdHRlcm5fYnJfYScsICd1X3BhdHRlcm5fdGxfYicsICd1X3BhdHRlcm5fYnJfYicsICd1X2ZhZGUnXSk7XG5cbiAgICB0aGlzLmxpbmVzZGZwYXR0ZXJuU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignbGluZXNkZnBhdHRlcm4nLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZGF0YScsICdhX2NvbG9yJywgJ2FfbGluZXdpZHRoJywgJ2FfYmx1ciddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV9yYXRpbycsICd1X3BhdHRlcm5zY2FsZV9hJywgJ3VfdGV4X3lfYScsICd1X3BhdHRlcm5zY2FsZV9iJywgJ3VfdGV4X3lfYicsICd1X2ltYWdlJywgJ3Vfc2RmZ2FtbWEnLCAndV9taXgnXSk7XG5cbiAgICB0aGlzLmRvdFNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ2RvdCcsXG4gICAgICAgIFsnYV9wb3MnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3NpemUnLCAndV9jb2xvcicsICd1X2JsdXInXSk7XG5cbiAgICB0aGlzLnNkZlNoYWRlciA9IGdsLmluaXRpYWxpemVTaGFkZXIoJ3NkZicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9vZmZzZXQnLCAnYV9kYXRhMScsICdhX2RhdGEyJywgJ2FfY29sb3InLCAnYV9idWZmZXInLCAnYV9nYW1tYSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV90ZXh0dXJlJywgJ3VfdGV4c2l6ZScsICd1X3pvb20nLCAndV9mYWRlZGlzdCcsICd1X21pbmZhZGV6b29tJywgJ3VfbWF4ZmFkZXpvb20nLCAndV9mYWRlem9vbScsICd1X3NrZXdlZCcsICd1X2V4dHJhJ10pO1xuXG4gICAgdGhpcy5pY29uU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignaWNvbicsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9vZmZzZXQnLCAnYV9kYXRhMScsICdhX2RhdGEyJywgJ2Ffb3BhY2l0eSddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfZXhtYXRyaXgnLCAndV90ZXh0dXJlJywgJ3VfdGV4c2l6ZScsICd1X3pvb20nLCAndV9mYWRlZGlzdCcsICd1X21pbmZhZGV6b29tJywgJ3VfbWF4ZmFkZXpvb20nLCAndV9mYWRlem9vbScsICd1X3NrZXdlZCcsICd1X2V4dHJhJ10pO1xuXG4gICAgdGhpcy5vdXRsaW5lU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignb3V0bGluZScsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9jb2xvciddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3Vfd29ybGQnXVxuICAgICk7XG5cbiAgICB0aGlzLnBhdHRlcm5TaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdwYXR0ZXJuJyxcbiAgICAgICAgWydhX3BvcyddLFxuICAgICAgICBbJ3VfbWF0cml4JywgJ3VfcGF0dGVybl90bF9hJywgJ3VfcGF0dGVybl9icl9hJywgJ3VfcGF0dGVybl90bF9iJywgJ3VfcGF0dGVybl9icl9iJywgJ3VfbWl4JywgJ3VfcGF0dGVybm1hdHJpeF9hJywgJ3VfcGF0dGVybm1hdHJpeF9iJywgJ3Vfb3BhY2l0eScsICd1X2ltYWdlJ11cbiAgICApO1xuXG4gICAgdGhpcy5maWxsU2hhZGVyID0gZ2wuaW5pdGlhbGl6ZVNoYWRlcignZmlsbCcsXG4gICAgICAgIFsnYV9wb3MnLCAnYV9jb2xvciddLFxuICAgICAgICBbJ3VfbWF0cml4J11cbiAgICApO1xuXG4gICAgdGhpcy5jb2xsaXNpb25Cb3hTaGFkZXIgPSBnbC5pbml0aWFsaXplU2hhZGVyKCdjb2xsaXNpb25ib3gnLFxuICAgICAgICBbJ2FfcG9zJywgJ2FfZXh0cnVkZScsICdhX2RhdGEnXSxcbiAgICAgICAgWyd1X21hdHJpeCcsICd1X3NjYWxlJywgJ3Vfem9vbScsICd1X21heHpvb20nXVxuICAgICk7XG5cbiAgICB0aGlzLmlkZW50aXR5TWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcblxuICAgIC8vIFRoZSBiYWNrZ3JvdW5kQnVmZmVyIGlzIHVzZWQgd2hlbiBkcmF3aW5nIHRvIHRoZSBmdWxsICpjYW52YXMqXG4gICAgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1TaXplID0gMjtcbiAgICB0aGlzLmJhY2tncm91bmRCdWZmZXIuaXRlbUNvdW50ID0gNDtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEludDE2QXJyYXkoWy0xLCAtMSwgMSwgLTEsIC0xLCAxLCAxLCAxXSksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIHRoaXMuc2V0RXh0ZW50KDQwOTYpO1xuXG4gICAgLy8gVGhlIGRlYnVnVGV4dEJ1ZmZlciBpcyB1c2VkIHRvIGRyYXcgdGlsZSBJRHMgZm9yIGRlYnVnZ2luZ1xuICAgIHRoaXMuZGVidWdUZXh0QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUgPSAyO1xufTtcblxuLyoqXG4gKiBSZWJpbmQgdGhlIG5lY2Vzc2FyeSBidWZmZXJzIHRvIHJlbmRlciBhdCBhIGRpZmZlcmVudCBleHRlbnQgdGhhblxuICogdGhlIGN1cnJlbnQgb25lLiBOby1vcHMgaWYgdGhlIGV4dGVudCBpcyBub3QgY2hhbmdpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0V4dGVudFxuICogQGV4YW1wbGVcbiAqIHRoaXMuc2V0RXh0ZW50KDQwOTYpO1xuICogQHByaXZhdGVcbiAqL1xuUGFpbnRlci5wcm90b3R5cGUuc2V0RXh0ZW50ID0gZnVuY3Rpb24obmV3RXh0ZW50KSB7XG4gICAgaWYgKCFuZXdFeHRlbnQgfHwgbmV3RXh0ZW50ID09PSB0aGlzLnRpbGVFeHRlbnQpIHJldHVybjtcblxuICAgIHRoaXMudGlsZUV4dGVudCA9IG5ld0V4dGVudDtcblxuICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAvLyBUaGUgdGlsZUV4dGVudEJ1ZmZlciBpcyB1c2VkIHdoZW4gZHJhd2luZyB0byBhIGZ1bGwgKnRpbGUqXG4gICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplID0gNDtcbiAgICB0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbUNvdW50ID0gNDtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKFxuICAgICAgICBnbC5BUlJBWV9CVUZGRVIsXG4gICAgICAgIG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgICAgIC8vIHRpbGUgY29vcmQgeCwgdGlsZSBjb29yZCB5LCB0ZXh0dXJlIGNvb3JkIHgsIHRleHR1cmUgY29vcmQgeVxuICAgICAgICAgICAgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgIHRoaXMudGlsZUV4dGVudCwgMCwgMzI3NjcsIDAsXG4gICAgICAgICAgICAwLCB0aGlzLnRpbGVFeHRlbnQsIDAsIDMyNzY3LFxuICAgICAgICAgICAgdGhpcy50aWxlRXh0ZW50LCB0aGlzLnRpbGVFeHRlbnQsICAzMjc2NywgMzI3NjdcbiAgICAgICAgXSksXG4gICAgICAgIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFRoZSBkZWJ1Z0J1ZmZlciBpcyB1c2VkIHRvIGRyYXcgdGlsZSBvdXRsaW5lcyBmb3IgZGVidWdnaW5nXG4gICAgdGhpcy5kZWJ1Z0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZGVidWdCdWZmZXIuaXRlbVNpemUgPSAyO1xuICAgIHRoaXMuZGVidWdCdWZmZXIuaXRlbUNvdW50ID0gNTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5kZWJ1Z0J1ZmZlcik7XG4gICAgZ2wuYnVmZmVyRGF0YShcbiAgICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxuICAgICAgICBuZXcgSW50MTZBcnJheShbXG4gICAgICAgICAgICAwLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCB0aGlzLnRpbGVFeHRlbnQgLSAxLCAwLCAwXSksXG4gICAgICAgIGdsLlNUQVRJQ19EUkFXKTtcbn07XG5cbi8qXG4gKiBSZXNldCB0aGUgY29sb3IgYnVmZmVycyBvZiB0aGUgZHJhd2luZyBjYW52YXMuXG4gKi9cblBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG59O1xuXG4vKlxuICogUmVzZXQgdGhlIGRyYXdpbmcgY2FudmFzIGJ5IGNsZWFyaW5nIHRoZSBzdGVuY2lsIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBkcmF3XG4gKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAqL1xuUGFpbnRlci5wcm90b3R5cGUuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICBnbC5jbGVhclN0ZW5jaWwoMHgwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEZGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd0NsaXBwaW5nTWFzayA9IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsIHRpbGUucG9zTWF0cml4KTtcbiAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGVudGlyZSBzdGVuY2lsIGJ1ZmZlciwgZXhjZXB0IGZvciB0aGUgN3RoIGJpdCwgd2hpY2ggc3RvcmVzXG4gICAgLy8gdGhlIGdsb2JhbCBjbGlwcGluZyBtYXNrIHRoYXQgYWxsb3dzIHVzIHRvIGF2b2lkIGRyYXdpbmcgaW4gcmVnaW9ucyBvZlxuICAgIC8vIHRpbGVzIHdlJ3ZlIGFscmVhZHkgcGFpbnRlZCBpbi5cbiAgICBnbC5jbGVhclN0ZW5jaWwoMHgwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEJGKTtcbiAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuXG4gICAgLy8gVGhlIHN0ZW5jaWwgdGVzdCB3aWxsIGZhaWwgYWx3YXlzLCBtZWFuaW5nIHdlIHNldCBhbGwgcGl4ZWxzIGNvdmVyZWRcbiAgICAvLyBieSB0aGlzIGdlb21ldHJ5IHRvIDB4ODAuIFdlIHVzZSB0aGUgaGlnaGVzdCBiaXQgMHg4MCB0byBtYXJrIHRoZSByZWdpb25zXG4gICAgLy8gd2Ugd2FudCB0byBkcmF3IGluLiBBbGwgcGl4ZWxzIHRoYXQgaGF2ZSB0aGlzIGJpdCAqbm90KiBzZXQgd2lsbCBuZXZlciBiZVxuICAgIC8vIGRyYXduIGluLlxuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCAweEMwLCAweDQwKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweEMwKTtcbiAgICBnbC5zdGVuY2lsT3AoZ2wuUkVQTEFDRSwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG5cbiAgICAvLyBEcmF3IHRoZSBjbGlwcGluZyBtYXNrXG4gICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuZmlsbFNoYWRlci5hX2NvbG9yKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3BvcywgdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLCBnbC5TSE9SVCwgZmFsc2UsIDgsIDApO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuRVFVQUwsIDB4ODAsIDB4ODApO1xuICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICBnbC5zdGVuY2lsTWFzaygweDAwKTtcbiAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5maWxsU2hhZGVyLmFfY29sb3IpO1xufTtcblxuLy8gT3ZlcnJpZGRlbiBieSBoZWFkbGVzcyB0ZXN0cy5cblBhaW50ZXIucHJvdG90eXBlLnByZXBhcmVCdWZmZXJzID0gZnVuY3Rpb24oKSB7fTtcblBhaW50ZXIucHJvdG90eXBlLmJpbmREZWZhdWx0RnJhbWVidWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG59O1xuXG52YXIgZHJhdyA9IHtcbiAgICBzeW1ib2w6IHJlcXVpcmUoJy4vZHJhd19zeW1ib2wnKSxcbiAgICBsaW5lOiByZXF1aXJlKCcuL2RyYXdfbGluZScpLFxuICAgIGZpbGw6IHJlcXVpcmUoJy4vZHJhd19maWxsJyksXG4gICAgcmFzdGVyOiByZXF1aXJlKCcuL2RyYXdfcmFzdGVyJyksXG4gICAgYmFja2dyb3VuZDogcmVxdWlyZSgnLi9kcmF3X2JhY2tncm91bmQnKSxcbiAgICBkZWJ1ZzogcmVxdWlyZSgnLi9kcmF3X2RlYnVnJyksXG4gICAgdmVydGljZXM6IHJlcXVpcmUoJy4vZHJhd192ZXJ0aWNlcycpXG59O1xuXG5QYWludGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbihzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5saW5lQXRsYXMgPSBzdHlsZS5saW5lQXRsYXM7XG5cbiAgICB0aGlzLnNwcml0ZUF0bGFzID0gc3R5bGUuc3ByaXRlQXRsYXM7XG4gICAgdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUoc3R5bGUuc3ByaXRlKTtcblxuICAgIHRoaXMuZ2x5cGhBdGxhcyA9IHN0eWxlLmdseXBoQXRsYXM7XG4gICAgdGhpcy5nbHlwaEF0bGFzLmJpbmQodGhpcy5nbCk7XG5cbiAgICB0aGlzLmZyYW1lSGlzdG9yeS5yZWNvcmQodGhpcy50cmFuc2Zvcm0uem9vbSk7XG5cbiAgICB0aGlzLnByZXBhcmVCdWZmZXJzKCk7XG4gICAgdGhpcy5jbGVhckNvbG9yKCk7XG5cbiAgICBmb3IgKHZhciBpID0gc3R5bGUuX2dyb3Vwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgZ3JvdXAgPSBzdHlsZS5fZ3JvdXBzW2ldO1xuICAgICAgICB2YXIgc291cmNlID0gc3R5bGUuc291cmNlc1tncm91cC5zb3VyY2VdO1xuXG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgICAgICBzb3VyY2UucmVuZGVyKGdyb3VwLCB0aGlzKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGdyb3VwLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRyYXdMYXllcnMoZ3JvdXAsIHRoaXMuaWRlbnRpdHlNYXRyaXgpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGUgPSBmdW5jdGlvbih0aWxlLCBsYXllcnMpIHtcbiAgICB0aGlzLnNldEV4dGVudCh0aWxlLnRpbGVFeHRlbnQpO1xuICAgIHRoaXMuZHJhd0NsaXBwaW5nTWFzayh0aWxlKTtcbiAgICB0aGlzLmRyYXdMYXllcnMobGF5ZXJzLCB0aWxlLnBvc01hdHJpeCwgdGlsZSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIGRyYXcuZGVidWcodGhpcywgdGlsZSk7XG4gICAgfVxufTtcblxuUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycyA9IGZ1bmN0aW9uKGxheWVycywgbWF0cml4LCB0aWxlKSB7XG4gICAgZm9yICh2YXIgaSA9IGxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgICAgaWYgKGxheWVyLmhpZGRlbilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0odGhpcywgbGF5ZXIsIG1hdHJpeCwgdGlsZSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJ0aWNlcykge1xuICAgICAgICAgICAgZHJhdy52ZXJ0aWNlcyh0aGlzLCBsYXllciwgbWF0cml4LCB0aWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vIERyYXdzIG5vbi1vcGFxdWUgYXJlYXMuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cblBhaW50ZXIucHJvdG90eXBlLmRyYXdTdGVuY2lsQnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICBnbC5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLCB0aGlzLmlkZW50aXR5TWF0cml4KTtcblxuICAgIC8vIEJsZW5kIHRvIHRoZSBmcm9udCwgbm90IHRoZSBiYWNrLlxuICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIGdsLnN0ZW5jaWxNYXNrKDB4MDApO1xuICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCAweDgwLCAweDgwKTtcblxuICAgIC8vIERydyB0aGUgZmlsbGluZyBxdWFkIHdoZXJlIHRoZSBzdGVuY2lsIGJ1ZmZlciBpc24ndCBzZXQuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuYmFja2dyb3VuZEJ1ZmZlcik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLmZpbGxTaGFkZXIuYV9wb3MsIHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZSwgZ2wuU0hPUlQsIGZhbHNlLCAwLCAwKTtcbiAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5maWxsU2hhZGVyLmFfY29sb3IpO1xuICAgIGdsLnZlcnRleEF0dHJpYjRmdih0aGlzLmZpbGxTaGFkZXIuYV9jb2xvciwgWzAsIDAsIDAsIDAuNV0pO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpO1xuXG4gICAgLy8gUmV2ZXJ0IGJsZW5kaW5nIG1vZGUgdG8gYmxlbmQgdG8gdGhlIGJhY2suXG4gICAgZ2wuYmxlbmRGdW5jKGdsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLk9ORSk7XG59O1xuXG5QYWludGVyLnByb3RvdHlwZS50cmFuc2xhdGVNYXRyaXggPSBmdW5jdGlvbihtYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgYW5jaG9yKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkgcmV0dXJuIG1hdHJpeDtcblxuICAgIGlmIChhbmNob3IgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgdmFyIHNpbkEgPSBNYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICB2YXIgY29zQSA9IE1hdGguY29zKC10aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIHRyYW5zbGF0ZSA9IFtcbiAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIGNvc0EgLSB0cmFuc2xhdGVbMV0gKiBzaW5BLFxuICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICB2YXIgdGlsZVBpeGVsUmF0aW8gPSB0aGlzLnRyYW5zZm9ybS5zY2FsZSAvICgxIDw8IHRpbGUuY29vcmQueikgLyAodGlsZS50aWxlRXh0ZW50IC8gdGlsZS50aWxlU2l6ZSk7XG4gICAgdmFyIHRyYW5zbGF0aW9uID0gW1xuICAgICAgICB0cmFuc2xhdGVbMF0gLyB0aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgdHJhbnNsYXRlWzFdIC8gdGlsZVBpeGVsUmF0aW8sXG4gICAgICAgIDBcbiAgICBdO1xuXG4gICAgdmFyIHRyYW5zbGF0ZWRNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZE1hdHJpeDtcbn07XG5cblBhaW50ZXIucHJvdG90eXBlLnNhdmVUZXh0dXJlID0gZnVuY3Rpb24odGV4dHVyZSkge1xuICAgIHZhciB0ZXh0dXJlcyA9IHRoaXMucmV1c2FibGVUZXh0dXJlc1t0ZXh0dXJlLnNpemVdO1xuICAgIGlmICghdGV4dHVyZXMpIHtcbiAgICAgICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzW3RleHR1cmUuc2l6ZV0gPSBbdGV4dHVyZV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcbiAgICB9XG59O1xuXG5cblBhaW50ZXIucHJvdG90eXBlLmdldFRleHR1cmUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdmFyIHRleHR1cmVzID0gdGhpcy5yZXVzYWJsZVRleHR1cmVzW3NpemVdO1xuICAgIHJldHVybiB0ZXh0dXJlcyAmJiB0ZXh0dXJlcy5sZW5ndGggPiAwID8gdGV4dHVyZXMucG9wKCkgOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdsaWZ5ID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBcImRlYnVnXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBmbG9hdCB1X3BvaW50c2l6ZTt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcyxzdGVwKDMyNzY3LixhX3Bvcy54KSwxKTtnbF9Qb2ludFNpemU9dV9wb2ludHNpemU7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sXG4gICAgXCJkb3RcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NpemU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2dsX1BvaW50U2l6ZT11X3NpemU7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZvaWQgbWFpbigpe2Zsb2F0IGEsYjthPWxlbmd0aChnbF9Qb2ludENvb3JkLS41KTtiPXNtb290aHN0ZXAoLjUsLjUtdV9ibHVyLGEpO2dsX0ZyYWdDb2xvcj11X2NvbG9yKmI7fVwifSxcbiAgICBcImZpbGxcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9jb2xvcjt2YXJ5aW5nIHZlYzQgYTt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7Z2xfUG9pbnRTaXplPTIuO2E9YV9jb2xvcjt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dmFyeWluZyB2ZWM0IGE7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPWE7fVwifSxcbiAgICBcImdhdXNzaWFuXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X29mZnNldDt2YXJ5aW5nIHZlYzIgYVszXTt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7dmVjMiBiPWdsX1Bvc2l0aW9uLnh5LzIuKy41O2FbMF09YjthWzFdPWIrdV9vZmZzZXQqMS4xODI0MjU1MjM4MDYzNTYzO2FbMl09Yi11X29mZnNldCoxLjE4MjQyNTUyMzgwNjM1NjM7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGFbM107dm9pZCBtYWluKCl7dmVjNCBiPXZlYzQoMCk7Yis9dGV4dHVyZTJEKHVfaW1hZ2UsYVswXSkqLjQwMjYxOTk0Njg5NDI0NzQ2O2IrPXRleHR1cmUyRCh1X2ltYWdlLGFbMV0pKi4yOTg2OTAwMjY1NTI4NzYzO2IrPXRleHR1cmUyRCh1X2ltYWdlLGFbMl0pKi4yOTg2OTAwMjY1NTI4NzYzO2dsX0ZyYWdDb2xvcj1iO31cIn0sXG4gICAgXCJsaW5lXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9saW5ld2lkdGg7YXR0cmlidXRlIHZlYzQgYV9kYXRhLGFfY29sb3I7YXR0cmlidXRlIGZsb2F0IGFfYmx1cjt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvLHVfZXh0cmE7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhLGU7dmFyeWluZyBmbG9hdCBiLGQsZjt2YXJ5aW5nIHZlYzQgYzt2b2lkIG1haW4oKXt2ZWMyIGcsaDtnPWFfZGF0YS54eTtoPW1vZChhX3BvcywyLik7aC55PXNpZ24oaC55LS41KTthPWg7dmVjNCBpPXZlYzQoYV9saW5ld2lkdGgucypnKi4wMTU4NzMwMTYsMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStpLnh5L3VfcmF0aW8sMCwxKTtmbG9hdCBqLGssbDtqPWdsX1Bvc2l0aW9uLnkvZ2xfUG9zaXRpb24udztrPWxlbmd0aChnKS9sZW5ndGgodV9hbnRpYWxpYXNpbmdtYXRyaXgqZyk7bD0xLi8oMS4taip1X2V4dHJhKTtkPWwqaztjPWFfY29sb3I7ZT1hX2xpbmV3aWR0aDtmPWFfYmx1cjt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfZGFzaGFycmF5O3ZhcnlpbmcgdmVjNCBjO3ZhcnlpbmcgdmVjMiBhLGU7dmFyeWluZyBmbG9hdCBiLGQsZjt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaTtnPWxlbmd0aChhKSplLnM7aD1mKmQ7aT1jbGFtcChtaW4oZy0oZS50LWgpLGUucy1nKS9oLDAuLDEuKTtnbF9GcmFnQ29sb3I9YyppO31cIn0sXG4gICAgXCJsaW5lcGF0dGVyblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfbGluZXdpZHRoO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgZmxvYXQgYV9ibHVyLGFfb3BhY2l0eTt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3JhdGlvO3ZhcnlpbmcgdmVjMiBhLGM7dmFyeWluZyBmbG9hdCBiLGQsZTt2b2lkIG1haW4oKXt2ZWMyIGYsaCxpLGo7Zj1hX2RhdGEueHk7ZmxvYXQgZz1hX2RhdGEueioxMjguK2FfZGF0YS53O2g9bW9kKGFfcG9zLDIuKTtoLnk9c2lnbihoLnktLjUpO2E9aDtpPWYqLjAxNTg3MzAxNjtqPWFfbGluZXdpZHRoLnMqaTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStqLnh5L3VfcmF0aW8sMCwxKTtiPWc7Yz1hX2xpbmV3aWR0aDtkPWFfYmx1cjtlPWFfb3BhY2l0eTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X3BvaW50LHVfZmFkZTt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYzt2YXJ5aW5nIGZsb2F0IGIsZCxlO3ZvaWQgbWFpbigpe2Zsb2F0IGYsZyxoLGksaixrO2Y9bGVuZ3RoKGEpKmMucztnPWNsYW1wKG1pbihmLShjLnQtZCksYy5zLWYpL2QsMC4sMS4pO2g9bW9kKGIvdV9wYXR0ZXJuX3NpemVfYS54LDEuKTtpPW1vZChiL3VfcGF0dGVybl9zaXplX2IueCwxLik7aj0uNSthLnkqYy5zL3VfcGF0dGVybl9zaXplX2EueTtrPS41K2EueSpjLnMvdV9wYXR0ZXJuX3NpemVfYi55O3ZlYzIgbCxtO2w9bWl4KHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHZlYzIoaCxqKSk7bT1taXgodV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2IsdmVjMihpLGspKTt2ZWM0IG49bWl4KHRleHR1cmUyRCh1X2ltYWdlLGwpLHRleHR1cmUyRCh1X2ltYWdlLG0pLHVfZmFkZSk7Zyo9ZTtnbF9GcmFnQ29sb3I9bipnO31cIn0sXG4gICAgXCJsaW5lc2RmcGF0dGVyblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfbGluZXdpZHRoO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YSxhX2NvbG9yO2F0dHJpYnV0ZSBmbG9hdCBhX2JsdXI7dW5pZm9ybSBoaWdocCBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gbWF0NCB1X2V4bWF0cml4O3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5zY2FsZV9hLHVfcGF0dGVybnNjYWxlX2I7dmFyeWluZyB2ZWMyIGEsYixjLGU7dmFyeWluZyB2ZWM0IGQ7dmFyeWluZyBmbG9hdCBmO3ZvaWQgbWFpbigpe3ZlYzIgZyxpO2c9YV9kYXRhLnh5O2Zsb2F0IGg9YV9kYXRhLnoqMTI4LithX2RhdGEudztpPW1vZChhX3BvcywyLik7aS55PXNpZ24oaS55LS41KTthPWk7dmVjNCBqPXZlYzQoYV9saW5ld2lkdGgucypnKi4wMTU4NzMwMTYsMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStqLnh5L3VfcmF0aW8sMCwxKTtiPXZlYzIoaCp1X3BhdHRlcm5zY2FsZV9hLngsaS55KnVfcGF0dGVybnNjYWxlX2EueSt1X3RleF95X2EpO2M9dmVjMihoKnVfcGF0dGVybnNjYWxlX2IueCxpLnkqdV9wYXR0ZXJuc2NhbGVfYi55K3VfdGV4X3lfYik7ZD1hX2NvbG9yO2U9YV9saW5ld2lkdGg7Zj1hX2JsdXI7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dW5pZm9ybSBmbG9hdCB1X3NkZmdhbW1hLHVfbWl4O3ZhcnlpbmcgdmVjMiBhLGIsYyxlO3ZhcnlpbmcgdmVjNCBkO3ZhcnlpbmcgZmxvYXQgZjt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaSxqLGs7Zz1sZW5ndGgoYSkqZS5zO2g9Y2xhbXAobWluKGctKGUudC1mKSxlLnMtZykvZiwwLiwxLik7aT10ZXh0dXJlMkQodV9pbWFnZSxiKS5hO2o9dGV4dHVyZTJEKHVfaW1hZ2UsYykuYTtrPW1peChpLGosdV9taXgpO2gqPXNtb290aHN0ZXAoLjUtdV9zZGZnYW1tYSwuNSt1X3NkZmdhbW1hLGspO2dsX0ZyYWdDb2xvcj1kKmg7fVwifSxcbiAgICBcIm91dGxpbmVcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV93b3JsZDt2YXJ5aW5nIHZlYzQgYTt2YXJ5aW5nIHZlYzIgYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7Yj0oZ2xfUG9zaXRpb24ueHkvZ2xfUG9zaXRpb24udysxLikvMi4qdV93b3JsZDthPWFfY29sb3I7fVwiLFwiZnJhZ21lbnRcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3ZhcnlpbmcgdmVjNCBhO3ZhcnlpbmcgdmVjMiBiO3ZvaWQgbWFpbigpe2Zsb2F0IGMsZDtjPWxlbmd0aChiLWdsX0ZyYWdDb29yZC54eSk7ZD1zbW9vdGhzdGVwKDEuLDAuLGMpO2dsX0ZyYWdDb2xvcj1hKmQ7fVwifSxcbiAgICBcInBhdHRlcm5cIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQzIHVfcGF0dGVybm1hdHJpeF9hLHVfcGF0dGVybm1hdHJpeF9iO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KHVfcGF0dGVybm1hdHJpeF9hKnZlYzMoYV9wb3MsMSkpLnh5O2I9KHVfcGF0dGVybm1hdHJpeF9iKnZlYzMoYV9wb3MsMSkpLnh5O31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eSx1X21peDt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsdV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2I7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgYSxiO3ZvaWQgbWFpbigpe3ZlYzIgYyxkLGYsZztjPW1vZChhLDEuKTtkPW1peCh1X3BhdHRlcm5fdGxfYSx1X3BhdHRlcm5fYnJfYSxjKTt2ZWM0IGUsaDtlPXRleHR1cmUyRCh1X2ltYWdlLGQpO2Y9bW9kKGIsMS4pO2c9bWl4KHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iLGYpO2g9dGV4dHVyZTJEKHVfaW1hZ2UsZyk7Z2xfRnJhZ0NvbG9yPW1peChlLGgsdV9taXgpKnVfb3BhY2l0eTt9XCJ9LFxuICAgIFwicmFzdGVyXCI6IHtcInZlcnRleFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3RsX3BhcmVudDt1bmlmb3JtIGZsb2F0IHVfc2NhbGVfcGFyZW50LHVfYnVmZmVyX3NjYWxlO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfdGV4dHVyZV9wb3M7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7YT0oYV90ZXh0dXJlX3Bvcy8zMjc2Ny4tLjUpL3VfYnVmZmVyX3NjYWxlKy41O2I9YSp1X3NjYWxlX3BhcmVudCt1X3RsX3BhcmVudDt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHkwLHVfb3BhY2l0eTEsdV9icmlnaHRuZXNzX2xvdyx1X2JyaWdodG5lc3NfaGlnaCx1X3NhdHVyYXRpb25fZmFjdG9yLHVfY29udHJhc3RfZmFjdG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2UwLHVfaW1hZ2UxO3ZhcnlpbmcgdmVjMiBhLGI7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpe3ZlYzQgYyxkLGU7Yz10ZXh0dXJlMkQodV9pbWFnZTAsYSk7ZD10ZXh0dXJlMkQodV9pbWFnZTEsYik7ZT1jKnVfb3BhY2l0eTArZCp1X29wYWNpdHkxO3ZlYzMgZixoLGk7Zj1lLnJnYjtmPXZlYzMoZG90KGYsdV9zcGluX3dlaWdodHMueHl6KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChmLHVfc3Bpbl93ZWlnaHRzLnl6eCkpO2Zsb2F0IGc9KGUucitlLmcrZS5iKS8zLjtmKz0oZy1mKSp1X3NhdHVyYXRpb25fZmFjdG9yO2Y9KGYtLjUpKnVfY29udHJhc3RfZmFjdG9yKy41O2g9dmVjMyh1X2JyaWdodG5lc3NfbG93KTtpPXZlYzModV9icmlnaHRuZXNzX2hpZ2gpO2dsX0ZyYWdDb2xvcj12ZWM0KG1peChoLGksZiksZS5hKTt9XCJ9LFxuICAgIFwiaWNvblwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjthdHRyaWJ1dGUgZmxvYXQgYV9vcGFjaXR5O3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiO3ZvaWQgbWFpbigpe3ZlYzIgYyxlO2M9YV9kYXRhMS54eTtmbG9hdCBkLGYsZyxoLGksajtkPWFfZGF0YTFbMl07ZT1hX2RhdGEyLnN0O2Y9ZVswXTtnPWVbMV07aD0xMC47aT0yLi1zdGVwKGYsdV96b29tKS0oMS4tc3RlcChnLHVfem9vbSkpO2o9Y2xhbXAoKHVfZmFkZXpvb20tZCkvdV9mYWRlZGlzdCwwLiwxLik7aWYodV9mYWRlZGlzdD49MC4pYj1qO2Vsc2UgYj0xLi1qO2lmKHVfbWF4ZmFkZXpvb208ZCliPTAuO2lmKHVfbWluZmFkZXpvb20+PWQpYj0xLjtpKz1zdGVwKGIsMC4pO2lmKHVfc2tld2VkKXt2ZWM0IGs9dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3Mray54eSwwLDEpO2dsX1Bvc2l0aW9uLnorPWkqZ2xfUG9zaXRpb24udzt9ZWxzZXt2ZWM0IGs9dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LixpLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKStrO31hPWMvdV90ZXhzaXplO2IqPWFfb3BhY2l0eTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYjt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dGV4dHVyZTJEKHVfdGV4dHVyZSxhKSpiO31cIn0sXG4gICAgXCJzZGZcIjoge1widmVydGV4XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX29mZnNldDthdHRyaWJ1dGUgdmVjNCBhX2RhdGExLGFfZGF0YTIsYV9jb2xvcjthdHRyaWJ1dGUgZmxvYXQgYV9idWZmZXIsYV9nYW1tYTt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X2V4dHJhO3VuaWZvcm0gYm9vbCB1X3NrZXdlZDt1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjLGUsZjt2YXJ5aW5nIHZlYzQgZDt2b2lkIG1haW4oKXt2ZWMyIGcsaTtnPWFfZGF0YTEueHk7ZmxvYXQgaCxqLGssbCxtLG4sbztoPWFfZGF0YTFbMl07aT1hX2RhdGEyLnN0O2o9aVswXTtrPWlbMV07bD0yLi1zdGVwKGosdV96b29tKS0oMS4tc3RlcChrLHVfem9vbSkpO209Y2xhbXAoKHVfZmFkZXpvb20taCkvdV9mYWRlZGlzdCwwLiwxLik7aWYodV9mYWRlZGlzdD49MC4pYj1tO2Vsc2UgYj0xLi1tO2lmKHVfbWF4ZmFkZXpvb208aCliPTAuO2lmKHVfbWluZmFkZXpvb20+PWgpYj0xLjtsKz1zdGVwKGIsMC4pO2lmKHVfc2tld2VkKXt2ZWM0IG49dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3Mrbi54eSwwLDEpO2dsX1Bvc2l0aW9uLnorPWwqZ2xfUG9zaXRpb24udzt9ZWxzZXt2ZWM0IG49dV9leG1hdHJpeCp2ZWM0KGFfb2Zmc2V0LzY0LixsLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKStuO31uPWdsX1Bvc2l0aW9uLnkvZ2xfUG9zaXRpb24udztvPTEuLygxLi1uKnVfZXh0cmEpO2M9bzthPWcvdV90ZXhzaXplO2Q9YV9jb2xvcjtlPWFfYnVmZmVyO2Y9YV9nYW1tYTt9XCIsXCJmcmFnbWVudFwiOlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjLGUsZjt2YXJ5aW5nIHZlYzQgZDt2b2lkIG1haW4oKXtmbG9hdCBnLGgsaTtnPWYqYztoPXRleHR1cmUyRCh1X3RleHR1cmUsYSkuYTtpPXNtb290aHN0ZXAoZS1nLGUrZyxoKSpiO2dsX0ZyYWdDb2xvcj1kKmk7fVwifSxcbiAgICBcImNvbGxpc2lvbmJveFwiOiB7XCJ2ZXJ0ZXhcIjpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfZXh0cnVkZSxhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9zY2FsZTt2YXJ5aW5nIGZsb2F0IGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2FfZXh0cnVkZS91X3NjYWxlLDAsMSk7YT1hX2RhdGEueDtiPWFfZGF0YS55O31cIixcImZyYWdtZW50XCI6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X21heHpvb207dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7ZmxvYXQgYz0uNTtnbF9GcmFnQ29sb3I9dmVjNCgwLDEsMCwxKSpjO2lmKGI+dV96b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDEsMCwwLDEpKmM7aWYodV96b29tPj1hKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwwLDEpKmMqLjI1O2lmKGI+PXVfbWF4em9vbSlnbF9GcmFnQ29sb3I9dmVjNCgwLDAsMSwxKSpjKi4yO31cIn1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIFRpbGVQeXJhbWlkID0gcmVxdWlyZSgnLi90aWxlX3B5cmFtaWQnKTtcbnZhciBTb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xudmFyIHVybFJlc29sdmUgPSByZXF1aXJlKCdyZXNvbHZlLXVybCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlb0pTT05Tb3VyY2U7XG5cbi8qKlxuICogQ3JlYXRlIGEgR2VvSlNPTiBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICogQGNsYXNzIEdlb0pTT05Tb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gb3B0aW9ucy5kYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBVUkwgdG8gaXQuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiBjYXNlIG9mIGxhcmdlIEdlb0pTT04gZmlsZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4em9vbT0xNF0gTWF4aW11bSB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBhdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5idWZmZXJdIFRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50b2xlcmFuY2VdIFNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpLlxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuR2VvSlNPTlNvdXJjZSh7XG4gKiAgICBkYXRhOiB7XG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgLTc2LjUzMDYzMjk3MjcxNzI5LFxuICogICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICB9XVxuICogICAgfVxuICogfSk7XG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywgc291cmNlT2JqKTsgLy8gYWRkXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqL1xuZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB0aGlzLl9kYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkKSB0aGlzLm1heHpvb20gPSBvcHRpb25zLm1heHpvb207XG5cbiAgICB0aGlzLmdlb2pzb25WdE9wdGlvbnMgPSB7IG1heFpvb206IHRoaXMubWF4em9vbSB9O1xuICAgIGlmIChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLmdlb2pzb25WdE9wdGlvbnMuYnVmZmVyID0gb3B0aW9ucy5idWZmZXI7XG4gICAgaWYgKG9wdGlvbnMudG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHRoaXMuZ2VvanNvblZ0T3B0aW9ucy50b2xlcmFuY2UgPSBvcHRpb25zLnRvbGVyYW5jZTtcblxuICAgIHRoaXMuX3B5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoe1xuICAgICAgICB0aWxlU2l6ZTogNTEyLFxuICAgICAgICBtaW56b29tOiB0aGlzLm1pbnpvb20sXG4gICAgICAgIG1heHpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgY2FjaGVTaXplOiAyMCxcbiAgICAgICAgbG9hZDogdGhpcy5fbG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgYWJvcnQ6IHRoaXMuX2Fib3J0VGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICB1bmxvYWQ6IHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgYWRkOiB0aGlzLl9hZGRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgIHJlbW92ZTogdGhpcy5fcmVtb3ZlVGlsZS5iaW5kKHRoaXMpXG4gICAgfSk7XG59XG5cbkdlb0pTT05Tb3VyY2UucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIC8qKiBAbGVuZHMgR2VvSlNPTlNvdXJjZS5wcm90b3R5cGUgKi97XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAxNCxcbiAgICBfZGlydHk6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgc291cmNlIGdlb2pzb24gZGF0YSBhbmQgcmVyZW5kZXIgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IGRhdGEgQSBHZW9KU09OIGRhdGEgb2JqZWN0IG9yIFVSTCB0byBpdC4gVGhlIGxhdHRlciBpcyBwcmVmZXJhYmxlIGluIGNhc2Ugb2YgbGFyZ2UgR2VvSlNPTiBmaWxlcy5cbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHNldERhdGE6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMubWFwLnRyYW5zZm9ybSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgfSxcblxuICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9weXJhbWlkLnVwZGF0ZSh0aGlzLnVzZWQsIHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXI6IFNvdXJjZS5fcmVuZGVyVGlsZXMsXG4gICAgZmVhdHVyZXNBdDogU291cmNlLl92ZWN0b3JGZWF0dXJlc0F0LFxuXG4gICAgX3VwZGF0ZURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRhdGEgPSB1cmxSZXNvbHZlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3BhcnNlIGdlb2pzb24nLCB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgdGlsZVNpemU6IDUxMixcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHRoaXMuZ2VvanNvblZ0T3B0aW9uc1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9weXJhbWlkLnJlbG9hZCgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBfbG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdmFyIG92ZXJzY2FsaW5nID0gdGlsZS5jb29yZC56ID4gdGhpcy5tYXh6b29tID8gTWF0aC5wb3coMiwgdGlsZS5jb29yZC56IC0gdGhpcy5tYXh6b29tKSA6IDE7XG4gICAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICAgICAgY29vcmQ6IHRpbGUuY29vcmQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLmNvb3JkLnosXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICB0aWxlU2l6ZTogNTEyLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IG92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgYW5nbGU6IHRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxcbiAgICAgICAgICAgIHBpdGNoOiB0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsXG4gICAgICAgICAgICBjb2xsaXNpb25EZWJ1ZzogdGhpcy5tYXAuY29sbGlzaW9uRGVidWdcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2xvYWQgZ2VvanNvbiB0aWxlJywgcGFyYW1zLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcblxuICAgICAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9hYm9ydFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2FkZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmFkZCcsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF9yZW1vdmVUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5yZW1vdmUnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfdW5sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlcik7XG4gICAgICAgIHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHModGlsZS51aWQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgncmVtb3ZlIHRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJ3ZlY3Rvci10aWxlJykuVmVjdG9yVGlsZUZlYXR1cmU7XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXI7XG5cbi8vIGNvbmZvcm0gdG8gdmVjdG9ydGlsZSBhcGlcbmZ1bmN0aW9uIEdlb0pTT05XcmFwcGVyKGZlYXR1cmVzKSB7XG4gICAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5HZW9KU09OV3JhcHBlci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuZmVhdHVyZXNbaV0pO1xufTtcblxuZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIoZmVhdHVyZSkge1xuICAgIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZTtcbiAgICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3M7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJpbmdzID0gdGhpcy5yYXdHZW9tZXRyeTtcbiAgICB0aGlzLmdlb21ldHJ5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByaW5nID0gcmluZ3NbaV0sXG4gICAgICAgICAgICBuZXdSaW5nID0gW107XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW9tZXRyeTtcbn07XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmdlb21ldHJ5KSB0aGlzLmxvYWRHZW9tZXRyeSgpO1xuXG4gICAgdmFyIHJpbmdzID0gdGhpcy5nZW9tZXRyeSxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IHJpbmdzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGNvb3JkID0gcmluZ1tqXTtcblxuICAgICAgICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueCk7XG4gICAgICAgICAgICB4MiA9IE1hdGgubWF4KHgyLCBjb29yZC54KTtcbiAgICAgICAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvb3JkLnkpO1xuICAgICAgICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT04gPSBWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG52YXIgU291cmNlID0gcmVxdWlyZSgnLi9zb3VyY2UnKTtcbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVRpbGVVUkw7XG5cbm1vZHVsZS5leHBvcnRzID0gUmFzdGVyVGlsZVNvdXJjZTtcblxuZnVuY3Rpb24gUmFzdGVyVGlsZVNvdXJjZShvcHRpb25zKSB7XG4gICAgdXRpbC5leHRlbmQodGhpcywgdXRpbC5waWNrKG9wdGlvbnMsIFsndXJsJywgJ3RpbGVTaXplJ10pKTtcblxuICAgIFNvdXJjZS5fbG9hZFRpbGVKU09OLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblJhc3RlclRpbGVTb3VyY2UucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIHtcbiAgICBtaW56b29tOiAwLFxuICAgIG1heHpvb206IDIyLFxuICAgIHJvdW5kWm9vbTogdHJ1ZSxcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtLCB0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuXG4gICAgcmVuZGVyOiBTb3VyY2UuX3JlbmRlclRpbGVzLFxuXG4gICAgX2xvYWRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIGFqYXguZ2V0SW1hZ2Uobm9ybWFsaXplVVJMKHRpbGUuY29vcmQudXJsKHRoaXMudGlsZXMpLCB0aGlzLnVybCksIGZ1bmN0aW9uKGVyciwgaW1nKSB7XG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLm1hcC5wYWludGVyLmdsO1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy5tYXAucGFpbnRlci5nZXRUZXh0dXJlKGltZy53aWR0aCk7XG4gICAgICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGlsZS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aWxlLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1nKTtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUuc2l6ZSA9IGltZy53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuXG4gICAgICAgICAgICB0aWxlLnRpbWVBZGRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgdGhpcy5tYXAuYW5pbWF0aW9uTG9vcC5zZXQodGhpcy5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pO1xuXG4gICAgICAgICAgICB0aWxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgICAgICB0aWxlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5sb2FkJywge3RpbGU6IHRpbGV9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgX2Fib3J0VGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfYWRkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUuYWRkJywge3RpbGU6IHRpbGV9KTtcbiAgICB9LFxuXG4gICAgX3JlbW92ZVRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLnJlbW92ZScsIHt0aWxlOiB0aWxlfSk7XG4gICAgfSxcblxuICAgIF91bmxvYWRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHRoaXMubWFwLnBhaW50ZXIuc2F2ZVRleHR1cmUodGlsZS50ZXh0dXJlKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24ocG9pbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgW10pO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgVGlsZVB5cmFtaWQgPSByZXF1aXJlKCcuL3RpbGVfcHlyYW1pZCcpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xudmFyIG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplU291cmNlVVJMO1xuXG5leHBvcnRzLl9sb2FkVGlsZUpTT04gPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICB2YXIgbG9hZGVkID0gZnVuY3Rpb24oZXJyLCB0aWxlSlNPTikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayh0aWxlSlNPTixcbiAgICAgICAgICAgIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJ10pKTtcblxuICAgICAgICB0aGlzLl9weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKHtcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgY2FjaGVTaXplOiAyMCxcbiAgICAgICAgICAgIG1pbnpvb206IHRoaXMubWluem9vbSxcbiAgICAgICAgICAgIG1heHpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHJvdW5kWm9vbTogdGhpcy5yb3VuZFpvb20sXG4gICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCxcbiAgICAgICAgICAgIGxvYWQ6IHRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBhYm9ydDogdGhpcy5fYWJvcnRUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB1bmxvYWQ6IHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFkZDogdGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLl9yZW1vdmVUaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICByZWRvUGxhY2VtZW50OiB0aGlzLl9yZWRvVGlsZVBsYWNlbWVudCA/IHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50LmJpbmQodGhpcykgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgaW5kZXggaXMgZGVmaW5lZCwgZmV0Y2ggdGhlIGluZGV4IGpzb24sIHRoZW4gZXh0ZW5kIHRoZSBweXJhbWlkXG4gICAgICAgIGlmICh0aWxlSlNPTi5pbmRleCkge1xuICAgICAgICAgICAgYWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTCh0aWxlSlNPTi5pbmRleCksIGZ1bmN0aW9uIChlcnIsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXRpbC5leHRlbmQodGhpcy5fcHlyYW1pZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdsb2FkJyk7XG4gICAgICAgIH1cblxuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICBhamF4LmdldEpTT04obm9ybWFsaXplVVJMKG9wdGlvbnMudXJsKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBicm93c2VyLmZyYW1lKGxvYWRlZC5iaW5kKHRoaXMsIG51bGwsIG9wdGlvbnMpKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl9yZW5kZXJUaWxlcyA9IGZ1bmN0aW9uKGxheWVycywgcGFpbnRlcikge1xuICAgIGlmICghdGhpcy5fcHlyYW1pZClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGlkcyA9IHRoaXMuX3B5cmFtaWQucmVuZGVyZWRJRHMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pLFxuICAgICAgICAgICAgLy8gY29vcmQgaXMgZGlmZmVyZW50IHRoYW4gdGlsZS5jb29yZCBmb3Igd3JhcHBlZCB0aWxlcyBzaW5jZSB0aGUgYWN0dWFsXG4gICAgICAgICAgICAvLyB0aWxlIG9iamVjdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlIHZpc2libGUgY29waWVzIG9mIHRoYXQgdGlsZS5cbiAgICAgICAgICAgIGNvb3JkID0gVGlsZUNvb3JkLmZyb21JRChpZHNbaV0pLFxuICAgICAgICAgICAgeiA9IGNvb3JkLnosXG4gICAgICAgICAgICB4ID0gY29vcmQueCxcbiAgICAgICAgICAgIHkgPSBjb29yZC55LFxuICAgICAgICAgICAgdyA9IGNvb3JkLnc7XG5cbiAgICAgICAgLy8gaWYgeiA+IG1heHpvb20gdGhlbiB0aGUgdGlsZSBpcyBhY3R1YWxseSBhIG92ZXJzY2FsZWQgbWF4em9vbSB0aWxlLFxuICAgICAgICAvLyBzbyBjYWxjdWxhdGUgdGhlIG1hdHJpeCB0aGUgbWF4em9vbSB0aWxlIHdvdWxkIHVzZS5cbiAgICAgICAgeiA9IE1hdGgubWluKHosIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgeCArPSB3ICogKDEgPDwgeik7XG4gICAgICAgIHRpbGUuY2FsY3VsYXRlTWF0cmljZXMoeiwgeCwgeSwgcGFpbnRlci50cmFuc2Zvcm0sIHBhaW50ZXIpO1xuXG4gICAgICAgIHBhaW50ZXIuZHJhd1RpbGUodGlsZSwgbGF5ZXJzKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLl92ZWN0b3JGZWF0dXJlc0F0ID0gZnVuY3Rpb24oY29vcmQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3B5cmFtaWQpXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBbXSk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fcHlyYW1pZC50aWxlQXQoY29vcmQpO1xuICAgIGlmICghcmVzdWx0KVxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pO1xuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3F1ZXJ5IGZlYXR1cmVzJywge1xuICAgICAgICB1aWQ6IHJlc3VsdC50aWxlLnVpZCxcbiAgICAgICAgeDogcmVzdWx0LngsXG4gICAgICAgIHk6IHJlc3VsdC55LFxuICAgICAgICBzY2FsZTogcmVzdWx0LnNjYWxlLFxuICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgfSwgY2FsbGJhY2ssIHJlc3VsdC50aWxlLndvcmtlcklEKTtcbn07XG5cbi8qXG4gKiBDcmVhdGUgYSB0aWxlZCBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIEVpdGhlciBgcmFzdGVyYCBvciBgdmVjdG9yYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnVybCBBIHRpbGUgc291cmNlIFVSTC4gVGhpcyBzaG91bGQgZWl0aGVyIGJlIGBtYXBib3g6Ly97bWFwaWR9YCBvciBhIGZ1bGwgYGh0dHBbc11gIHVybCB0aGF0IHBvaW50cyB0byBhIFRpbGVKU09OIGVuZHBvaW50LlxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy50aWxlcyBBbiBhcnJheSBvZiB0aWxlIHNvdXJjZXMuIElmIGB1cmxgIGlzIG5vdCBzcGVjaWZpZWQsIGB0aWxlc2AgY2FuIGJlIHVzZWQgaW5zdGVhZCB0byBzcGVjaWZ5IHRpbGUgc291cmNlcywgYXMgaW4gdGhlIFRpbGVKU09OIHNwZWMuIE90aGVyIFRpbGVKU09OIGtleXMgc3VjaCBhcyBgbWluem9vbWAgYW5kIGBtYXh6b29tYCBjYW4gYmUgc3BlY2lmaWVkIGluIGEgc291cmNlIG9iamVjdCBpZiBgdGlsZXNgIGlzIHVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5pZCBBbiBvcHRpb25hbCBgaWRgIHRvIGFzc2lnbiB0byB0aGUgc291cmNlXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGlsZVNpemU9NTEyXSBPcHRpb25hbCB0aWxlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCBhc3N1bWluZyB0aWxlcyBhcmUgc3F1YXJlKS4gVGhpcyBvcHRpb24gaXMgb25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBzb3VyY2VzXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5jYWNoZVNpemUgT3B0aW9uYWwgbWF4IG51bWJlciBvZiB0aWxlcyB0byBjYWNoZSBhdCBhbnkgZ2l2ZW4gdGltZVxuICogQGV4YW1wbGVcbiAqIHZhciBzb3VyY2VPYmogPSBuZXcgbWFwYm94Z2wuU291cmNlLmNyZWF0ZSh7XG4gKiAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12NSdcbiAqIH0pO1xuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHNvdXJjZU9iaik7IC8vIGFkZFxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYXQgZmlsZSBzY29wZSBpbiBvcmRlciB0byBhdm9pZCBhIGNpcmN1bGFyIHJlcXVpcmUuXG4gICAgdmFyIHNvdXJjZXMgPSB7XG4gICAgICAgIHZlY3RvcjogcmVxdWlyZSgnLi92ZWN0b3JfdGlsZV9zb3VyY2UnKSxcbiAgICAgICAgcmFzdGVyOiByZXF1aXJlKCcuL3Jhc3Rlcl90aWxlX3NvdXJjZScpLFxuICAgICAgICBnZW9qc29uOiByZXF1aXJlKCcuL2dlb2pzb25fc291cmNlJyksXG4gICAgICAgIHZpZGVvOiByZXF1aXJlKCcuL3ZpZGVvX3NvdXJjZScpXG4gICAgfTtcblxuICAgIGZvciAodmFyIHR5cGUgaW4gc291cmNlcykge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2Ygc291cmNlc1t0eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgc291cmNlc1tzb3VyY2UudHlwZV0oc291cmNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnbG1hdHJpeCA9IHJlcXVpcmUoJ2dsLW1hdHJpeCcpO1xudmFyIG1hdDIgPSBnbG1hdHJpeC5tYXQyO1xudmFyIG1hdDQgPSBnbG1hdHJpeC5tYXQ0O1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBCdWZmZXJTZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGlsZTtcblxuLyoqXG4gKiBBIHRpbGUgb2JqZWN0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIENvb3JkaW5hdGUsIHdoaWNoIGRlZmluZXNcbiAqIGl0cyBwbGFjZSwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBJRCBhbmQgZGF0YSB0cmFja2luZyBmb3IgaXRzIGNvbnRlbnRcbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gVGlsZShjb29yZCwgc2l6ZSkge1xuICAgIHRoaXMuY29vcmQgPSBjb29yZDtcbiAgICB0aGlzLnVpZCA9IHV0aWwudW5pcXVlSWQoKTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudXNlcyA9IDA7XG4gICAgdGhpcy50aWxlU2l6ZSA9IHNpemU7XG59XG5cblRpbGUucHJvdG90eXBlID0ge1xuICAgIC8vIHRvZG8gdW5oYXJkY29kZVxuICAgIHRpbGVFeHRlbnQ6IDQwOTYsXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGludGVybmFsIHBvc01hdHJpeCB0aGF0IHRoaXMgdGlsZSB1c2VzIHRvIGRpc3BsYXlcbiAgICAgKiBpdHNlbGYgaW4gYSBtYXAsIGdpdmVuIGEgY29vcmRpbmF0ZSBhcyAoeiwgeCwgeSkgYW5kIGEgdHJhbnNmb3JtXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlTWF0cmljZXM6IGZ1bmN0aW9uKHosIHgsIHksIHRyYW5zZm9ybSkge1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbW9kZWwtdmlldyBtYXRyaXggdGhhdCBjb252ZXJ0cyBmcm9tIHRoZSB0aWxlIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIHRvIHNjcmVlbiBjb29yZGluYXRlcy5cbiAgICAgICAgdmFyIHRpbGVTY2FsZSA9IE1hdGgucG93KDIsIHopO1xuICAgICAgICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0ud29ybGRTaXplIC8gdGlsZVNjYWxlO1xuXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZVxuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG5cbiAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG1hdHJpeFxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucG9zTWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsIHRoaXMucG9zTWF0cml4LCBbeCAqIHNjYWxlLCB5ICogc2NhbGUsIDBdKTtcblxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucG9zTWF0cml4LCB0aGlzLnBvc01hdHJpeCwgWyBzY2FsZSAvIHRoaXMudGlsZUV4dGVudCwgc2NhbGUgLyB0aGlzLnRpbGVFeHRlbnQsIDEgXSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5wb3NNYXRyaXgsIHRyYW5zZm9ybS5nZXRQcm9qTWF0cml4KCksIHRoaXMucG9zTWF0cml4KTtcblxuICAgICAgICAvLyBUaGUgZXh0cnVzaW9uIG1hdHJpeC5cbiAgICAgICAgdGhpcy5leE1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQub3J0aG8odGhpcy5leE1hdHJpeCwgMCwgdHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0LCAwLCAwLCAtMSk7XG4gICAgICAgIC8vbWF0NC5yb3RhdGVaKHRoaXMuZXhNYXRyaXgsIHRoaXMuZXhNYXRyaXgsIC10cmFuc2Zvcm0uYW5nbGUpO1xuXG4gICAgICAgIC8vIDJ4MiBtYXRyaXggZm9yIHJvdGF0aW5nIHBvaW50c1xuICAgICAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gbWF0Mi5jcmVhdGUoKTtcbiAgICAgICAgbWF0Mi5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NNYXRyaXgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGNvb3JkaW5hdGUgcG9zaXRpb24sIHpvb20gdGhhdCBjb29yZGluYXRlIHRvIG15IHpvb20gYW5kXG4gICAgICogc2NhbGUgYW5kIHJldHVybiBhIHBvc2l0aW9uIGluIHgsIHksIHNjYWxlXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb3NpdGlvbkF0OiBmdW5jdGlvbihjb29yZCwgc291cmNlTWF4Wm9vbSkge1xuICAgICAgICBjb29yZCA9IGNvb3JkLnpvb21UbyhNYXRoLm1pbih0aGlzLmNvb3JkLnosIHNvdXJjZU1heFpvb20pKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IChjb29yZC5jb2x1bW4gLSB0aGlzLmNvb3JkLngpICogNDA5NixcbiAgICAgICAgICAgIHk6IChjb29yZC5yb3cgLSB0aGlzLmNvb3JkLnkpICogNDA5NixcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLnNjYWxlXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZGF0YSBvYmplY3Qgd2l0aCBhICdidWZmZXJzJyBwcm9wZXJ0eSwgbG9hZCBpdCBpbnRvXG4gICAgICogdGhpcyB0aWxlJ3MgZWxlbWVudEdyb3VwcyBhbmQgYnVmZmVycyBwcm9wZXJ0aWVzIGFuZCBzZXQgbG9hZGVkXG4gICAgICogdG8gdHJ1ZS4gSWYgdGhlIGRhdGEgaXMgbnVsbCwgbGlrZSBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eVxuICAgICAqIEdlb0pTT04gdGlsZSwgbm8tb3AgYnV0IHN0aWxsIHNldCBsb2FkZWQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkVmVjdG9yRGF0YTogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZW1wdHkgR2VvSlNPTiB0aWxlXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoZGF0YS5idWZmZXJzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzID0gZGF0YS5lbGVtZW50R3JvdXBzO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnQgPSBkYXRhLmV4dGVudDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2l2ZW4gYSBkYXRhIG9iamVjdCBhbmQgYSBHTCBwYWludGVyLCBkZXN0cm95IGFuZCByZS1jcmVhdGVcbiAgICAgKiBhbGwgb2YgaXRzIGJ1ZmZlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFpbnRlclxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWxvYWRTeW1ib2xEYXRhOiBmdW5jdGlvbihkYXRhLCBwYWludGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIC8vIHRoZSB0aWxlIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoVmVydGV4LmRlc3Ryb3kocGFpbnRlci5nbCk7XG4gICAgICAgIHRoaXMuYnVmZmVycy5nbHlwaEVsZW1lbnQuZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25WZXJ0ZXguZGVzdHJveShwYWludGVyLmdsKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25FbGVtZW50LmRlc3Ryb3kocGFpbnRlci5nbCk7XG4gICAgICAgIHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXguZGVzdHJveShwYWludGVyLmdsKTtcblxuICAgICAgICB2YXIgYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoZGF0YS5idWZmZXJzKTtcbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoVmVydGV4ID0gYnVmZmVycy5nbHlwaFZlcnRleDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmdseXBoRWxlbWVudCA9IGJ1ZmZlcnMuZ2x5cGhFbGVtZW50O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuaWNvblZlcnRleCA9IGJ1ZmZlcnMuaWNvblZlcnRleDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmljb25FbGVtZW50ID0gYnVmZmVycy5pY29uRWxlbWVudDtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCA9IGJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4O1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIGRhdGEuZWxlbWVudEdyb3Vwcykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50R3JvdXBzW2lkXSA9IGRhdGEuZWxlbWVudEdyb3Vwc1tpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIHRoYXQgdGhpcyB0aWxlIGRvZXNuJ3Qgb3duIGFueSBkYXRhIHdpdGhpbiBhIGdpdmVuXG4gICAgICogcGFpbnRlciwgc28gdGhhdCBpdCBkb2Vzbid0IGNvbnN1bWUgYW55IG1lbW9yeSBvciBtYWludGFpblxuICAgICAqIGFueSByZWZlcmVuY2VzIHRvIHRoZSBwYWludGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYWludGVyIGdsIHBhaW50ZXIgb2JqZWN0XG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVubG9hZFZlY3RvckRhdGE6IGZ1bmN0aW9uKHBhaW50ZXIpIHtcbiAgICAgICAgZm9yICh2YXIgYiBpbiB0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyc1tiXS5kZXN0cm95KHBhaW50ZXIuZ2wpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IG51bGw7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUaWxlQ29vcmQ7XG5cbmZ1bmN0aW9uIFRpbGVDb29yZCh6LCB4LCB5LCB3KSB7XG4gICAgaWYgKHcgPT09IHVuZGVmaW5lZCkgdyA9IDA7XG4gICAgdGhpcy56ID0gejtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53ID0gdztcblxuICAgIC8vIGNhbGN1bGF0ZSBpZFxuICAgIHcgKj0gMjtcbiAgICBpZiAodyA8IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHZhciBkaW0gPSAxIDw8IHRoaXMuejtcbiAgICB0aGlzLmlkID0gKChkaW0gKiBkaW0gKiB3ICsgZGltICogdGhpcy55ICsgdGhpcy54KSAqIDMyKSArIHRoaXMuejtcbn1cblxuVGlsZUNvb3JkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnogKyBcIi9cIiArIHRoaXMueCArIFwiL1wiICsgdGhpcy55O1xufTtcblxuLy8gUGFyc2UgYSBwYWNrZWQgaW50ZWdlciBpZCBpbnRvIGEgVGlsZUNvb3JkIG9iamVjdFxuVGlsZUNvb3JkLmZyb21JRCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIHogPSBpZCAlIDMyLCBkaW0gPSAxIDw8IHo7XG4gICAgdmFyIHh5ID0gKChpZCAtIHopIC8gMzIpO1xuICAgIHZhciB4ID0geHkgJSBkaW0sIHkgPSAoKHh5IC0geCkgLyBkaW0pICUgZGltO1xuICAgIHZhciB3ID0gTWF0aC5mbG9vcih4eSAvIChkaW0gKiBkaW0pKTtcbiAgICBpZiAodyAlIDIgIT09IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHcgLz0gMjtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh6LCB4LCB5LCB3KTtcbn07XG5cbi8vIGdpdmVuIGEgbGlzdCBvZiB1cmxzLCBjaG9vc2UgYSB1cmwgdGVtcGxhdGUgYW5kIHJldHVybiBhIHRpbGUgVVJMXG5UaWxlQ29vcmQucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uKHVybHMsIHNvdXJjZU1heFpvb20pIHtcbiAgICByZXR1cm4gdXJsc1sodGhpcy54ICsgdGhpcy55KSAlIHVybHMubGVuZ3RoXVxuICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAucmVwbGFjZSgne3p9JywgTWF0aC5taW4odGhpcy56LCBzb3VyY2VNYXhab29tIHx8IHRoaXMueikpXG4gICAgICAgIC5yZXBsYWNlKCd7eH0nLCB0aGlzLngpXG4gICAgICAgIC5yZXBsYWNlKCd7eX0nLCB0aGlzLnkpO1xufTtcblxuLy8gUmV0dXJuIHRoZSBjb29yZGluYXRlIG9mIHRoZSBwYXJlbnQgdGlsZVxuVGlsZUNvb3JkLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbihzb3VyY2VNYXhab29tKSB7XG4gICAgaWYgKHRoaXMueiA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyB0aGUgaWQgcmVwcmVzZW50cyBhbiBvdmVyc2NhbGVkIHRpbGUsIHJldHVybiB0aGUgc2FtZSBjb29yZGluYXRlcyB3aXRoIGEgbG93ZXIgelxuICAgIGlmICh0aGlzLnogPiBzb3VyY2VNYXhab29tKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIE1hdGguZmxvb3IodGhpcy54IC8gMiksIE1hdGguZmxvb3IodGhpcy55IC8gMiksIHRoaXMudyk7XG59O1xuXG5UaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosIHRoaXMueCwgdGhpcy55LCAwKTtcbn07XG5cbi8vIFJldHVybiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRpbGUncyBjaGlsZHJlblxuVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHNvdXJjZU1heFpvb20pIHtcblxuICAgIGlmICh0aGlzLnogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcbiAgICAgICAgcmV0dXJuIFtuZXcgVGlsZUNvb3JkKHRoaXMueiArIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpXTtcbiAgICB9XG5cbiAgICB2YXIgeiA9IHRoaXMueiArIDE7XG4gICAgdmFyIHggPSB0aGlzLnggKiAyO1xuICAgIHZhciB5ID0gdGhpcy55ICogMjtcbiAgICByZXR1cm4gW1xuICAgICAgICBuZXcgVGlsZUNvb3JkKHosIHgsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHksIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCwgeSArIDEsIHRoaXMudyksXG4gICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCArIDEsIHkgKyAxLCB0aGlzLncpXG4gICAgXTtcbn07XG5cbi8vIFRha2VuIGZyb20gcG9seW1hcHMgc3JjL0xheWVyLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2ltcGxlZ2VvL3BvbHltYXBzL2Jsb2IvbWFzdGVyL3NyYy9MYXllci5qcyNMMzMzLUwzODNcblxuZnVuY3Rpb24gZWRnZShhLCBiKSB7XG4gICAgaWYgKGEucm93ID4gYi5yb3cpIHsgdmFyIHQgPSBhOyBhID0gYjsgYiA9IHQ7IH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MDogYS5jb2x1bW4sXG4gICAgICAgIHkwOiBhLnJvdyxcbiAgICAgICAgeDE6IGIuY29sdW1uLFxuICAgICAgICB5MTogYi5yb3csXG4gICAgICAgIGR4OiBiLmNvbHVtbiAtIGEuY29sdW1uLFxuICAgICAgICBkeTogYi5yb3cgLSBhLnJvd1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNjYW5TcGFucyhlMCwgZTEsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIHZhciB5MSA9IE1hdGgubWluKHltYXgsIE1hdGguY2VpbChlMS55MSkpO1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB4LWNvb3JkaW5hdGVcbiAgICBpZiAoKGUwLngwID09PSBlMS54MCAmJiBlMC55MCA9PT0gZTEueTApID9cbiAgICAgICAgICAgIChlMC54MCArIGUxLmR5IC8gZTAuZHkgKiBlMC5keCA8IGUxLngxKSA6XG4gICAgICAgICAgICAoZTAueDEgLSBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MCkpIHtcbiAgICAgICAgdmFyIHQgPSBlMDsgZTAgPSBlMTsgZTEgPSB0O1xuICAgIH1cblxuICAgIC8vIHNjYW4gbGluZXMhXG4gICAgdmFyIG0wID0gZTAuZHggLyBlMC5keTtcbiAgICB2YXIgbTEgPSBlMS5keCAvIGUxLmR5O1xuICAgIHZhciBkMCA9IGUwLmR4ID4gMDsgLy8gdXNlIHkgKyAxIHRvIGNvbXB1dGUgeDBcbiAgICB2YXIgZDEgPSBlMS5keCA8IDA7IC8vIHVzZSB5ICsgMSB0byBjb21wdXRlIHgxXG4gICAgZm9yICh2YXIgeSA9IHkwOyB5IDwgeTE7IHkrKykge1xuICAgICAgICB2YXIgeDAgPSBtMCAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUwLmR5LCB5ICsgZDAgLSBlMC55MCkpICsgZTAueDA7XG4gICAgICAgIHZhciB4MSA9IG0xICogTWF0aC5tYXgoMCwgTWF0aC5taW4oZTEuZHksIHkgKyBkMSAtIGUxLnkwKSkgKyBlMS54MDtcbiAgICAgICAgc2NhbkxpbmUoTWF0aC5mbG9vcih4MSksIE1hdGguY2VpbCh4MCksIHkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NhblRyaWFuZ2xlKGEsIGIsIGMsIHltaW4sIHltYXgsIHNjYW5MaW5lKSB7XG4gICAgdmFyIGFiID0gZWRnZShhLCBiKSxcbiAgICAgICAgYmMgPSBlZGdlKGIsIGMpLFxuICAgICAgICBjYSA9IGVkZ2UoYywgYSk7XG5cbiAgICB2YXIgdDtcblxuICAgIC8vIHNvcnQgZWRnZXMgYnkgeS1sZW5ndGhcbiAgICBpZiAoYWIuZHkgPiBiYy5keSkgeyB0ID0gYWI7IGFiID0gYmM7IGJjID0gdDsgfVxuICAgIGlmIChhYi5keSA+IGNhLmR5KSB7IHQgPSBhYjsgYWIgPSBjYTsgY2EgPSB0OyB9XG4gICAgaWYgKGJjLmR5ID4gY2EuZHkpIHsgdCA9IGJjOyBiYyA9IGNhOyBjYSA9IHQ7IH1cblxuICAgIC8vIHNjYW4gc3BhbiEgc2NhbiBzcGFuIVxuICAgIGlmIChhYi5keSkgc2NhblNwYW5zKGNhLCBhYiwgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xuICAgIGlmIChiYy5keSkgc2NhblNwYW5zKGNhLCBiYywgeW1pbiwgeW1heCwgc2NhbkxpbmUpO1xufVxuXG5UaWxlQ29vcmQuY292ZXIgPSBmdW5jdGlvbih6LCBib3VuZHMsIGFjdHVhbFopIHtcbiAgICB2YXIgdGlsZXMgPSAxIDw8IHo7XG4gICAgdmFyIHQgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHNjYW5MaW5lKHgwLCB4MSwgeSkge1xuICAgICAgICB2YXIgeCwgd3g7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgd3ggPSAoeCArIHRpbGVzKSAlIHRpbGVzO1xuICAgICAgICAgICAgICAgIHZhciBjb29yZCA9IG5ldyBUaWxlQ29vcmQoYWN0dWFsWiwgd3gsIHksIE1hdGguZmxvb3IoeCAvIHRpbGVzKSk7XG4gICAgICAgICAgICAgICAgdFtjb29yZC5pZF0gPSBjb29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpdmlkZSB0aGUgc2NyZWVuIHVwIGluIHR3byB0cmlhbmdsZXMgYW5kIHNjYW4gZWFjaCBvZiB0aGVtOlxuICAgIC8vICstLS0vXG4gICAgLy8gfCAvIHxcbiAgICAvLyAvLS0tK1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMF0sIGJvdW5kc1sxXSwgYm91bmRzWzJdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMl0sIGJvdW5kc1szXSwgYm91bmRzWzBdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBDYWNoZSA9IHJlcXVpcmUoJy4uL3V0aWwvbXJ1X2NhY2hlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVQeXJhbWlkO1xuXG4vKipcbiAqIEEgdGlsZSBweXJhbWlkIGlzIGEgc3BlY2lhbGl6ZWQgY2FjaGUgYW5kIGRhdGFzdHJ1Y3R1cmVcbiAqIHRoYXQgY29udGFpbnMgdGlsZXMuIEl0J3MgdXNlZCBieSBzb3VyY2VzIHRvIG1hbmFnZSB0aGVpclxuICogZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1pbnpvb21cbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIFRpbGVQeXJhbWlkKG9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbGVTaXplID0gb3B0aW9ucy50aWxlU2l6ZTtcbiAgICB0aGlzLm1pbnpvb20gPSBvcHRpb25zLm1pbnpvb207XG4gICAgdGhpcy5tYXh6b29tID0gb3B0aW9ucy5tYXh6b29tO1xuICAgIHRoaXMucm91bmRab29tID0gb3B0aW9ucy5yb3VuZFpvb207XG4gICAgdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCA9IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQ7XG4gICAgLy8gZXNyaS9jaGVsbVxuICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXG4gICAgdGhpcy5fbG9hZCA9IG9wdGlvbnMubG9hZDtcbiAgICB0aGlzLl9hYm9ydCA9IG9wdGlvbnMuYWJvcnQ7XG4gICAgdGhpcy5fdW5sb2FkID0gb3B0aW9ucy51bmxvYWQ7XG4gICAgdGhpcy5fYWRkID0gb3B0aW9ucy5hZGQ7XG4gICAgdGhpcy5fcmVtb3ZlID0gb3B0aW9ucy5yZW1vdmU7XG4gICAgdGhpcy5fcmVkb1BsYWNlbWVudCA9IG9wdGlvbnMucmVkb1BsYWNlbWVudDtcblxuICAgIHRoaXMuX3RpbGVzID0ge307XG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgQ2FjaGUob3B0aW9ucy5jYWNoZVNpemUsIGZ1bmN0aW9uKHRpbGUpIHsgcmV0dXJuIHRoaXMuX3VubG9hZCh0aWxlKTsgfS5iaW5kKHRoaXMpKTtcbn1cblxuVGlsZVB5cmFtaWQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENvbmZpcm0gdGhhdCBldmVyeSB0cmFja2VkIHRpbGUgaXMgbG9hZGVkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIGFsbCB0aWxlcyBhcmUgbG9hZGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl90aWxlc1t0XS5sb2FkZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIHRpbGUgaWRzIG9yZGVyZWQgd2l0aCB6LW9yZGVyLCBhbmQgY2FzdCB0byBudW1iZXJzXG4gICAgICogQHJldHVybnMge0FycmF5PG51bWJlcj59IGlkc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb3JkZXJlZElEczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl90aWxlcylcbiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIChiICUgMzIpIC0gKGEgJSAzMik7IH0pXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGlkKSB7IHJldHVybiAraWQ7IH0pO1xuICAgIH0sXG5cbiAgICByZW5kZXJlZElEczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyZWRJRHMoKS5maWx0ZXIoZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF0ubG9hZGVkICYmICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkKHRoaXMuX3RpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IGlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCB0aWxlIGlkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0VGlsZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSB6b29tIGxldmVsIGFkanVzdGVkIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBtYXAgYW5kIHNvdXJjZSB0aWxlc2l6ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICogQHJldHVybnMge251bWJlcn0gem9vbSBsZXZlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0Wm9vbTogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0uem9vbSArIE1hdGgubG9nKHRyYW5zZm9ybS50aWxlU2l6ZSAvIHRoaXMudGlsZVNpemUpIC8gTWF0aC5MTjI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHpvb20gbGV2ZWwgdGhhdCB3aWxsIGNvdmVyIGFsbCB0aWxlcyBpbiBhIGdpdmVuIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB6b29tIGxldmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1pvb21MZXZlbDogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikodGhpcy5nZXRab29tKHRyYW5zZm9ybSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHRyYW5zZm9ybSwgcmV0dXJuIGFsbCBjb29yZGluYXRlcyB0aGF0IGNvdWxkIGNvdmVyIHRoYXRcbiAgICAgKiB0cmFuc2Zvcm0gZm9yIGEgY292ZXJpbmcgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICogQHJldHVybnMge0FycmF5PFRpbGU+fSB0aWxlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlczogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciB6ID0gdGhpcy5jb3ZlcmluZ1pvb21MZXZlbCh0cmFuc2Zvcm0pO1xuICAgICAgICB2YXIgYWN0dWFsWiA9IHo7XG5cbiAgICAgICAgaWYgKHogPCB0aGlzLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHogPiB0aGlzLm1heHpvb20pIHogPSB0aGlzLm1heHpvb207XG5cbiAgICAgICAgdmFyIHRyID0gdHJhbnNmb3JtLFxuICAgICAgICAgICAgdGlsZUNlbnRlciA9IHRyLmxvY2F0aW9uQ29vcmRpbmF0ZSh0ci5jZW50ZXIpLl96b29tVG8oeiksXG4gICAgICAgICAgICBjZW50ZXJQb2ludCA9IG5ldyBQb2ludCh0aWxlQ2VudGVyLmNvbHVtbiAtIDAuNSwgdGlsZUNlbnRlci5yb3cgLSAwLjUpO1xuXG4gICAgICAgIHJldHVybiBUaWxlQ29vcmQuY292ZXIoeiwgW1xuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCAwKSkuX3pvb21Ubyh6KSxcbiAgICAgICAgICAgIHRyLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodHIud2lkdGgsIDApKS5fem9vbVRvKHopLFxuICAgICAgICAgICAgdHIucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0ci53aWR0aCwgdHIuaGVpZ2h0KSkuX3pvb21Ubyh6KSxcbiAgICAgICAgICAgIHRyLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgdHIuaGVpZ2h0KSkuX3pvb21Ubyh6KVxuICAgICAgICBdLCB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID8gYWN0dWFsWiA6IHopLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGNlbnRlclBvaW50LmRpc3QoYSkgLSBjZW50ZXJQb2ludC5kaXN0KGIpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmluZCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWF4Q292ZXJpbmdab29tKSB0aGF0IGFyZSBhbHJlYWR5IGxvYWRlZDtcbiAgICAgKiBhZGRzIGZvdW5kIHRpbGVzIHRvIHJldGFpbiBvYmplY3Q7IHJldHVybnMgdHJ1ZSBpZiBjaGlsZHJlbiBjb21wbGV0ZWx5IGNvdmVyIHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heENvdmVyaW5nWm9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV0YWluXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbmRMb2FkZWRDaGlsZHJlbjogZnVuY3Rpb24oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIHZhciBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHZhciB6ID0gY29vcmQuejtcbiAgICAgICAgdmFyIGNvb3JkcyA9IGNvb3JkLmNoaWxkcmVuKHRoaXMubWF4em9vbSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaWQgPSBjb29yZHNbaV0uaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaWRdICYmIHRoaXMuX3RpbGVzW2lkXS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoeiA8IG1heENvdmVyaW5nWm9vbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBHbyBmdXJ0aGVyIGRvd24gdGhlIGhpZXJhcmNoeSB0byBmaW5kIG1vcmUgdW5sb2FkZWQgY2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZExvYWRlZENoaWxkcmVuKGNvb3Jkc1tpXSwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGxldGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBsb2FkZWQgcGFyZW50IG9mIHRoZSBnaXZlbiB0aWxlICh1cCB0byBtaW5Db3ZlcmluZ1pvb20pO1xuICAgICAqIGFkZHMgdGhlIGZvdW5kIHRpbGUgdG8gcmV0YWluIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgdGlsZSBpZiBmb3VuZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5Db3ZlcmluZ1pvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldGFpblxuICAgICAqIEByZXR1cm5zIHtUaWxlfSB0aWxlIG9iamVjdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmluZExvYWRlZFBhcmVudDogZnVuY3Rpb24oY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIGZvciAodmFyIHogPSBjb29yZC56IC0gMTsgeiA+PSBtaW5Db3ZlcmluZ1pvb207IHotLSkge1xuICAgICAgICAgICAgY29vcmQgPSBjb29yZC5wYXJlbnQodGhpcy5tYXh6b29tKTtcbiAgICAgICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbY29vcmQuaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRpbGVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IGFuZCBhZGRzIG5ldyB0aWxlcyB0aGF0XG4gICAgICogYXJlIGluc2lkZSB0aGUgdmlld3BvcnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKHVzZWQsIHRyYW5zZm9ybSwgZmFkZUR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgY29vcmQ7XG4gICAgICAgIHZhciB0aWxlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgb3Zlcnpvb21pbmcvdW5kZXJ6b29taW5nIGFtb3VudHMuXG4gICAgICAgIHZhciB6b29tID0gKHRoaXMucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKHRoaXMuZ2V0Wm9vbSh0cmFuc2Zvcm0pKTtcbiAgICAgICAgdmFyIG1pbkNvdmVyaW5nWm9vbSA9IHV0aWwuY2xhbXAoem9vbSAtIDEwLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG4gICAgICAgIHZhciBtYXhDb3ZlcmluZ1pvb20gPSB1dGlsLmNsYW1wKHpvb20gKyAxLCAgdGhpcy5taW56b29tLCB0aGlzLm1heHpvb20pO1xuXG4gICAgICAgIC8vIFJldGFpbiBpcyBhIGxpc3Qgb2YgdGlsZXMgdGhhdCB3ZSBzaG91bGRuJ3QgZGVsZXRlLCBldmVuIGlmIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyB0aGUgbW9zdCBpZGVhbCB0aWxlIGZvciB0aGUgY3VycmVudCB2aWV3cG9ydC4gVGhpcyBtYXkgaW5jbHVkZSB0aWxlcyBsaWtlXG4gICAgICAgIC8vIHBhcmVudCBvciBjaGlsZCB0aWxlcyB0aGF0IGFyZSAqYWxyZWFkeSogbG9hZGVkLlxuICAgICAgICB2YXIgcmV0YWluID0ge307XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICAvLyBDb3ZlcmVkIGlzIGEgbGlzdCBvZiByZXRhaW5lZCB0aWxlcyB3aG8ncyBhcmVhcyBhcmUgZnVsbCBjb3ZlcmVkIGJ5IG90aGVyLFxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG5cbiAgICAgICAgdmFyIHJlcXVpcmVkID0gdXNlZCA/IHRoaXMuY292ZXJpbmdUaWxlcyh0cmFuc2Zvcm0pIDogW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29vcmQgPSByZXF1aXJlZFtpXTtcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLmFkZFRpbGUoY29vcmQpO1xuXG4gICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBUaGUgdGlsZSB3ZSByZXF1aXJlIGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAgICAgICAgLy8gUmV0YWluIGNoaWxkIG9yIHBhcmVudCB0aWxlcyB0aGF0IGNvdmVyIHRoZSBzYW1lIGFyZWEuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmluZExvYWRlZENoaWxkcmVuKGNvb3JkLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIG1pbkNvdmVyaW5nWm9vbSwgcmV0YWluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHJldGFpbikge1xuICAgICAgICAgICAgY29vcmQgPSBUaWxlQ29vcmQuZnJvbUlEKGlkKTtcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLnRpbWVBZGRlZCA+IG5vdyAtIChmYWRlRHVyYXRpb24gfHwgMCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRpbGUgaXMgc3RpbGwgZmFkaW5nIGluLiBGaW5kIHRpbGVzIHRvIGNyb3NzLWZhZGUgd2l0aCBpdC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2lkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCBtaW5Db3ZlcmluZ1pvb20sIHJldGFpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0aWxlcyB3ZSBkb24ndCBuZWVkIGFueW1vcmUuXG4gICAgICAgIHZhciByZW1vdmUgPSB1dGlsLmtleXNEaWZmZXJlbmNlKHRoaXMuX3RpbGVzLCByZXRhaW4pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoK3JlbW92ZVtpXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZSwgZ2l2ZW4gaXRzIGNvb3JkaW5hdGUsIHRvIHRoZSBweXJhbWlkLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX0gdGhlIGNvb3JkaW5hdGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRUaWxlOiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3RpbGVzW2Nvb3JkLmlkXTtcbiAgICAgICAgaWYgKHRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcblxuICAgICAgICB2YXIgd3JhcHBlZCA9IGNvb3JkLndyYXBwZWQoKTtcbiAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3dyYXBwZWQuaWRdO1xuXG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgICAgdGlsZSA9IHRoaXMuX2NhY2hlLmdldCh3cmFwcGVkLmlkKTtcbiAgICAgICAgICAgIGlmICh0aWxlICYmIHRoaXMuX3JlZG9QbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWRvUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICB2YXIgem9vbSA9IGNvb3JkLno7XG4gICAgICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB6b29tID4gdGhpcy5tYXh6b29tID8gTWF0aC5wb3coMiwgem9vbSAtIHRoaXMubWF4em9vbSkgOiAxO1xuICAgICAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHdyYXBwZWQsIHRoaXMudGlsZVNpemUgKiBvdmVyc2NhbGluZyk7XG4gICAgICAgICAgICAvLyBlc3JpL2NoZWxtXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICB0aWxlLnBhcmVudElkID0gdGhpcy5pbmRleFNlYXJjaChjb29yZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2FkKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGlsZS51c2VzKys7XG4gICAgICAgIHRoaXMuX3RpbGVzW2Nvb3JkLmlkXSA9IHRpbGU7XG4gICAgICAgIHRoaXMuX2FkZCh0aWxlLCBjb29yZCk7XG5cbiAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRpbGUsIGdpdmVuIGl0cyBpZCwgZnJvbSB0aGUgcHlyYW1pZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgdGlsZSBpZFxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9IG5vdGhpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbW92ZVRpbGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGlsZS51c2VzLS07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIHRoaXMuX3JlbW92ZSh0aWxlKTtcblxuICAgICAgICBpZiAodGlsZS51c2VzID4gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmFkZCh0aWxlLmNvb3JkLndyYXBwZWQoKS5pZCwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhclRpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fdGlsZXMpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoaWQpO1xuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiBjb29yZGluYXRlLCBzZWFyY2ggdGhyb3VnaCBvdXIgY3VycmVudCB0aWxlcyBhbmQgYXR0ZW1wdFxuICAgICAqIHRvIGZpbmQgYSB0aWxlIGF0IHRoYXQgcG9pbnRcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGlsZUF0OiBmdW5jdGlvbihjb29yZCkge1xuICAgICAgICB2YXIgaWRzID0gdGhpcy5vcmRlcmVkSURzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3RpbGVzW2lkc1tpXV07XG4gICAgICAgICAgICB2YXIgcG9zID0gdGlsZS5wb3NpdGlvbkF0KGNvb3JkLCB0aGlzLm1heHpvb20pO1xuICAgICAgICAgICAgaWYgKHBvcyAmJiBwb3MueCA+PSAwICYmIHBvcy54IDwgNDA5NiAmJiBwb3MueSA+PSAwICYmIHBvcy55IDwgNDA5Nikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBjbGljayBpcyB3aXRoaW4gdGhlIHZpZXdwb3J0LiBUaGVyZSBpcyBvbmx5IGV2ZXIgb25lIHRpbGUgaW5cbiAgICAgICAgICAgICAgICAvLyBhIGxheWVyIHRoYXQgaGFzIHRoaXMgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZTogdGlsZSxcbiAgICAgICAgICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICAgICAgICAgIHk6IHBvcy55LFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogcG9zLnNjYWxlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiB0aWxlIGlkIGZpbmQgaXRzIHBhcmVudCB0aWxlIGZyb20gdGhlIGluZGV4XG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCB0aWxlIGlkXG4gICAgICogQHJldHVybnMge09iamVjdH0gdGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW5kZXhTZWFyY2g6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgdGlsZSA9IFRpbGVDb29yZC5mcm9tSUQoaWQpO1xuXG4gICAgICAgIHZhciBpZHMgPSBbXTtcblxuICAgICAgICB2YXIgcGFyZW50VGlsZSA9IHRpbGU7XG4gICAgICAgIHdoaWxlIChpZCAhPT0gMCkge1xuICAgICAgICAgIHBhcmVudFRpbGUgPSBwYXJlbnRUaWxlLnBhcmVudChpZCk7XG4gICAgICAgICAgaWQgPSBwYXJlbnRUaWxlLmlkO1xuICAgICAgICAgIGlkcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgY3Vyc29ySWQgPSBpZHMucG9wKCksXG4gICAgICAgICAgICBpbmRleDtcblxuICAgICAgICB3aGlsZSAoaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWQgPSBpZHMucG9wKCk7XG4gICAgICAgICAgICBpbmRleCA9IHRpbGUuY2hpbGRyZW4oY3Vyc29ySWQpLmluZGV4T2YoaWQpO1xuICAgICAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgICBpZiAoY3Vyc29yW2luZGV4XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlkID0gY3Vyc29ySWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yW2luZGV4XSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnNvcklkID0gaWQ7XG4gICAgICAgICAgICAgICAgY3Vyc29yID0gY3Vyc29yW2luZGV4XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRpbGVDb29yZC5mcm9tSUQoaWQpLmlkO1xuXG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBTb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xudmFyIFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVTb3VyY2U7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVTb3VyY2Uob3B0aW9ucykge1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICd0aWxlU2l6ZSddKSk7XG5cbiAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcbiAgICB9XG5cbiAgICBTb3VyY2UuX2xvYWRUaWxlSlNPTi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5WZWN0b3JUaWxlU291cmNlLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChFdmVudGVkLCB7XG4gICAgbWluem9vbTogMCxcbiAgICBtYXh6b29tOiAyMixcbiAgICB0aWxlU2l6ZTogNTEyLFxuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0cnVlLFxuICAgIF9sb2FkZWQ6IGZhbHNlLFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B5cmFtaWQgJiYgdGhpcy5fcHlyYW1pZC5sb2FkZWQoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3B5cmFtaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCwgdHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fcHlyYW1pZCkge1xuICAgICAgICAgICAgdGhpcy5fcHlyYW1pZC5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWRvUGxhY2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9weXJhbWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWRzID0gdGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IHRoaXMuX3B5cmFtaWQuZ2V0VGlsZShpZHNbaV0pO1xuICAgICAgICAgICAgdGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBTb3VyY2UuX3JlbmRlclRpbGVzLFxuICAgIGZlYXR1cmVzQXQ6IFNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxcblxuICAgIF9sb2FkVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB2YXIgb3ZlcnNjYWxpbmcgPSB0aWxlLmNvb3JkLnogPiB0aGlzLm1heHpvb20gPyBNYXRoLnBvdygyLCB0aWxlLmNvb3JkLnogLSB0aGlzLm1heHpvb20pIDogMTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHVybDogdGlsZS5jb29yZC51cmwodGhpcy50aWxlcywgdGhpcy5tYXh6b29tKSxcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBjb29yZDogdGlsZS5jb29yZCxcbiAgICAgICAgICAgIHpvb206IHRpbGUuY29vcmQueixcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkRlYnVnOiB0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHJlcXVlc3QgdGhlIHRpbGUgcGFyZW50SUQgaWYgaXQgZXhpc3RzXG4gICAgICAgIGlmICh0aWxlLnBhcmVudElkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhUaWxlQ29vcmQuZnJvbUlEKHRpbGUucGFyZW50SUQpKVxuICAgICAgICAgICAgcGFyYW1zLnVybCA9IFRpbGVDb29yZC5mcm9tSUQodGlsZS5wYXJlbnRJRCkudXJsKHRoaXMudGlsZXMsIHRoaXMubWF4em9vbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGlsZS53b3JrZXJJRCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbG9hZCB0aWxlJywgcGFyYW1zLCB0aGlzLl90aWxlTG9hZGVkLmJpbmQodGhpcywgdGlsZSksIHRpbGUud29ya2VySUQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkIHRpbGUnLCBwYXJhbXMsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3RpbGVMb2FkZWQ6IGZ1bmN0aW9uKHRpbGUsIGVyciwgZGF0YSkge1xuICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgndGlsZS5lcnJvcicsIHt0aWxlOiB0aWxlfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEpO1xuXG4gICAgICAgIGlmICh0aWxlLnJlZG9XaGVuRG9uZSkge1xuICAgICAgICAgICAgdGlsZS5yZWRvV2hlbkRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfYWJvcnRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdhYm9ydCB0aWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgbnVsbCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9hZGRUaWxlOiBmdW5jdGlvbih0aWxlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgndGlsZS5hZGQnLCB7dGlsZTogdGlsZX0pO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlVGlsZTogZnVuY3Rpb24odGlsZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3RpbGUucmVtb3ZlJywge3RpbGU6IHRpbGV9KTtcbiAgICB9LFxuXG4gICAgX3VubG9hZFRpbGU6IGZ1bmN0aW9uKHRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpO1xuICAgICAgICB0aGlzLmdseXBoQXRsYXMucmVtb3ZlR2x5cGhzKHRpbGUudWlkKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZSB0aWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgbnVsbCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfSxcblxuICAgIF9yZWRvVGlsZVBsYWNlbWVudDogZnVuY3Rpb24odGlsZSkge1xuXG4gICAgICAgIGlmICghdGlsZS5sb2FkZWQgfHwgdGlsZS5yZWRvaW5nUGxhY2VtZW50KSB7XG4gICAgICAgICAgICB0aWxlLnJlZG9XaGVuRG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLnJlZG9pbmdQbGFjZW1lbnQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZWRvIHBsYWNlbWVudCcsIHtcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkRlYnVnOiB0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z1xuICAgICAgICB9LCBkb25lLmJpbmQodGhpcyksIHRpbGUud29ya2VySUQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoXywgZGF0YSkge1xuICAgICAgICAgICAgdGlsZS5yZWxvYWRTeW1ib2xEYXRhKGRhdGEsIHRoaXMubWFwLnBhaW50ZXIpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCd0aWxlLmxvYWQnLCB7dGlsZTogdGlsZX0pO1xuXG4gICAgICAgICAgICB0aWxlLnJlZG9pbmdQbGFjZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnJlZG9XaGVuRG9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZG9UaWxlUGxhY2VtZW50KHRpbGUpO1xuICAgICAgICAgICAgICAgIHRpbGUucmVkb1doZW5Eb25lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWRlb1NvdXJjZTtcblxuLyoqXG4gKiBDcmVhdGUgYSBWaWRlbyBkYXRhIHNvdXJjZSBpbnN0YW5jZSBnaXZlbiBhbiBvcHRpb25zIG9iamVjdFxuICogQGNsYXNzIFZpZGVvU291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gb3B0aW9ucy51cmwgQSBzdHJpbmcgb3IgYXJyYXkgb2YgVVJMKHMpIHRvIHZpZGVvIGZpbGVzXG4gKiBAcGFyYW0ge0FycmF5fSBvcHRpb25zLmNvb3JkaW5hdGVzIGxhdCxsbmcgY29vcmRpbmF0ZXMgaW4gb3JkZXIgY2xvY2t3aXNlIHN0YXJ0aW5nIGF0IHRoZSB0b3AgbGVmdDogdGwsIHRyLCBiciwgYmxcbiAqIEBleGFtcGxlXG4gKiB2YXIgc291cmNlT2JqID0gbmV3IG1hcGJveGdsLlZpZGVvU291cmNlKHtcbiAqICAgIHVybDogW1xuICogICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL3ZpZGVvcy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS92aWRlb3MvYmFsdGltb3JlLXNtb2tlLndlYm0nXG4gKiAgICBdLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbMzkuMTg1Nzk5MDcyMjk3NDgsIC03Ni41NDMzNTczNzIyODM5NF0sXG4gKiAgICAgICAgWzM5LjE4MzgzNjQ4NDc1ODcsIC03Ni41MjgwMzY1OTQzOTA4N10sXG4gKiAgICAgICAgWzM5LjE3NjgzMzkyNTA3NjA2LCAtNzYuNTI5NTM4NjMxNDM5Ml0sXG4gKiAgICAgICAgWzM5LjE3ODc2MzQ0MTA2NjQyLCAtNzYuNTQ1MjAyNzMyMDg2MThdXG4gKiAgICBdXG4gKiB9KTtcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCBzb3VyY2VPYmopOyAvLyBhZGRcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5mdW5jdGlvbiBWaWRlb1NvdXJjZShvcHRpb25zKSB7XG4gICAgdGhpcy5jb29yZGluYXRlcyA9IG9wdGlvbnMuY29vcmRpbmF0ZXM7XG5cbiAgICBhamF4LmdldFZpZGVvKG9wdGlvbnMudXJsLCBmdW5jdGlvbihlcnIsIHZpZGVvKSB7XG4gICAgICAgIC8vIEBUT0RPIGhhbmRsZSBlcnJvcnMgdmlhIGV2ZW50LlxuICAgICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgICAgICB0aGlzLnZpZGVvLmxvb3AgPSB0cnVlO1xuXG4gICAgICAgIHZhciBsb29wSUQ7XG5cbiAgICAgICAgLy8gc3RhcnQgcmVwYWludGluZyB3aGVuIHZpZGVvIHN0YXJ0cyBwbGF5aW5nXG4gICAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbG9vcElEID0gdGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5zZXQoSW5maW5pdHkpO1xuICAgICAgICAgICAgdGhpcy5tYXAuX3JlcmVuZGVyKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gc3RvcCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RvcHNcbiAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5jYW5jZWwobG9vcElEKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRpbGUoKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpO1xufVxuXG5WaWRlb1NvdXJjZS5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoRXZlbnRlZCwgLyoqIEBsZW5kcyBWaWRlb1NvdXJjZS5wcm90b3R5cGUgKi97XG4gICAgcm91bmRab29tOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBIVE1MIHZpZGVvIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFZpZGVvOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGlsZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBDYWxjdWxhdGUgd2hpY2ggbWVyY2F0b3IgdGlsZSBpcyBzdWl0YWJsZSBmb3IgcmVuZGVyaW5nIHRoZSB2aWRlbyBpblxuICAgICAgICAgKiBhbmQgY3JlYXRlIGEgYnVmZmVyIHdpdGggdGhlIGNvcm5lciBjb29yZGluYXRlcy4gVGhlc2UgY29vcmRpbmF0ZXNcbiAgICAgICAgICogbWF5IGJlIG91dHNpZGUgdGhlIHRpbGUsIGJlY2F1c2UgcmFzdGVyIHRpbGVzIGFyZW4ndCBjbGlwcGVkIHdoZW4gcmVuZGVyaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwO1xuICAgICAgICB2YXIgY29vcmRzID0gdGhpcy5jb29yZGluYXRlcy5tYXAoZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgICAgICB2YXIgbG9jID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgICAgIHJldHVybiBtYXAudHJhbnNmb3JtLmxvY2F0aW9uQ29vcmRpbmF0ZShsb2MpLnpvb21UbygwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIHZhciBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHggPSBtYXhYIC0gbWluWDtcbiAgICAgICAgdmFyIGR5ID0gbWF4WSAtIG1pblk7XG4gICAgICAgIHZhciBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICAgICAgdmFyIGNlbnRlciA9IG5ldyBDb29yZGluYXRlKChtaW5YICsgbWF4WCkgLyAyLCAobWluWSArIG1heFkpIC8gMiwgMClcbiAgICAgICAgICAgIC56b29tVG8oTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuXG4gICAgICAgIHZhciB0aWxlRXh0ZW50ID0gNDA5NjtcbiAgICAgICAgdmFyIHRpbGVDb29yZHMgPSBjb29yZHMubWFwKGZ1bmN0aW9uKGNvb3JkKSB7XG4gICAgICAgICAgICB2YXIgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8oY2VudGVyLnpvb20pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh6b29tZWRDb29yZC5jb2x1bW4gLSBjZW50ZXIuY29sdW1uKSAqIHRpbGVFeHRlbnQpLFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpvb21lZENvb3JkLnJvdyAtIGNlbnRlci5yb3cpICogdGlsZUV4dGVudCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZ2wgPSBtYXAucGFpbnRlci5nbDtcbiAgICAgICAgdmFyIG1heEludDE2ID0gMzI3Njc7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBJbnQxNkFycmF5KFtcbiAgICAgICAgICAgIHRpbGVDb29yZHNbMF0ueCwgdGlsZUNvb3Jkc1swXS55LCAwLCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1sxXS54LCB0aWxlQ29vcmRzWzFdLnksIG1heEludDE2LCAwLFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1szXS54LCB0aWxlQ29vcmRzWzNdLnksIDAsIG1heEludDE2LFxuICAgICAgICAgICAgdGlsZUNvb3Jkc1syXS54LCB0aWxlQ29vcmRzWzJdLnksIG1heEludDE2LCBtYXhJbnQxNlxuICAgICAgICBdKTtcblxuICAgICAgICB0aGlzLnRpbGUgPSBuZXcgVGlsZSgpO1xuICAgICAgICB0aGlzLnRpbGUuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXksIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICB9LFxuXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW8gJiYgdGhpcy52aWRlby5yZWFkeVN0YXRlID49IDI7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuXG4gICAgcmVsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxheWVycywgcGFpbnRlcikge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy52aWRlby5yZWFkeVN0YXRlIDwgMikgcmV0dXJuOyAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGN1cnJlbnQgcG9zaXRpb25cblxuICAgICAgICB2YXIgYyA9IHRoaXMuY2VudGVyO1xuICAgICAgICB0aGlzLnRpbGUuY2FsY3VsYXRlTWF0cmljZXMoYy56b29tLCBjLmNvbHVtbiwgYy5yb3csIHRoaXMubWFwLnRyYW5zZm9ybSwgcGFpbnRlcik7XG5cbiAgICAgICAgdmFyIGdsID0gcGFpbnRlci5nbDtcbiAgICAgICAgaWYgKCF0aGlzLnRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy52aWRlbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMudmlkZW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFpbnRlci5kcmF3TGF5ZXJzKGxheWVycywgdGhpcy50aWxlLnBvc01hdHJpeCwgdGhpcy50aWxlKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24ocG9pbnQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFjdG9yID0gcmVxdWlyZSgnLi4vdXRpbC9hY3RvcicpO1xudmFyIFdvcmtlclRpbGUgPSByZXF1aXJlKCcuL3dvcmtlcl90aWxlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciB2dCA9IHJlcXVpcmUoJ3ZlY3Rvci10aWxlJyk7XG52YXIgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcblxudmFyIGdlb2pzb252dCA9IHJlcXVpcmUoJ2dlb2pzb24tdnQnKTtcbnZhciBHZW9KU09OV3JhcHBlciA9IHJlcXVpcmUoJy4vZ2VvanNvbl93cmFwcGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc2VsZikge1xuICAgIHJldHVybiBuZXcgV29ya2VyKHNlbGYpO1xufTtcblxuZnVuY3Rpb24gV29ya2VyKHNlbGYpIHtcbiAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG4gICAgdGhpcy5sb2FkaW5nID0ge307XG5cbiAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgdGhpcy5nZW9KU09OSW5kZXhlcyA9IHt9O1xufVxuXG51dGlsLmV4dGVuZChXb3JrZXIucHJvdG90eXBlLCB7XG4gICAgJ3NldCBsYXllcnMnOiBmdW5jdGlvbihsYXllcnMpIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBsYXllcnM7XG4gICAgfSxcblxuICAgICdsb2FkIHRpbGUnOiBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJhbXMuc291cmNlLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAoIXRoaXMubG9hZGluZ1tzb3VyY2VdKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nW3NvdXJjZV0gPSB7fTtcblxuXG4gICAgICAgIHZhciB0aWxlID0gdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXSA9IG5ldyBXb3JrZXJUaWxlKHBhcmFtcyk7XG5cbiAgICAgICAgdGlsZS54aHIgPSBhamF4LmdldEFycmF5QnVmZmVyKHBhcmFtcy51cmwsIGRvbmUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdbc291cmNlXVt1aWRdO1xuXG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgdGlsZS5kYXRhID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKG5ldyBVaW50OEFycmF5KGRhdGEpKSk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmlkICE9PSBwYXJhbXMucGFyZW50SWQgJiYgdGlsZS5kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIHZhciB0aWxlUG9zID0gdGlsZS5jb29yZC5mcm9tSUQocGFyYW1zLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UG9zID0gdGlsZS5jb29yZC5mcm9tSUQocGFyYW1zLnBhcmVudElkKTtcbiAgICAgICAgICAgICAgICB2YXIgZHogPSB0aWxlUG9zLnogLSBwYXJlbnRQb3MuejtcbiAgICAgICAgICAgICAgICB2YXIgeFBvcyA9IHRpbGVQb3MueCAmICgoMSA8PCBkeikgLSAxKTtcbiAgICAgICAgICAgICAgICB2YXIgeVBvcyA9IHRpbGVQb3MueSAmICgoMSA8PCBkeikgLSAxKTtcbiAgICAgICAgICAgICAgICB0aWxlLnBhcnNlKHRpbGUuZGF0YSwgdGhpcy5sYXllcnMsIHRoaXMuYWN0b3IsIGNhbGxiYWNrLCBkeiwgeFBvcywgeVBvcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aWxlLnBhcnNlKHRpbGUuZGF0YSwgdGhpcy5sYXllcnMsIHRoaXMuYWN0b3IsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXSA9IHRoaXMubG9hZGVkW3NvdXJjZV0gfHwge307XG4gICAgICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdW3VpZF0gPSB0aWxlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZWxvYWQgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGxvYWRlZCA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHRpbGUgPSBsb2FkZWRbdWlkXTtcbiAgICAgICAgICAgIHRpbGUucGFyc2UodGlsZS5kYXRhLCB0aGlzLmxheWVycywgdGhpcy5hY3RvciwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdhYm9ydCB0aWxlJzogZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdKSB7XG4gICAgICAgICAgICBsb2FkaW5nW3VpZF0ueGhyLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdyZW1vdmUgdGlsZSc6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ3JlZG8gcGxhY2VtZW50JzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxvYWRlZFt1aWRdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRpbGUucmVkb1BsYWNlbWVudChwYXJhbXMuYW5nbGUsIHBhcmFtcy5waXRjaCwgcGFyYW1zLmNvbGxpc2lvbkRlYnVnKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQucmVzdWx0LCByZXN1bHQudHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nICYmIGxvYWRpbmdbdWlkXSkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFuZ2xlID0gcGFyYW1zLmFuZ2xlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdwYXJzZSBnZW9qc29uJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaW5kZXhEYXRhID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHRoaXMuZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV0gPSBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAvLyBUT0RPIGFjY2VwdCBwYXJhbXMudXJsIGZvciB1cmxzIGluc3RlYWRcblxuICAgICAgICAvLyBOb3QsIGJlY2F1c2Ugb2Ygc2FtZSBvcmlnaW4gaXNzdWVzLCB1cmxzIG11c3QgZWl0aGVyIGluY2x1ZGUgYW5cbiAgICAgICAgLy8gZXhwbGljaXQgb3JpZ2luIG9yIGFic29sdXRlIHBhdGguXG4gICAgICAgIC8vIGllOiAvZm9vL2Jhci5qc29uIG9yIGh0dHA6Ly9leGFtcGxlLmNvbS9iYXIuanNvblxuICAgICAgICAvLyBidXQgbm90IC4uL2Zvby9iYXIuanNvblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYWpheC5nZXRKU09OKHBhcmFtcy5kYXRhLCBpbmRleERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5kZXhEYXRhKG51bGwsIHBhcmFtcy5kYXRhKTtcbiAgICB9LFxuXG4gICAgJ2xvYWQgZ2VvanNvbiB0aWxlJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc291cmNlID0gcGFyYW1zLnNvdXJjZSxcbiAgICAgICAgICAgIGNvb3JkID0gcGFyYW1zLmNvb3JkO1xuXG4gICAgICAgIC8vIGNvbnNvbGUudGltZSgndGlsZSAnICsgY29vcmQueiArICcgJyArIGNvb3JkLnggKyAnICcgKyBjb29yZC55KTtcblxuICAgICAgICB2YXIgZ2VvSlNPTlRpbGUgPSB0aGlzLmdlb0pTT05JbmRleGVzW3NvdXJjZV0uZ2V0VGlsZShjb29yZC56LCBjb29yZC54LCBjb29yZC55KTtcblxuICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3RpbGUgJyArIGNvb3JkLnogKyAnICcgKyBjb29yZC54ICsgJyAnICsgY29vcmQueSk7XG5cbiAgICAgICAgLy8gaWYgKCFnZW9KU09OVGlsZSkgY29uc29sZS5sb2coJ25vdCBmb3VuZCcsIHRoaXMuZ2VvSlNPTkluZGV4ZXNbc291cmNlXSwgY29vcmQpO1xuXG4gICAgICAgIGlmICghZ2VvSlNPTlRpbGUpIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgLy8gbm90aGluZyBpbiB0aGUgZ2l2ZW4gdGlsZVxuXG4gICAgICAgIHZhciB0aWxlID0gbmV3IFdvcmtlclRpbGUocGFyYW1zKTtcbiAgICAgICAgdGlsZS5wYXJzZShuZXcgR2VvSlNPTldyYXBwZXIoZ2VvSlNPTlRpbGUuZmVhdHVyZXMpLCB0aGlzLmxheWVycywgdGhpcy5hY3RvciwgY2FsbGJhY2spO1xuXG4gICAgICAgIHRoaXMubG9hZGVkW3NvdXJjZV0gPSB0aGlzLmxvYWRlZFtzb3VyY2VdIHx8IHt9O1xuICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdW3BhcmFtcy51aWRdID0gdGlsZTtcbiAgICB9LFxuXG4gICAgJ3F1ZXJ5IGZlYXR1cmVzJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgdGlsZSA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdICYmIHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdW3BhcmFtcy51aWRdO1xuICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgdGlsZS5mZWF0dXJlVHJlZS5xdWVyeShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRmVhdHVyZVRyZWUgPSByZXF1aXJlKCcuLi9kYXRhL2ZlYXR1cmVfdHJlZScpO1xudmFyIENvbGxpc2lvblRpbGUgPSByZXF1aXJlKCcuLi9zeW1ib2wvY29sbGlzaW9uX3RpbGUnKTtcbnZhciBCdWZmZXJTZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0Jyk7XG52YXIgY3JlYXRlQnVja2V0ID0gcmVxdWlyZSgnLi4vZGF0YS9jcmVhdGVfYnVja2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV29ya2VyVGlsZTtcblxuZnVuY3Rpb24gV29ya2VyVGlsZShwYXJhbXMpIHtcbiAgICB0aGlzLmNvb3JkID0gcGFyYW1zLmNvb3JkO1xuICAgIHRoaXMudWlkID0gcGFyYW1zLnVpZDtcbiAgICB0aGlzLnpvb20gPSBwYXJhbXMuem9vbTtcbiAgICB0aGlzLm1heFpvb20gPSBwYXJhbXMubWF4Wm9vbTtcbiAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xuICAgIHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgICB0aGlzLm92ZXJzY2FsaW5nID0gcGFyYW1zLm92ZXJzY2FsaW5nO1xuICAgIHRoaXMuYW5nbGUgPSBwYXJhbXMuYW5nbGU7XG4gICAgdGhpcy5waXRjaCA9IHBhcmFtcy5waXRjaDtcbiAgICB0aGlzLmNvbGxpc2lvbkRlYnVnID0gcGFyYW1zLmNvbGxpc2lvbkRlYnVnO1xuXG4gICAgdGhpcy5zdGFja3MgPSB7fTtcbn1cblxuV29ya2VyVGlsZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihkYXRhLCBsYXllcnMsIGFjdG9yLCBjYWxsYmFjaywgZHosIHhQb3MsIHlQb3MpIHtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuXG4gICAgdGhpcy5mZWF0dXJlVHJlZSA9IG5ldyBGZWF0dXJlVHJlZSh0aGlzLmNvb3JkLCB0aGlzLm92ZXJzY2FsaW5nKTtcblxuICAgIHZhciBpLCBrLFxuICAgICAgICB0aWxlID0gdGhpcyxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGJ1Y2tldCxcbiAgICAgICAgYnVmZmVycyA9IG5ldyBCdWZmZXJTZXQoKSxcbiAgICAgICAgY29sbGlzaW9uVGlsZSA9IG5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsIHRoaXMucGl0Y2gpLFxuICAgICAgICBidWNrZXRzID0ge30sXG4gICAgICAgIGJ1Y2tldHNJbk9yZGVyID0gdGhpcy5idWNrZXRzSW5PcmRlciA9IFtdLFxuICAgICAgICBidWNrZXRzQnlTb3VyY2VMYXllciA9IHt9O1xuXG4gICAgLy8gTWFwIG5vbi1yZWYgbGF5ZXJzIHRvIGJ1Y2tldHMuXG4gICAgZm9yIChpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllciA9IGxheWVyc1tpXTtcblxuICAgICAgICBpZiAobGF5ZXIuc291cmNlICE9PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChsYXllci5yZWYpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgbWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIGlmIChtaW56b29tICYmIHRoaXMuem9vbSA8IG1pbnpvb20gJiYgbWluem9vbSA8IHRoaXMubWF4Wm9vbSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIHZhciBtYXh6b29tID0gbGF5ZXIubWF4em9vbTtcbiAgICAgICAgaWYgKG1heHpvb20gJiYgdGhpcy56b29tID49IG1heHpvb20pXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICB2YXIgdmlzaWJpbGl0eSA9IGxheWVyLmxheW91dC52aXNpYmlsaXR5O1xuICAgICAgICBpZiAodmlzaWJpbGl0eSA9PT0gJ25vbmUnKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgYnVja2V0ID0gY3JlYXRlQnVja2V0KGxheWVyLCBidWZmZXJzLCB0aGlzLnpvb20sIHRoaXMub3ZlcnNjYWxpbmcsIHRoaXMuY29sbGlzaW9uRGVidWcpO1xuICAgICAgICBidWNrZXQubGF5ZXJzID0gW2xheWVyLmlkXTtcblxuICAgICAgICBidWNrZXRzW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIGJ1Y2tldHNJbk9yZGVyLnB1c2goYnVja2V0KTtcblxuICAgICAgICBpZiAoZGF0YS5sYXllcnMpIHtcbiAgICAgICAgICAgIC8vIHZlY3RvcnRpbGVcbiAgICAgICAgICAgIHZhciBzb3VyY2VMYXllciA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIGlmICghYnVja2V0c0J5U291cmNlTGF5ZXJbc291cmNlTGF5ZXJdKVxuICAgICAgICAgICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyW3NvdXJjZUxheWVyXSA9IHt9O1xuICAgICAgICAgICAgYnVja2V0c0J5U291cmNlTGF5ZXJbc291cmNlTGF5ZXJdW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBnZW9qc29uIHRpbGVcbiAgICAgICAgICAgIGJ1Y2tldHNCeVNvdXJjZUxheWVyW2J1Y2tldC5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmRleCByZWYgbGF5ZXJzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAhPT0gdGhpcy5zb3VyY2UpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBpZiAoIWxheWVyLnJlZilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXIucmVmXTtcbiAgICAgICAgaWYgKCFidWNrZXQpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBidWNrZXQubGF5ZXJzLnB1c2gobGF5ZXIuaWQpO1xuICAgIH1cblxuICAgIHZhciBleHRlbnQgPSA0MDk2O1xuXG4gICAgLy8gcmVhZCBlYWNoIGxheWVyLCBhbmQgc29ydCBpdHMgZmVhdHVyZXMgaW50byBidWNrZXRzXG4gICAgaWYgKGRhdGEubGF5ZXJzKSB7XG4gICAgICAgIC8vIHZlY3RvcnRpbGVcbiAgICAgICAgZm9yIChrIGluIGJ1Y2tldHNCeVNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICBsYXllciA9IGRhdGEubGF5ZXJzW2tdO1xuICAgICAgICAgICAgaWYgKCFsYXllcikgY29udGludWU7XG4gICAgICAgICAgICBpZiAobGF5ZXIuZXh0ZW50KSBleHRlbnQgPSBsYXllci5leHRlbnQ7XG4gICAgICAgICAgICBzb3J0TGF5ZXJJbnRvQnVja2V0cyhsYXllciwgYnVja2V0c0J5U291cmNlTGF5ZXJba10sIGR6LCB4UG9zLCB5UG9zKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdlb2pzb25cbiAgICAgICAgc29ydExheWVySW50b0J1Y2tldHMoZGF0YSwgYnVja2V0c0J5U291cmNlTGF5ZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNvcnRMYXllckludG9CdWNrZXRzKGxheWVyLCBidWNrZXRzLCBkeiwgeFBvcywgeVBvcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSk7XG4gICAgICAgICAgICAgLy9NT0JcbiAgICAgICAgICAgIGZlYXR1cmUuZHogPSBkejtcbiAgICAgICAgICAgIGZlYXR1cmUueFBvcyA9IHhQb3M7XG4gICAgICAgICAgICBmZWF0dXJlLnlQb3MgPSB5UG9zO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYnVja2V0cykge1xuICAgICAgICAgICAgICAgIHZhciBidWNrZXQgPSBidWNrZXRzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5maWx0ZXIoZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LmZlYXR1cmVzLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZQbGFjZW1lbnRCdWNrZXQ7XG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Y2tldHNJbk9yZGVyLmxlbmd0aDtcblxuICAgIC8qXG4gICAgICogIFRoZSBhc3luYyBwYXJzaW5nIGhlcmUgaXMgYSBiaXQgdHJpY2t5LlxuICAgICAqICBTb21lIGJ1Y2tldHMgZGVwZW5kIG9uIHJlc291cmNlcyB0aGF0IG1heSBuZWVkIHRvIGJlIGxvYWRlZCBhc3luYyAoZ2x5cGhzKS5cbiAgICAgKiAgU29tZSBidWNrZXRzIG5lZWQgdG8gYmUgcGFyc2VkIGluIG9yZGVyICh0byBnZXQgY29sbGlzaW9uIHByaW9yaXRpZXMgcmlnaHQpLlxuICAgICAqXG4gICAgICogIERlcGVuZGVuY2llcyBjYWxscyBhcmUgaW5pdGlhdGVkIGZpcnN0IHRvIGdldCB0aG9zZSByb2xsaW5nLlxuICAgICAqICBCdWNrZXRzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXIsIGFyZW4ndCB0byBzYXZlIHRpbWUuXG4gICAgICovXG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0c0luT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnVja2V0ID0gYnVja2V0c0luT3JkZXJbaV07XG5cbiAgICAgICAgLy8gTGluayBidWNrZXRzIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQgaW4gb3JkZXJcbiAgICAgICAgaWYgKGJ1Y2tldC5uZWVkc1BsYWNlbWVudCkge1xuICAgICAgICAgICAgaWYgKHByZXZQbGFjZW1lbnRCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICBwcmV2UGxhY2VtZW50QnVja2V0Lm5leHQgPSBidWNrZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1Y2tldC5wcmV2aW91c1BsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2UGxhY2VtZW50QnVja2V0ID0gYnVja2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1Y2tldC5nZXREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5nZXREZXBlbmRlbmNpZXModGhpcywgYWN0b3IsIGRlcGVuZGVuY2llc0RvbmUoYnVja2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbW1lZGlhdGVseSBwYXJzZSBidWNrZXRzIHdoZXJlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyIGFuZCBubyBkZXBlbmRlbmNpZXNcbiAgICAgICAgaWYgKCFidWNrZXQubmVlZHNQbGFjZW1lbnQgJiYgIWJ1Y2tldC5nZXREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHBhcnNlQnVja2V0KHRpbGUsIGJ1Y2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXBlbmRlbmNpZXNEb25lKGJ1Y2tldCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBidWNrZXQuZGVwZW5kZW5jaWVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcnNlQnVja2V0KHRpbGUsIGJ1Y2tldCwgZXJyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUJ1Y2tldCh0aWxlLCBidWNrZXQsIHNraXApIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5nZXREZXBlbmRlbmNpZXMgJiYgIWJ1Y2tldC5kZXBlbmRlbmNpZXNMb2FkZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGJ1Y2tldC5uZWVkc1BsYWNlbWVudCAmJiAhYnVja2V0LnByZXZpb3VzUGxhY2VkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFza2lwKSB7XG4gICAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuZmVhdHVyZXMubGVuZ3RoKSBidWNrZXQuYWRkRmVhdHVyZXMoY29sbGlzaW9uVGlsZSk7XG4gICAgICAgICAgICB2YXIgdGltZSA9IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgICAgICBpZiAoYnVja2V0LmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBidWNrZXQuZmVhdHVyZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZmVhdHVyZVRyZWUuaW5zZXJ0KGZlYXR1cmUuYmJveCgpLCBidWNrZXQubGF5ZXJzLCBmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5idWNrZXRTdGF0cyA9IHNlbGYuYnVja2V0U3RhdHMgfHwge190b3RhbDogMH07XG4gICAgICAgICAgICAgICAgc2VsZi5idWNrZXRTdGF0cy5fdG90YWwgKz0gdGltZTtcbiAgICAgICAgICAgICAgICBzZWxmLmJ1Y2tldFN0YXRzW2J1Y2tldC5pZF0gPSAoc2VsZi5idWNrZXRTdGF0c1tidWNrZXQuaWRdIHx8IDApICsgdGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmICghcmVtYWluaW5nKSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnkgcGFyc2luZyB0aGUgbmV4dCBidWNrZXQsIGlmIGl0IGlzIHJlYWR5XG4gICAgICAgIGlmIChidWNrZXQubmV4dCkge1xuICAgICAgICAgICAgYnVja2V0Lm5leHQucHJldmlvdXNQbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgcGFyc2VCdWNrZXQodGlsZSwgYnVja2V0Lm5leHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcblxuICAgICAgICB0aWxlLnN0YXR1cyA9ICdkb25lJztcblxuICAgICAgICBpZiAodGlsZS5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGlsZS5yZWRvUGxhY2VtZW50KHRpbGUuYW5nbGUsIHRpbGUucGl0Y2gpLnJlc3VsdDtcbiAgICAgICAgICAgIGJ1ZmZlcnMuZ2x5cGhWZXJ0ZXggPSByZXN1bHQuYnVmZmVycy5nbHlwaFZlcnRleDtcbiAgICAgICAgICAgIGJ1ZmZlcnMuaWNvblZlcnRleCA9IHJlc3VsdC5idWZmZXJzLmljb25WZXJ0ZXg7XG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleCA9IHJlc3VsdC5idWZmZXJzLmNvbGxpc2lvbkJveFZlcnRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cmFuc2ZlcmFibGVzID0gW10sXG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzID0ge307XG5cbiAgICAgICAgZm9yIChrIGluIGJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChidWZmZXJzW2tdLmFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoayBpbiBidWNrZXRzKSB7XG4gICAgICAgICAgICBlbGVtZW50R3JvdXBzW2tdID0gYnVja2V0c1trXS5lbGVtZW50R3JvdXBzO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwczogZWxlbWVudEdyb3VwcyxcbiAgICAgICAgICAgIGJ1ZmZlcnM6IGJ1ZmZlcnMsXG4gICAgICAgICAgICBleHRlbnQ6IGV4dGVudFxuICAgICAgICB9LCB0cmFuc2ZlcmFibGVzKTtcbiAgICB9XG59O1xuXG5Xb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50ID0gZnVuY3Rpb24oYW5nbGUsIHBpdGNoLCBjb2xsaXNpb25EZWJ1Zykge1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgICAgdGhpcy5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcnMgPSBuZXcgQnVmZmVyU2V0KCk7XG4gICAgdmFyIHRyYW5zZmVyYWJsZXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudEdyb3VwcyA9IHt9O1xuICAgIHZhciBjb2xsaXNpb25UaWxlID0gbmV3IENvbGxpc2lvblRpbGUoYW5nbGUsIHBpdGNoKTtcblxuICAgIHZhciBidWNrZXRzSW5PcmRlciA9IHRoaXMuYnVja2V0c0luT3JkZXI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXRzSW5PcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnVja2V0ID0gYnVja2V0c0luT3JkZXJbaV07XG5cbiAgICAgICAgaWYgKGJ1Y2tldC50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgYnVja2V0LnBsYWNlRmVhdHVyZXMoY29sbGlzaW9uVGlsZSwgYnVmZmVycywgY29sbGlzaW9uRGVidWcpO1xuICAgICAgICAgICAgZWxlbWVudEdyb3Vwc1tidWNrZXQuaWRdID0gYnVja2V0LmVsZW1lbnRHcm91cHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrIGluIGJ1ZmZlcnMpIHtcbiAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGJ1ZmZlcnNba10uYXJyYXkpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgZWxlbWVudEdyb3VwczogZWxlbWVudEdyb3VwcyxcbiAgICAgICAgICAgIGJ1ZmZlcnM6IGJ1ZmZlcnNcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmZXJhYmxlczogdHJhbnNmZXJhYmxlc1xuICAgIH07XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gQW5pbWF0aW9uTG9vcDtcblxuZnVuY3Rpb24gQW5pbWF0aW9uTG9vcCgpIHtcbiAgICB0aGlzLm4gPSAwO1xuICAgIHRoaXMudGltZXMgPSBbXTtcbn1cblxuLy8gQXJlIGFsbCBhbmltYXRpb25zIGRvbmU/XG5BbmltYXRpb25Mb29wLnByb3RvdHlwZS5zdG9wcGVkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50aW1lcyA9IHRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQudGltZSA+PSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiAhdGhpcy50aW1lcy5sZW5ndGg7XG59O1xuXG4vLyBBZGQgYSBuZXcgYW5pbWF0aW9uIHRoYXQgd2lsbCBydW4gdCBtaWxsaXNlY29uZHNcbi8vIFJldHVybnMgYW4gaWQgdGhhdCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgaXQgbGF5ZXJcbkFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRpbWVzLnB1c2goeyBpZDogdGhpcy5uLCB0aW1lOiB0ICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9KTtcbiAgICByZXR1cm4gdGhpcy5uKys7XG59O1xuXG4vLyBDYW5jZWwgYW4gYW5pbWF0aW9uXG5BbmltYXRpb25Mb29wLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbihuKSB7XG4gICAgdGhpcy50aW1lcyA9IHRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQgIT09IG47XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VTcHJpdGU7XG5cbmZ1bmN0aW9uIEltYWdlU3ByaXRlKGJhc2UpIHtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMucmV0aW5hID0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMTtcblxuICAgIGJhc2UgPSB0aGlzLmJhc2UgKyAodGhpcy5yZXRpbmEgPyAnQDJ4JyA6ICcnKTtcblxuICAgIGFqYXguZ2V0SlNPTihiYXNlICsgJy5qc29uJywgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaW1nKSB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgYWpheC5nZXRJbWFnZShiYXNlICsgJy5wbmcnLCBmdW5jdGlvbihlcnIsIGltZykge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZW11bHRpcGx5IHRoZSBzcHJpdGVcbiAgICAgICAgdmFyIGRhdGEgPSBpbWcuZ2V0RGF0YSgpO1xuICAgICAgICB2YXIgbmV3ZGF0YSA9IGltZy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIHZhciBhbHBoYSA9IGRhdGFbaSArIDNdIC8gMjU1O1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMF0gPSBkYXRhW2kgKyAwXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMV0gPSBkYXRhW2kgKyAxXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgMl0gPSBkYXRhW2kgKyAyXSAqIGFscGhhO1xuICAgICAgICAgICAgbmV3ZGF0YVtpICsgM10gPSBkYXRhW2kgKyAzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1nID0gaW1nO1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICB9LmJpbmQodGhpcykpO1xufVxuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50ZWQpO1xuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZTtcbn07XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5kYXRhICYmIHRoaXMuaW1nKTtcbn07XG5cbkltYWdlU3ByaXRlLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbigvKmdsKi8pIHtcbiAgICBpZiAoYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMSAhPT0gdGhpcy5yZXRpbmEpIHtcbiAgICAgICAgdmFyIG5ld1Nwcml0ZSA9IG5ldyBJbWFnZVNwcml0ZSh0aGlzLmJhc2UpO1xuICAgICAgICBuZXdTcHJpdGUub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3U3ByaXRlLmltZztcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld1Nwcml0ZS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5yZXRpbmEgPSBuZXdTcHJpdGUucmV0aW5hO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIFNwcml0ZVBvc2l0aW9uKCkge31cblNwcml0ZVBvc2l0aW9uLnByb3RvdHlwZSA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCwgcGl4ZWxSYXRpbzogMSwgc2RmOiBmYWxzZSB9O1xuXG5JbWFnZVNwcml0ZS5wcm90b3R5cGUuZ2V0U3ByaXRlUG9zaXRpb24gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZCgpKSByZXR1cm4gbmV3IFNwcml0ZVBvc2l0aW9uKCk7XG5cbiAgICB2YXIgcG9zID0gdGhpcy5kYXRhICYmIHRoaXMuZGF0YVtuYW1lXTtcbiAgICBpZiAocG9zICYmIHRoaXMuaW1nKSByZXR1cm4gcG9zO1xuXG4gICAgcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbigpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vcmVmZXJlbmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge307XG5cbnJlZmVyZW5jZS5sYXlvdXQuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICB2YXIgUHJvcGVydGllcyA9IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXNbcF0gPSBwcm9wc1twXTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHJlZmVyZW5jZVtjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIHByb3AgaW4gcHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydGllc1twcm9wXS5kZWZhdWx0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICBQcm9wZXJ0aWVzLnByb3RvdHlwZVtwcm9wXSA9IHByb3BlcnRpZXNbcHJvcF0uZGVmYXVsdDtcbiAgICB9XG4gICAgbW9kdWxlLmV4cG9ydHNbY2xhc3NOYW1lLnJlcGxhY2UoJ2xheW91dF8nLCAnJyldID0gUHJvcGVydGllcztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi9yZWZlcmVuY2UnKTtcbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5yZWZlcmVuY2UucGFpbnQuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICB2YXIgQ2FsY3VsYXRlZCA9IGZ1bmN0aW9uKCkge307XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHJlZmVyZW5jZVtjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIHAgaW4gcHJvcGVydGllcykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbcF0sXG4gICAgICAgICAgICB2YWx1ZSA9IHByb3AuZGVmYXVsdDtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdjb2xvcicpIHZhbHVlID0gcGFyc2VDU1NDb2xvcih2YWx1ZSk7XG5cbiAgICAgICAgQ2FsY3VsYXRlZC5wcm90b3R5cGVbcF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBDYWxjdWxhdGVkLnByb3RvdHlwZS5oaWRkZW4gPSBmYWxzZTtcbiAgICBtb2R1bGUuZXhwb3J0c1tjbGFzc05hbWUucmVwbGFjZSgncGFpbnRfJywgJycpXSA9IENhbGN1bGF0ZWQ7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIHN0eWxlQmF0Y2ggPSByZXF1aXJlKCcuL3N0eWxlX2JhdGNoJyk7XG52YXIgU3R5bGVMYXllciA9IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXInKTtcbnZhciBJbWFnZVNwcml0ZSA9IHJlcXVpcmUoJy4vaW1hZ2Vfc3ByaXRlJyk7XG52YXIgR2x5cGhTb3VyY2UgPSByZXF1aXJlKCcuLi9zeW1ib2wvZ2x5cGhfc291cmNlJyk7XG52YXIgR2x5cGhBdGxhcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nbHlwaF9hdGxhcycpO1xudmFyIFNwcml0ZUF0bGFzID0gcmVxdWlyZSgnLi4vc3ltYm9sL3Nwcml0ZV9hdGxhcycpO1xudmFyIExpbmVBdGxhcyA9IHJlcXVpcmUoJy4uL3JlbmRlci9saW5lX2F0bGFzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVN0eWxlVVJMO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbnZhciBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaXNwYXRjaGVyJyk7XG52YXIgQW5pbWF0aW9uTG9vcCA9IHJlcXVpcmUoJy4vYW5pbWF0aW9uX2xvb3AnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZTtcblxuZnVuY3Rpb24gU3R5bGUoc3R5bGVzaGVldCwgYW5pbWF0aW9uTG9vcCkge1xuICAgIHRoaXMuYW5pbWF0aW9uTG9vcCA9IGFuaW1hdGlvbkxvb3AgfHwgbmV3IEFuaW1hdGlvbkxvb3AoKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihNYXRoLm1heChicm93c2VyLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAxLCAxKSwgdGhpcyk7XG4gICAgdGhpcy5nbHlwaEF0bGFzID0gbmV3IEdseXBoQXRsYXMoMTAyNCwgMTAyNCk7XG4gICAgdGhpcy5zcHJpdGVBdGxhcyA9IG5ldyBTcHJpdGVBdGxhcyg1MTIsIDUxMik7XG4gICAgdGhpcy5zcHJpdGVBdGxhcy5yZXNpemUoYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB0aGlzLmxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCA1MTIpO1xuXG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgdGhpcy5fb3JkZXIgID0gW107XG4gICAgdGhpcy5fZ3JvdXBzID0gW107XG4gICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICB0aGlzLnpvb21IaXN0b3J5ID0ge307XG5cbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX2ZvcndhcmRTb3VyY2VFdmVudCcsXG4gICAgICAgICdfZm9yd2FyZFRpbGVFdmVudCcsXG4gICAgICAgICdfcmVkb1BsYWNlbWVudCdcbiAgICBdLCB0aGlzKTtcblxuICAgIHZhciBsb2FkZWQgPSBmdW5jdGlvbihlcnIsIHN0eWxlc2hlZXQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsaWQgPSB2YWxpZGF0ZShzdHlsZXNoZWV0KTtcbiAgICAgICAgaWYgKHZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFsaWQuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7XG5cbiAgICAgICAgdmFyIHNvdXJjZXMgPSBzdHlsZXNoZWV0LnNvdXJjZXM7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBzb3VyY2VzW2lkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVzaGVldC5zcHJpdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlID0gbmV3IEltYWdlU3ByaXRlKHN0eWxlc2hlZXQuc3ByaXRlKTtcbiAgICAgICAgICAgIHRoaXMuc3ByaXRlLm9uKCdsb2FkJywgdGhpcy5maXJlLmJpbmQodGhpcywgJ2NoYW5nZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2x5cGhTb3VyY2UgPSBuZXcgR2x5cGhTb3VyY2Uoc3R5bGVzaGVldC5nbHlwaHMsIHRoaXMuZ2x5cGhBdGxhcyk7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoKTtcbiAgICAgICAgdGhpcy5maXJlKCdsb2FkJyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHlsZXNoZWV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBhamF4LmdldEpTT04obm9ybWFsaXplVVJMKHN0eWxlc2hlZXQpLCBsb2FkZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJyb3dzZXIuZnJhbWUobG9hZGVkLmJpbmQodGhpcywgbnVsbCwgc3R5bGVzaGVldCkpO1xuICAgIH1cbn1cblxuU3R5bGUucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KEV2ZW50ZWQsIHtcbiAgICBfbG9hZGVkOiBmYWxzZSxcblxuICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcylcbiAgICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VzW2lkXS5sb2FkZWQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc3ByaXRlICYmICF0aGlzLnNwcml0ZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX3Jlc29sdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaWQsIGxheWVyO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9vcmRlciAgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3R5bGVzaGVldC5sYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxheWVyID0gbmV3IFN0eWxlTGF5ZXIodGhpcy5zdHlsZXNoZWV0LmxheWVyc1tpXSwgdGhpcy5zdHlsZXNoZWV0LmNvbnN0YW50cyB8fCB7fSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLl9vcmRlci5wdXNoKGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgbGF5b3V0IHByb3BlcnRpZXMuXG4gICAgICAgIGZvciAoaWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnJlc29sdmVMYXlvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgcmVmZXJlbmNlIGFuZCBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAgICBmb3IgKGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnJlc29sdmVQYWludCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ3JvdXBMYXllcnMoKTtcbiAgICAgICAgdGhpcy5fYnJvYWRjYXN0TGF5ZXJzKCk7XG4gICAgfSxcblxuICAgIF9ncm91cExheWVyczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBncm91cDtcblxuICAgICAgICB0aGlzLl9ncm91cHMgPSBbXTtcblxuICAgICAgICAvLyBTcGxpdCBpbnRvIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSB0b3AtbGV2ZWwgbGF5ZXJzIHdpdGggdGhlIHNhbWUgc291cmNlLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbdGhpcy5fb3JkZXJbaV1dO1xuXG4gICAgICAgICAgICBpZiAoIWdyb3VwIHx8IGxheWVyLnNvdXJjZSAhPT0gZ3JvdXAuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSBbXTtcbiAgICAgICAgICAgICAgICBncm91cC5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBncm91cC5wdXNoKGxheWVyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfYnJvYWRjYXN0TGF5ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIG9yZGVyZWQucHVzaCh0aGlzLl9sYXllcnNbaWRdLmpzb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXQgbGF5ZXJzJywgb3JkZXJlZCk7XG4gICAgfSxcblxuICAgIF9jYXNjYWRlOiBmdW5jdGlvbihjbGFzc2VzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSByZXR1cm47XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbjogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS5jYXNjYWRlKGNsYXNzZXMsIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24gfHwge30sXG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJyk7XG4gICAgfSxcblxuICAgIF9yZWNhbGN1bGF0ZTogZnVuY3Rpb24oeikge1xuICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNbaWRdLnVzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVab29tSGlzdG9yeSh6KTtcblxuICAgICAgICB0aGlzLnJhc3RlckZhZGVEdXJhdGlvbiA9IDMwMDtcbiAgICAgICAgZm9yIChpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG5cbiAgICAgICAgICAgIGlmIChsYXllci5yZWNhbGN1bGF0ZSh6LCB0aGlzLnpvb21IaXN0b3J5KSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuc291cmNlXS51c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXhab29tVHJhbnNpdGlvbkR1cmF0aW9uID0gMzAwO1xuICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLnopICE9PSBNYXRoLmZsb29yKHopKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KG1heFpvb21UcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56ID0gejtcbiAgICAgICAgdGhpcy5maXJlKCd6b29tJyk7XG4gICAgfSxcblxuICAgIF91cGRhdGVab29tSGlzdG9yeTogZnVuY3Rpb24oeikge1xuXG4gICAgICAgIHZhciB6aCA9IHRoaXMuem9vbUhpc3Rvcnk7XG5cbiAgICAgICAgaWYgKHpoLmxhc3RJbnRlZ2VyWm9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB0aW1lXG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb20gPSBNYXRoLmZsb29yKHopO1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tVGltZSA9IDA7XG4gICAgICAgICAgICB6aC5sYXN0Wm9vbSA9IHo7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGFuIGludGVnZXIgem9vbSBsZXZlbCBhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWVcbiAgICAgICAgLy8gYW5kIGlmIHllcywgcmVjb3JkIGl0IHdpdGggdGhlIHRpbWUuIFVzZWQgZm9yIHRyYW5zaXRpb25pbmcgcGF0dGVybnMuXG4gICAgICAgIGlmIChNYXRoLmZsb29yKHpoLmxhc3Rab29tKSA8IE1hdGguZmxvb3IoeikpIHtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbSA9IE1hdGguZmxvb3Ioeik7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb21UaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB9IGVsc2UgaWYgKE1hdGguZmxvb3IoemgubGFzdFpvb20pID4gTWF0aC5mbG9vcih6KSkge1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tID0gTWF0aC5mbG9vcih6ICsgMSk7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb21UaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHpoLmxhc3Rab29tID0gejtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgbXVsdGlwbGUgc3R5bGUgbXV0YXRpb25zIGluIGEgYmF0Y2hcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3b3JrIEZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgdGhlIFN0eWxlQmF0Y2ggaW50ZXJmYWNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBiYXRjaDogZnVuY3Rpb24od29yaykge1xuICAgICAgICBzdHlsZUJhdGNoKHRoaXMsIHdvcmspO1xuICAgIH0sXG5cbiAgICBhZGRTb3VyY2U6IGZ1bmN0aW9uKGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5iYXRjaChmdW5jdGlvbihiYXRjaCkge1xuICAgICAgICAgICAgYmF0Y2guYWRkU291cmNlKGlkLCBzb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc291cmNlIGZyb20gdGhpcyBzdHlsZXNoZWV0LCBnaXZlbiBpdHMgaWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge1N0eWxlfSB0aGlzIHN0eWxlXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIHNvdXJjZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc291cmNlIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBzb3VyY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFNvdXJjZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc1tpZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U3R5bGVMYXllcnxPYmplY3R9IGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBiZWZvcmUgIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKiBAZmlyZXMgbGF5ZXIuYWRkXG4gICAgICogQHJldHVybnMge1N0eWxlfSBgdGhpc2BcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFkZExheWVyOiBmdW5jdGlvbihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLmFkZExheWVyKGxheWVyLCBiZWZvcmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgbGF5ZXIgZnJvbSB0aGlzIHN0eWxlc2hlZXQsIGdpdmVuIGl0cyBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtTdHlsZX0gdGhpcyBzdHlsZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBsYXllciBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheWVyIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBsYXllclxuICAgICAqIEByZXR1cm5zIHtMYXllcn0gbGF5ZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgYSBsYXllciBoYXMgYSBgcmVmYCBwcm9wZXJ0eSB0aGF0IG1ha2VzIGl0IGRlcml2ZSBzb21lIHZhbHVlc1xuICAgICAqIGZyb20gYW5vdGhlciBsYXllciwgcmV0dXJuIHRoYXQgcmVmZXJlbnQgbGF5ZXIuIE90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIHRoZSBsYXllciBpdHNlbGYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIHRoZSBsYXllcidzIGlkXG4gICAgICogQHJldHVybnMge0xheWVyfSB0aGUgcmVmZXJlbnQgbGF5ZXIgb3IgdGhlIGxheWVyIGl0c2VsZlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0UmVmZXJlbnRMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5nZXRMYXllcihpZCk7XG4gICAgICAgIGlmIChsYXllci5yZWYpIHtcbiAgICAgICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllci5yZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICB9LFxuXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbihsYXllciwgZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnNldEZpbHRlcihsYXllciwgZmlsdGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHNldExheWVyWm9vbVJhbmdlOiBmdW5jdGlvbihsYXllcklkLCBtaW56b29tLCBtYXh6b29tKSB7XG4gICAgICAgIHRoaXMuYmF0Y2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgIGJhdGNoLnNldExheWVyWm9vbVJhbmdlKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5ZXIncyBmaWx0ZXIgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHJldHVybnMgeyp9IHRoZSBsYXllcidzIGZpbHRlciwgaWYgYW55XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlZmVyZW50TGF5ZXIobGF5ZXIpLmZpbHRlcjtcbiAgICB9LFxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5zZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGxheWVyKS5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKTtcbiAgICB9LFxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIHZhbHVlLCBrbGFzcykge1xuICAgICAgICB0aGlzLmJhdGNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICBiYXRjaC5zZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIGtsYXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExheWVyKGxheWVyKS5nZXRQYWludFByb3BlcnR5KG5hbWUsIGtsYXNzKTtcbiAgICB9LFxuXG4gICAgZmVhdHVyZXNBdDogZnVuY3Rpb24oY29vcmQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZlYXR1cmVzID0gW107XG4gICAgICAgIHZhciBlcnJvciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5sYXllcikge1xuICAgICAgICAgICAgcGFyYW1zLmxheWVyID0geyBpZDogcGFyYW1zLmxheWVyIH07XG4gICAgICAgIH1cblxuICAgICAgICB1dGlsLmFzeW5jRWFjaChPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLCBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgc291cmNlLmZlYXR1cmVzQXQoY29vcmQsIHBhcmFtcywgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSBmZWF0dXJlcyA9IGZlYXR1cmVzLmNvbmNhdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tmZWF0dXJlLmxheWVyXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5sYXllciA9IHRoaXMuX2xheWVyc1tmZWF0dXJlLmxheWVyXS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSkpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgIH0sXG5cbiAgICBfcmVsb2FkU291cmNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLnNvdXJjZXNbaWRdLnJlbG9hZCgpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlU291cmNlczogZnVuY3Rpb24odHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2lkXS51cGRhdGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcmVkb1BsYWNlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tpZF0ucmVkb1BsYWNlbWVudCkgdGhpcy5zb3VyY2VzW2lkXS5yZWRvUGxhY2VtZW50KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTb3VyY2VFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLmZpcmUoJ3NvdXJjZS4nICsgZS50eXBlLCB1dGlsLmV4dGVuZCh7c291cmNlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRUaWxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3NvdXJjZTogZS50YXJnZXR9LCBlKSk7XG4gICAgfSxcblxuICAgIC8vIENhbGxiYWNrcyBmcm9tIHdlYiB3b3JrZXJzXG5cbiAgICAnZ2V0IHNwcml0ZSBqc29uJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3ByaXRlID0gdGhpcy5zcHJpdGU7XG4gICAgICAgIGlmIChzcHJpdGUubG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgc3ByaXRlOiBzcHJpdGUuZGF0YSwgcmV0aW5hOiBzcHJpdGUucmV0aW5hIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ByaXRlLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgeyBzcHJpdGU6IHNwcml0ZS5kYXRhLCByZXRpbmE6IHNwcml0ZS5yZXRpbmEgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnZ2V0IGljb25zJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3ByaXRlID0gdGhpcy5zcHJpdGU7XG4gICAgICAgIHZhciBzcHJpdGVBdGxhcyA9IHRoaXMuc3ByaXRlQXRsYXM7XG4gICAgICAgIGlmIChzcHJpdGUubG9hZGVkKCkpIHtcbiAgICAgICAgICAgIHNwcml0ZUF0bGFzLnNldFNwcml0ZShzcHJpdGUpO1xuICAgICAgICAgICAgc3ByaXRlQXRsYXMuYWRkSWNvbnMocGFyYW1zLmljb25zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcHJpdGUub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzcHJpdGVBdGxhcy5zZXRTcHJpdGUoc3ByaXRlKTtcbiAgICAgICAgICAgICAgICBzcHJpdGVBdGxhcy5hZGRJY29ucyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdnZXQgZ2x5cGhzJzogZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdseXBoU291cmNlLmdldFNpbXBsZUdseXBocyhwYXJhbXMuZm9udHN0YWNrLCBwYXJhbXMuY29kZXBvaW50cywgcGFyYW1zLnVpZCwgY2FsbGJhY2spO1xuICAgIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU291cmNlID0gcmVxdWlyZSgnLi4vc291cmNlL3NvdXJjZScpO1xudmFyIFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuL3N0eWxlX2xheWVyJyk7XG5cbmZ1bmN0aW9uIHN0eWxlQmF0Y2goc3R5bGUsIHdvcmspIHtcbiAgICBpZiAoIXN0eWxlLl9sb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgdmFyIGJhdGNoID0gT2JqZWN0LmNyZWF0ZShzdHlsZUJhdGNoLnByb3RvdHlwZSk7XG5cbiAgICBiYXRjaC5fc3R5bGUgPSBzdHlsZTtcbiAgICBiYXRjaC5fZ3JvdXBMYXllcnMgPSBmYWxzZTtcbiAgICBiYXRjaC5fYnJvYWRjYXN0TGF5ZXJzID0gZmFsc2U7XG4gICAgYmF0Y2guX3JlbG9hZFNvdXJjZXMgPSB7fTtcbiAgICBiYXRjaC5fZXZlbnRzID0gW107XG4gICAgYmF0Y2guX2NoYW5nZSA9IGZhbHNlO1xuXG4gICAgd29yayhiYXRjaCk7XG5cbiAgICBpZiAoYmF0Y2guX2dyb3VwTGF5ZXJzKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5fZ3JvdXBMYXllcnMoKTtcbiAgICB9XG5cbiAgICBpZiAoYmF0Y2guX2Jyb2FkY2FzdExheWVycykge1xuICAgICAgICBiYXRjaC5fc3R5bGUuX2Jyb2FkY2FzdExheWVycygpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGJhdGNoLl9yZWxvYWRTb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZUlkKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5fcmVsb2FkU291cmNlKHNvdXJjZUlkKTtcbiAgICB9KTtcblxuICAgIGJhdGNoLl9ldmVudHMuZm9yRWFjaChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIGJhdGNoLl9zdHlsZS5maXJlLmFwcGx5KGJhdGNoLl9zdHlsZSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICBpZiAoYmF0Y2guX2NoYW5nZSkge1xuICAgICAgICBiYXRjaC5fc3R5bGUuZmlyZSgnY2hhbmdlJyk7XG4gICAgfVxufVxuXG5zdHlsZUJhdGNoLnByb3RvdHlwZSA9IHtcblxuICAgIGFkZExheWVyOiBmdW5jdGlvbihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5fbGF5ZXJzW2xheWVyLmlkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYSBsYXllciB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShsYXllciBpbnN0YW5jZW9mIFN0eWxlTGF5ZXIpKSB7XG4gICAgICAgICAgICBsYXllciA9IG5ldyBTdHlsZUxheWVyKGxheWVyLCB0aGlzLl9zdHlsZS5zdHlsZXNoZWV0LmNvbnN0YW50cyB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3R5bGUuX2xheWVyc1tsYXllci5pZF0gPSBsYXllcjtcbiAgICAgICAgdGhpcy5fc3R5bGUuX29yZGVyLnNwbGljZShiZWZvcmUgPyB0aGlzLl9zdHlsZS5fb3JkZXIuaW5kZXhPZihiZWZvcmUpIDogSW5maW5pdHksIDAsIGxheWVyLmlkKTtcbiAgICAgICAgbGF5ZXIucmVzb2x2ZUxheW91dCgpO1xuICAgICAgICBsYXllci5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX3N0eWxlLl9sYXllcnMpO1xuICAgICAgICBsYXllci5yZXNvbHZlUGFpbnQoKTtcblxuICAgICAgICB0aGlzLl9ncm91cExheWVycyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXZlbnRzLnB1c2goWydsYXllci5hZGQnLCB7bGF5ZXI6IGxheWVyfV0pO1xuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fc3R5bGUuX2xheWVyc1tpZF07XG4gICAgICAgIGlmIChsYXllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGxheWVyIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fc3R5bGUuX2xheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlLl9sYXllcnNbaV0ucmVmID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXIoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0eWxlLl9sYXllcnNbaWRdO1xuICAgICAgICB0aGlzLl9zdHlsZS5fb3JkZXIuc3BsaWNlKHRoaXMuX3N0eWxlLl9vcmRlci5pbmRleE9mKGlkKSwgMSk7XG5cbiAgICAgICAgdGhpcy5fZ3JvdXBMYXllcnMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9icm9hZGNhc3RMYXllcnMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9ldmVudHMucHVzaChbJ2xheWVyLnJlbW92ZScsIHtsYXllcjogbGF5ZXJ9XSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHNldFBhaW50UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdGhpcy5fc3R5bGUuZ2V0TGF5ZXIobGF5ZXIpLnNldFBhaW50UHJvcGVydHkobmFtZSwgdmFsdWUsIGtsYXNzKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHk6IGZ1bmN0aW9uKGxheWVyLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBsYXllciA9IHRoaXMuX3N0eWxlLmdldFJlZmVyZW50TGF5ZXIobGF5ZXIpO1xuICAgICAgICBsYXllci5zZXRMYXlvdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fYnJvYWRjYXN0TGF5ZXJzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlc1tsYXllci5zb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBzZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyLCBmaWx0ZXIpIHtcbiAgICAgICAgbGF5ZXIgPSB0aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGxheWVyKTtcbiAgICAgICAgbGF5ZXIuZmlsdGVyID0gZmlsdGVyO1xuXG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2U6IGZ1bmN0aW9uKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pIHtcbiAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fc3R5bGUuZ2V0UmVmZXJlbnRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKG1pbnpvb20gIT0gbnVsbCkge1xuICAgICAgICAgIGxheWVyLm1pbnpvb20gPSBtaW56b29tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXh6b29tICE9IG51bGwpIHtcbiAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Jyb2FkY2FzdExheWVycyA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgYWRkU291cmNlOiBmdW5jdGlvbihpZCwgc291cmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3R5bGUuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlLnNvdXJjZXNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBTb3VyY2UuY3JlYXRlKHNvdXJjZSk7XG4gICAgICAgIHRoaXMuX3N0eWxlLnNvdXJjZXNbaWRdID0gc291cmNlO1xuICAgICAgICBzb3VyY2UuaWQgPSBpZDtcbiAgICAgICAgc291cmNlLnN0eWxlID0gdGhpcy5fc3R5bGU7XG4gICAgICAgIHNvdXJjZS5kaXNwYXRjaGVyID0gdGhpcy5fc3R5bGUuZGlzcGF0Y2hlcjtcbiAgICAgICAgc291cmNlLmdseXBoQXRsYXMgPSB0aGlzLl9zdHlsZS5nbHlwaEF0bGFzO1xuICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIC5vbignbG9hZCcsIHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbignY2hhbmdlJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5hZGQnLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5sb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub24oJ3RpbGUuZXJyb3InLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5yZW1vdmUnLCB0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRzLnB1c2goWydzb3VyY2UuYWRkJywge3NvdXJjZTogc291cmNlfV0pO1xuICAgICAgICB0aGlzLl9jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZW1vdmVTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5zb3VyY2VzW2lkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fc3R5bGUuc291cmNlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdHlsZS5zb3VyY2VzW2lkXTtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAub2ZmKCdsb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vZmYoJ2Vycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vZmYoJ2NoYW5nZScsIHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmFkZCcsIHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9mZigndGlsZS5sb2FkJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLmVycm9yJywgdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAub2ZmKCd0aWxlLnJlbW92ZScsIHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KTtcblxuICAgICAgICB0aGlzLl9ldmVudHMucHVzaChbJ3NvdXJjZS5yZW1vdmUnLCB7c291cmNlOiBzb3VyY2V9XSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZUJhdGNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSwgY29uc3RhbnRzKSB7XG4gICAgZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZVswXSA9PT0gJ0AnID8gY29uc3RhbnRzW3ZhbHVlXSA6IHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgdmFsdWUgPSByZXNvbHZlKHZhbHVlKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbaV0gaW4gY29uc3RhbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbaV0gPSByZXNvbHZlKHZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdG9wcykge1xuICAgICAgICB2YWx1ZSA9IHV0aWwuZXh0ZW5kKHt9LCB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLnN0b3BzID0gdmFsdWUuc3RvcHMuc2xpY2UoKTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWUuc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdG9wc1tpXVsxXSBpbiBjb25zdGFudHMpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zdG9wc1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3RvcHNbaV1bMF0sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUuc3RvcHNbaV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydHMucmVzb2x2ZUFsbCA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBjb25zdGFudHMpIHtcbiAgICBpZiAoIWNvbnN0YW50cylcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IGV4cG9ydHMucmVzb2x2ZShwcm9wZXJ0aWVzW2tleV0sIGNvbnN0YW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xudmFyIG1hcGJveEdMRnVuY3Rpb24gPSByZXF1aXJlKCdtYXBib3gtZ2wtZnVuY3Rpb24nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVEZWNsYXJhdGlvbjtcblxuZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvbihyZWZlcmVuY2UsIHZhbHVlKSB7XG4gICAgdGhpcy50eXBlID0gcmVmZXJlbmNlLnR5cGU7XG4gICAgdGhpcy50cmFuc2l0aW9uYWJsZSA9IHJlZmVyZW5jZS50cmFuc2l0aW9uO1xuXG4gICAgLy8gaW1tdXRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiB1c2VkIGZvciBjb21wYXJpc29uXG4gICAgdGhpcy5qc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbG9yJykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5zdG9wcykge1xuICAgICAgICB0aGlzLnZhbHVlID0gcHJlcGFyZUNvbG9yRnVuY3Rpb24odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBwYXJzZUNvbG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocmVmZXJlbmNlLmZ1bmN0aW9uID09PSAnaW50ZXJwb2xhdGVkJykge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZSA9IG1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHRoaXMudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlID0gbWFwYm94R0xGdW5jdGlvblsncGllY2V3aXNlLWNvbnN0YW50J10odGhpcy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UudHJhbnNpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGUgPSB0cmFuc2l0aW9uZWQodGhpcy5jYWxjdWxhdGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uZWQoY2FsY3VsYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHosIHpoLCBkdXJhdGlvbikge1xuICAgICAgICB2YXIgZnJhY3Rpb24gPSB6ICUgMTtcbiAgICAgICAgdmFyIHQgPSBNYXRoLm1pbigoRGF0ZS5ub3coKSAtIHpoLmxhc3RJbnRlZ2VyWm9vbVRpbWUpIC8gZHVyYXRpb24sIDEpO1xuICAgICAgICB2YXIgZnJvbVNjYWxlID0gMTtcbiAgICAgICAgdmFyIHRvU2NhbGUgPSAxO1xuICAgICAgICB2YXIgbWl4LCBmcm9tLCB0bztcblxuICAgICAgICBpZiAoeiA+IHpoLmxhc3RJbnRlZ2VyWm9vbSkge1xuICAgICAgICAgICAgbWl4ID0gZnJhY3Rpb24gKyAoMSAtIGZyYWN0aW9uKSAqIHQ7XG4gICAgICAgICAgICBmcm9tU2NhbGUgKj0gMjtcbiAgICAgICAgICAgIGZyb20gPSBjYWxjdWxhdGUoeiAtIDEpO1xuICAgICAgICAgICAgdG8gPSBjYWxjdWxhdGUoeik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaXggPSAxIC0gKDEgLSB0KSAqIGZyYWN0aW9uO1xuICAgICAgICAgICAgdG8gPSBjYWxjdWxhdGUoeik7XG4gICAgICAgICAgICBmcm9tID0gY2FsY3VsYXRlKHogKyAxKTtcbiAgICAgICAgICAgIGZyb21TY2FsZSAvPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICBmcm9tU2NhbGU6IGZyb21TY2FsZSxcbiAgICAgICAgICAgIHRvOiB0byxcbiAgICAgICAgICAgIHRvU2NhbGU6IHRvU2NhbGUsXG4gICAgICAgICAgICB0OiBtaXhcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG52YXIgY29sb3JDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBwYXJzZUNvbG9yKHZhbHVlKSB7XG4gICAgaWYgKGNvbG9yQ2FjaGVbdmFsdWVdKSByZXR1cm4gY29sb3JDYWNoZVt2YWx1ZV07XG4gICAgdmFyIGNvbG9yID0gcHJlcGFyZUNvbG9yKHBhcnNlQ1NTQ29sb3IodmFsdWUpKTtcbiAgICBjb2xvckNhY2hlW3ZhbHVlXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbG9yKGMpIHtcbiAgICByZXR1cm4gW2NbMF0gLyAyNTUsIGNbMV0gLyAyNTUsIGNbMl0gLyAyNTUsIGNbM10gLyAxXTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbG9yRnVuY3Rpb24oZikge1xuICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSwgZiwge3N0b3BzOiBmLnN0b3BzLm1hcChmdW5jdGlvbihzdG9wKSB7XG4gICAgICAgIHJldHVybiBbc3RvcFswXSwgcGFyc2VDb2xvcihzdG9wWzFdKV07XG4gICAgfSl9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciByZWZlcmVuY2UgPSByZXF1aXJlKCcuL3JlZmVyZW5jZScpO1xudmFyIFN0eWxlQ29uc3RhbnQgPSByZXF1aXJlKCcuL3N0eWxlX2NvbnN0YW50Jyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vc3R5bGVfZGVjbGFyYXRpb24nKTtcblxudmFyIGxvb2t1cCA9IHtcbiAgICBwYWludDoge30sXG4gICAgbGF5b3V0OiB7fVxufTtcblxucmVmZXJlbmNlLmxheWVyLnR5cGUudmFsdWVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgIGxvb2t1cC5wYWludFt0eXBlXSA9IG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2VbJ3BhaW50XycgKyB0eXBlXSk7XG4gICAgbG9va3VwLmxheW91dFt0eXBlXSA9IG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2VbJ2xheW91dF8nICsgdHlwZV0pO1xufSk7XG5cbmZ1bmN0aW9uIG1ha2VDb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICBmdW5jdGlvbiBTdHlsZURlY2xhcmF0aW9uU2V0KHByb3BlcnRpZXMsIGNvbnN0YW50cykge1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbnMgPSB7fTtcblxuICAgICAgICB0aGlzLl9jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzW2tdID0gU3R5bGVDb25zdGFudC5yZXNvbHZlKHByb3BlcnRpZXNba10sIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhyZWZlcmVuY2UpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSByZWZlcmVuY2Vba107XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0eWxlRGVjbGFyYXRpb25TZXQucHJvdG90eXBlLCBrLCB7XG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNba10gPSBuZXcgU3R5bGVEZWNsYXJhdGlvbihwcm9wZXJ0eSwgU3R5bGVDb25zdGFudC5yZXNvbHZlKHYsIHRoaXMuX2NvbnN0YW50cykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1trXS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZSwgayArICctdHJhbnNpdGlvbicsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbnNba10gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25zW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgICB9O1xuXG4gICAgU3R5bGVEZWNsYXJhdGlvblNldC5wcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKGssIGdsb2JhbCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuX3RyYW5zaXRpb25zW2tdIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHVyYXRpb246IHV0aWwuY29hbGVzY2UodC5kdXJhdGlvbiwgZ2xvYmFsLmR1cmF0aW9uLCAzMDApLFxuICAgICAgICAgICAgZGVsYXk6IHV0aWwuY29hbGVzY2UodC5kZWxheSwgZ2xvYmFsLmRlbGF5LCAwKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBTdHlsZURlY2xhcmF0aW9uU2V0LnByb3RvdHlwZS5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciB2IGluIHRoaXMuX3ZhbHVlcykge1xuICAgICAgICAgICAgcmVzdWx0W3ZdID0gdGhpcy5fdmFsdWVzW3ZdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90cmFuc2l0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0W3QgKyAnLXRyYW5zaXRpb24nXSA9IHRoaXMuX3RyYW5zaXRpb25zW3ZdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN0eWxlRGVjbGFyYXRpb25TZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVuZGVyVHlwZSwgbGF5ZXJUeXBlLCBwcm9wZXJ0aWVzLCBjb25zdGFudHMpIHtcbiAgICByZXR1cm4gbmV3IGxvb2t1cFtyZW5kZXJUeXBlXVtsYXllclR5cGVdKHByb3BlcnRpZXMsIGNvbnN0YW50cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xudmFyIFN0eWxlQ29uc3RhbnQgPSByZXF1aXJlKCcuL3N0eWxlX2NvbnN0YW50Jyk7XG52YXIgU3R5bGVUcmFuc2l0aW9uID0gcmVxdWlyZSgnLi9zdHlsZV90cmFuc2l0aW9uJyk7XG52YXIgU3R5bGVEZWNsYXJhdGlvblNldCA9IHJlcXVpcmUoJy4vc3R5bGVfZGVjbGFyYXRpb25fc2V0Jyk7XG52YXIgTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4vbGF5b3V0X3Byb3BlcnRpZXMnKTtcbnZhciBQYWludFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3BhaW50X3Byb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZUxheWVyO1xuXG5mdW5jdGlvbiBTdHlsZUxheWVyKGxheWVyLCBjb25zdGFudHMpIHtcbiAgICB0aGlzLl9sYXllciA9IGxheWVyO1xuICAgIHRoaXMuX2NvbnN0YW50cyA9IGNvbnN0YW50cztcblxuICAgIHRoaXMuaWQgPSBsYXllci5pZDtcbiAgICB0aGlzLnJlZiA9IGxheWVyLnJlZjtcblxuICAgIC8vIFJlc29sdmVkIGFuZCBjYXNjYWRlZCBwYWludCBwcm9wZXJ0aWVzLlxuICAgIHRoaXMuX3Jlc29sdmVkID0ge307IC8vIGNsYXNzIG5hbWUgLT4gU3R5bGVEZWNsYXJhdGlvblNldFxuICAgIHRoaXMuX2Nhc2NhZGVkID0ge307IC8vIHByb3BlcnR5IG5hbWUgLT4gU3R5bGVUcmFuc2l0aW9uXG5cbiAgICB0aGlzLmFzc2lnbihsYXllcik7XG59XG5cblN0eWxlTGF5ZXIucHJvdG90eXBlID0ge1xuICAgIHJlc29sdmVMYXlvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVmKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBMYXlvdXRQcm9wZXJ0aWVzW3RoaXMudHlwZV0oXG4gICAgICAgICAgICAgICAgU3R5bGVDb25zdGFudC5yZXNvbHZlQWxsKHRoaXMuX2xheWVyLmxheW91dCwgdGhpcy5fY29uc3RhbnRzKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dFsnc3ltYm9sLXBsYWNlbWVudCddID09PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGF5b3V0Lmhhc093blByb3BlcnR5KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sYXlvdXQuaGFzT3duUHJvcGVydHkoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10gPSAnbWFwJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRbJ3N5bWJvbC1hdm9pZC1lZGdlcyddID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRbbmFtZV0gPSBTdHlsZUNvbnN0YW50LnJlc29sdmUodmFsdWUsIHRoaXMuX2NvbnN0YW50cyk7XG4gICAgfSxcblxuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFtuYW1lXTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZVJlZmVyZW5jZTogZnVuY3Rpb24obGF5ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZikge1xuICAgICAgICAgICAgdGhpcy5hc3NpZ24obGF5ZXJzW3RoaXMucmVmXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzb2x2ZVBhaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiB0aGlzLl9sYXllcikge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gcC5tYXRjaCgvXnBhaW50KD86XFwuKC4qKSk/JC8pO1xuICAgICAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVkW21hdGNoWzFdIHx8ICcnXSA9XG4gICAgICAgICAgICAgICAgbmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoJ3BhaW50JywgdGhpcy50eXBlLCB0aGlzLl9sYXllcltwXSwgdGhpcy5fY29uc3RhbnRzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXTtcbiAgICAgICAgaWYgKCFkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXSA9XG4gICAgICAgICAgICAgICAgbmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoJ3BhaW50JywgdGhpcy50eXBlLCB7fSwgdGhpcy5fY29uc3RhbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBkZWNsYXJhdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9LFxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eTogZnVuY3Rpb24obmFtZSwga2xhc3MpIHtcbiAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzIHx8ICcnXTtcbiAgICAgICAgaWYgKCFkZWNsYXJhdGlvbnMpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25zW25hbWVdO1xuICAgIH0sXG5cbiAgICBjYXNjYWRlOiBmdW5jdGlvbihjbGFzc2VzLCBvcHRpb25zLCBnbG9iYWxUcmFucywgYW5pbWF0aW9uTG9vcCkge1xuICAgICAgICBmb3IgKHZhciBrbGFzcyBpbiB0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICAgICAgaWYgKGtsYXNzICE9PSBcIlwiICYmICFjbGFzc2VzW2tsYXNzXSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMuX3Jlc29sdmVkW2tsYXNzXSxcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBkZWNsYXJhdGlvbnMudmFsdWVzKCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld0RlY2xhcmF0aW9uID0gdmFsdWVzW2tdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRUcmFuc2l0aW9uID0gb3B0aW9ucy50cmFuc2l0aW9uID8gdGhpcy5fY2FzY2FkZWRba10gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIG5ldyB0cmFuc2l0aW9uIGlmIHRoZSBkZWNsYXJhdGlvbiBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgaWYgKCFvbGRUcmFuc2l0aW9uIHx8IG9sZFRyYW5zaXRpb24uZGVjbGFyYXRpb24uanNvbiAhPT0gbmV3RGVjbGFyYXRpb24uanNvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U3R5bGVUcmFucyA9IGRlY2xhcmF0aW9ucy50cmFuc2l0aW9uKGssIGdsb2JhbFRyYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RyYW5zaXRpb24gPSB0aGlzLl9jYXNjYWRlZFtrXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3R5bGVUcmFuc2l0aW9uKG5ld0RlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCBuZXdTdHlsZVRyYW5zKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGFuaW1hdGlvbiBsb29wIHVudGlsIHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdUcmFuc2l0aW9uLmluc3RhbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHJhbnNpdGlvbi5sb29wSUQgPSBhbmltYXRpb25Mb29wLnNldChuZXdUcmFuc2l0aW9uLmVuZFRpbWUgLSAobmV3IERhdGUoKSkuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25Mb29wLmNhbmNlbChvbGRUcmFuc2l0aW9uLmxvb3BJRCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVjYWxjdWxhdGU6IGZ1bmN0aW9uKHosIHpvb21IaXN0b3J5KSB7XG4gICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlLFxuICAgICAgICAgICAgY2FsY3VsYXRlZCA9IHRoaXMucGFpbnQgPSBuZXcgUGFpbnRQcm9wZXJ0aWVzW3R5cGVdKCk7XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLl9jYXNjYWRlZCkge1xuICAgICAgICAgICAgY2FsY3VsYXRlZFtrXSA9IHRoaXMuX2Nhc2NhZGVkW2tdLmF0KHosIHpvb21IaXN0b3J5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGlkZGVuID0gKHRoaXMubWluem9vbSAmJiB6IDwgdGhpcy5taW56b29tKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1heHpvb20gJiYgeiA+PSB0aGlzLm1heHpvb20pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB2aXNpYmlsaXR5IGNoZWNrIGZvciBub24tYnVja2V0ZWQgYmFja2dyb3VuZCBsYXllcnNcbiAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sYXlvdXQudmlzaWJpbGl0eSA9PT0gJ25vbmUnKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIGlmICgoY2FsY3VsYXRlZFsndGV4dC1vcGFjaXR5J10gPT09IDAgfHwgIXRoaXMubGF5b3V0Wyd0ZXh0LWZpZWxkJ10pICYmXG4gICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRbJ2ljb24tb3BhY2l0eSddID09PSAwIHx8ICF0aGlzLmxheW91dFsnaWNvbi1pbWFnZSddKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlbXVsdGlwbHlMYXllcihjYWxjdWxhdGVkLCAndGV4dCcpO1xuICAgICAgICAgICAgICAgIHByZW11bHRpcGx5TGF5ZXIoY2FsY3VsYXRlZCwgJ2ljb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGNhbGN1bGF0ZWRbdHlwZSArICctb3BhY2l0eSddID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmVtdWx0aXBseUxheWVyKGNhbGN1bGF0ZWQsIHR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2Nhc2NhZGVkWydsaW5lLWRhc2hhcnJheSddKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBkYXNoZWQsIHNjYWxlIHRoZSBkYXNoIGxlbmd0aHMgYnkgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIHdpZHRoIGF0IHRoZSBwcmV2aW91cyByb3VuZCB6b29tIGxldmVsLlxuICAgICAgICAgICAgdmFyIGRhc2hBcnJheSA9IGNhbGN1bGF0ZWRbJ2xpbmUtZGFzaGFycmF5J107XG4gICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5fY2FzY2FkZWRbJ2xpbmUtd2lkdGgnXSA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FzY2FkZWRbJ2xpbmUtd2lkdGgnXS5hdChNYXRoLmZsb29yKHopLCBJbmZpbml0eSkgOlxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRbJ2xpbmUtd2lkdGgnXTtcblxuICAgICAgICAgICAgZGFzaEFycmF5LmZyb21TY2FsZSAqPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICBkYXNoQXJyYXkudG9TY2FsZSAqPSBsaW5lV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuaGlkZGVuO1xuICAgIH0sXG5cbiAgICBhc3NpZ246IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhsYXllcixcbiAgICAgICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJyxcbiAgICAgICAgICAgICdtaW56b29tJywgJ21heHpvb20nLCAnZmlsdGVyJyxcbiAgICAgICAgICAgICdsYXlvdXQnXSkpO1xuICAgIH0sXG5cbiAgICBqc29uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LFxuICAgICAgICAgICAgdGhpcy5fbGF5ZXIsXG4gICAgICAgICAgICB1dGlsLnBpY2sodGhpcyxcbiAgICAgICAgICAgICAgICBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsXG4gICAgICAgICAgICAgICAgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLFxuICAgICAgICAgICAgICAgICdsYXlvdXQnLCAncGFpbnQnXSkpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHByZW11bHRpcGx5TGF5ZXIobGF5ZXIsIHR5cGUpIHtcbiAgICB2YXIgY29sb3JQcm9wID0gdHlwZSArICctY29sb3InLFxuICAgICAgICBoYWxvUHJvcCA9IHR5cGUgKyAnLWhhbG8tY29sb3InLFxuICAgICAgICBvdXRsaW5lUHJvcCA9IHR5cGUgKyAnLW91dGxpbmUtY29sb3InLFxuICAgICAgICBjb2xvciA9IGxheWVyW2NvbG9yUHJvcF0sXG4gICAgICAgIGhhbG9Db2xvciA9IGxheWVyW2hhbG9Qcm9wXSxcbiAgICAgICAgb3V0bGluZUNvbG9yID0gbGF5ZXJbb3V0bGluZVByb3BdLFxuICAgICAgICBvcGFjaXR5ID0gbGF5ZXJbdHlwZSArICctb3BhY2l0eSddO1xuXG4gICAgdmFyIGNvbG9yT3BhY2l0eSA9IGNvbG9yICYmIChvcGFjaXR5ICogY29sb3JbM10pO1xuICAgIHZhciBoYWxvT3BhY2l0eSA9IGhhbG9Db2xvciAmJiAob3BhY2l0eSAqIGhhbG9Db2xvclszXSk7XG4gICAgdmFyIG91dGxpbmVPcGFjaXR5ID0gb3V0bGluZUNvbG9yICYmIChvcGFjaXR5ICogb3V0bGluZUNvbG9yWzNdKTtcblxuICAgIGlmIChjb2xvck9wYWNpdHkgIT09IHVuZGVmaW5lZCAmJiBjb2xvck9wYWNpdHkgPCAxKSB7XG4gICAgICAgIGxheWVyW2NvbG9yUHJvcF0gPSB1dGlsLnByZW11bHRpcGx5KFtjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBjb2xvck9wYWNpdHldKTtcbiAgICB9XG4gICAgaWYgKGhhbG9PcGFjaXR5ICE9PSB1bmRlZmluZWQgJiYgaGFsb09wYWNpdHkgPCAxKSB7XG4gICAgICAgIGxheWVyW2hhbG9Qcm9wXSA9IHV0aWwucHJlbXVsdGlwbHkoW2hhbG9Db2xvclswXSwgaGFsb0NvbG9yWzFdLCBoYWxvQ29sb3JbMl0sIGhhbG9PcGFjaXR5XSk7XG4gICAgfVxuICAgIGlmIChvdXRsaW5lT3BhY2l0eSAhPT0gdW5kZWZpbmVkICYmIG91dGxpbmVPcGFjaXR5IDwgMSkge1xuICAgICAgICBsYXllcltvdXRsaW5lUHJvcF0gPSB1dGlsLnByZW11bHRpcGx5KFtvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eV0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZVRyYW5zaXRpb247XG5cbi8qXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byBkZWNsYXJhdGlvbnNcbiAqL1xuZnVuY3Rpb24gU3R5bGVUcmFuc2l0aW9uKGRlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCB2YWx1ZSkge1xuXG4gICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5lbmRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuICAgIHZhciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTtcbiAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdhcnJheScpICYmIGRlY2xhcmF0aW9uLnRyYW5zaXRpb25hYmxlKSB7XG4gICAgICAgIHRoaXMuaW50ZXJwID0gaW50ZXJwWm9vbVRyYW5zaXRpb25lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVycCA9IGludGVycG9sYXRlW3R5cGVdO1xuICAgIH1cblxuICAgIHRoaXMub2xkVHJhbnNpdGlvbiA9IG9sZFRyYW5zaXRpb247XG4gICAgdGhpcy5kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uIHx8IDA7XG4gICAgdGhpcy5kZWxheSA9IHZhbHVlLmRlbGF5IHx8IDA7XG5cbiAgICBpZiAoIXRoaXMuaW5zdGFudCgpKSB7XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuc3RhcnRUaW1lICsgdGhpcy5kdXJhdGlvbiArIHRoaXMuZGVsYXk7XG4gICAgICAgIHRoaXMuZWFzZSA9IHV0aWwuZWFzZUN1YmljSW5PdXQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZFRyYW5zaXRpb24gJiYgb2xkVHJhbnNpdGlvbi5lbmRUaW1lIDw9IHRoaXMuc3RhcnRUaW1lKSB7XG4gICAgICAgIC8vIE9sZCB0cmFuc2l0aW9uIGlzIGRvbmUgcnVubmluZywgc28gd2UgY2FuXG4gICAgICAgIC8vIGRlbGV0ZSBpdHMgcmVmZXJlbmNlIHRvIGl0cyBvbGQgdHJhbnNpdGlvbi5cblxuICAgICAgICBkZWxldGUgb2xkVHJhbnNpdGlvbi5vbGRUcmFuc2l0aW9uO1xuICAgIH1cbn1cblxuU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5pbnN0YW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICF0aGlzLm9sZFRyYW5zaXRpb24gfHwgIXRoaXMuaW50ZXJwIHx8ICh0aGlzLmR1cmF0aW9uID09PSAwICYmIHRoaXMuZGVsYXkgPT09IDApO1xufTtcblxuLypcbiAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyYW5zaXRpb25pbmcgcHJvcGVydHkgYXQgem9vbSBsZXZlbCBgemAgYW5kIG9wdGlvbmFsIHRpbWUgYHRgXG4gKi9cblN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbih6LCB6b29tSGlzdG9yeSwgdCkge1xuXG4gICAgdmFyIHZhbHVlID0gdGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUoeiwgem9vbUhpc3RvcnksIHRoaXMuZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuaW5zdGFudCgpKSByZXR1cm4gdmFsdWU7XG5cbiAgICB0ID0gdCB8fCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKHQgPCB0aGlzLmVuZFRpbWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5vbGRUcmFuc2l0aW9uLmF0KHosIHpvb21IaXN0b3J5LCB0aGlzLnN0YXJ0VGltZSk7XG4gICAgICAgIHZhciBlYXNlZCA9IHRoaXMuZWFzZSgodCAtIHRoaXMuc3RhcnRUaW1lIC0gdGhpcy5kZWxheSkgLyB0aGlzLmR1cmF0aW9uKTtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmludGVycChvbGRWYWx1ZSwgdmFsdWUsIGVhc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG5cbn07XG5cbmZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQoZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBmcm9tLnRvLFxuICAgICAgICBmcm9tU2NhbGU6IGZyb20udG9TY2FsZSxcbiAgICAgICAgdG86IHRvLnRvLFxuICAgICAgICB0b1NjYWxlOiB0by50b1NjYWxlLFxuICAgICAgICB0OiB0XG4gICAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBBbmNob3I7XG5cbmZ1bmN0aW9uIEFuY2hvcih4LCB5LCBhbmdsZSwgc2VnbWVudCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG5cbiAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgfVxufVxuXG5BbmNob3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQb2ludC5wcm90b3R5cGUpO1xuXG5BbmNob3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcy54LCB0aGlzLnksIHRoaXMuYW5nbGUsIHRoaXMuc2VnbWVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpblBhY2s7XG5mdW5jdGlvbiBCaW5QYWNrKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5mcmVlID0gW3sgeDogMCwgeTogMCwgdzogd2lkdGgsIGg6IGhlaWdodCB9XTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgYWxnb3JpdGhtIHRvIHJlY3Vyc2l2ZWx5IG1lcmdlIHRoZSBuZXdseSByZWxlYXNlZCBjZWxsIHdpdGggaXRzXG4gKiBuZWlnaGJvci4gVGhpcyBkb2Vzbid0IG1lcmdlIG1vcmUgdGhhbiB0d28gY2VsbHMgYXQgYSB0aW1lLCBhbmQgZmFpbHNcbiAqIGZvciBjb21wbGljYXRlZCBtZXJnZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5CaW5QYWNrLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24ocmVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mcmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmcmVlID0gdGhpcy5mcmVlW2ldO1xuXG4gICAgICAgIGlmIChmcmVlLnkgPT09IHJlY3QueSAmJiBmcmVlLmggPT09IHJlY3QuaCAmJiBmcmVlLnggKyBmcmVlLncgPT09IHJlY3QueCkge1xuICAgICAgICAgICAgZnJlZS53ICs9IHJlY3QudztcblxuICAgICAgICB9IGVsc2UgaWYgKGZyZWUueCA9PT0gcmVjdC54ICYmIGZyZWUudyA9PT0gcmVjdC53ICYmIGZyZWUueSArIGZyZWUuaCA9PT0gcmVjdC55KSB7XG4gICAgICAgICAgICBmcmVlLmggKz0gcmVjdC5oO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjdC55ID09PSBmcmVlLnkgJiYgcmVjdC5oID09PSBmcmVlLmggJiYgcmVjdC54ICsgcmVjdC53ID09PSBmcmVlLngpIHtcbiAgICAgICAgICAgIGZyZWUueCA9IHJlY3QueDtcbiAgICAgICAgICAgIGZyZWUudyArPSByZWN0Lnc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWN0LnggPT09IGZyZWUueCAmJiByZWN0LncgPT09IGZyZWUudyAmJiByZWN0LnkgKyByZWN0LmggPT09IGZyZWUueSkge1xuICAgICAgICAgICAgZnJlZS55ID0gcmVjdC55O1xuICAgICAgICAgICAgZnJlZS5oICs9IHJlY3QuaDtcblxuICAgICAgICB9IGVsc2UgY29udGludWU7XG5cbiAgICAgICAgdGhpcy5mcmVlLnNwbGljZShpLCAxKTtcbiAgICAgICAgdGhpcy5yZWxlYXNlKGZyZWUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICB9XG4gICAgdGhpcy5mcmVlLnB1c2gocmVjdCk7XG59O1xuXG5CaW5QYWNrLnByb3RvdHlwZS5hbGxvY2F0ZSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCBmcmVlIHJlY3QgYW5nbGVcbiAgICB2YXIgcmVjdCA9IHsgeDogSW5maW5pdHksIHk6IEluZmluaXR5LCB3OiBJbmZpbml0eSwgaDogSW5maW5pdHkgfTtcbiAgICB2YXIgc21hbGxlc3QgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZnJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5mcmVlW2ldO1xuICAgICAgICBpZiAod2lkdGggPD0gcmVmLncgJiYgaGVpZ2h0IDw9IHJlZi5oICYmIHJlZi55IDw9IHJlY3QueSAmJiByZWYueCA8PSByZWN0LngpIHtcbiAgICAgICAgICAgIHJlY3QgPSByZWY7XG4gICAgICAgICAgICBzbWFsbGVzdCA9IGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc21hbGxlc3QgPCAwKSB7XG4gICAgICAgIC8vIFRoZXJlJ3Mgbm8gc3BhY2UgbGVmdCBmb3IgdGhpcyBjaGFyLlxuICAgICAgICByZXR1cm4geyB4OiAtMSwgeTogLTEgfTtcbiAgICB9XG5cbiAgICB0aGlzLmZyZWUuc3BsaWNlKHNtYWxsZXN0LCAxKTtcblxuICAgIC8vIFNob3J0ZXIvTG9uZ2VyIEF4aXMgU3BsaXQgUnVsZSAoU0FTKVxuICAgIC8vIGh0dHA6Ly9jbGIuZGVtb24uZmkvZmlsZXMvUmVjdGFuZ2xlQmluUGFjay5wZGYgcC4gMTVcbiAgICAvLyBJZ25vcmUgdGhlIGRpbWVuc2lvbiBvZiBSIGFuZCBqdXN0IHNwbGl0IGxvbmcgdGhlIHNob3J0ZXIgZGltZW5zaW9uXG4gICAgLy8gU2VlIEFsc286IGh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+Y2hhemVsbGUvcHVicy9ibGJpbnBhY2tpbmcucGRmXG4gICAgaWYgKHJlY3QudyA8IHJlY3QuaCkge1xuICAgICAgICAvLyBzcGxpdCBob3Jpem9udGFsbHlcbiAgICAgICAgLy8gKy0tKy0tLStcbiAgICAgICAgLy8gfF9ffF9fX3wgIDwtLSBiMVxuICAgICAgICAvLyArLS0tLS0tKyAgPC0tIGIyXG4gICAgICAgIGlmIChyZWN0LncgPiB3aWR0aCkgdGhpcy5mcmVlLnB1c2goeyB4OiByZWN0LnggKyB3aWR0aCwgeTogcmVjdC55LCB3OiByZWN0LncgLSB3aWR0aCwgaDogaGVpZ2h0IH0pO1xuICAgICAgICBpZiAocmVjdC5oID4gaGVpZ2h0KSB0aGlzLmZyZWUucHVzaCh7IHg6IHJlY3QueCwgeTogcmVjdC55ICsgaGVpZ2h0LCB3OiByZWN0LncsIGg6IHJlY3QuaCAtIGhlaWdodCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzcGxpdCB2ZXJ0aWNhbGx5XG4gICAgICAgIC8vICstLSstLS0rXG4gICAgICAgIC8vIHxfX3wgICB8IDwtLSBiMVxuICAgICAgICAvLyArLS18LS0tKyA8LS0gYjJcbiAgICAgICAgaWYgKHJlY3QudyA+IHdpZHRoKSB0aGlzLmZyZWUucHVzaCh7IHg6IHJlY3QueCArIHdpZHRoLCB5OiByZWN0LnksIHc6IHJlY3QudyAtIHdpZHRoLCBoOiByZWN0LmggfSk7XG4gICAgICAgIGlmIChyZWN0LmggPiBoZWlnaHQpIHRoaXMuZnJlZS5wdXNoKHsgeDogcmVjdC54LCB5OiByZWN0LnkgKyBoZWlnaHQsIHc6IHdpZHRoLCBoOiByZWN0LmggLSBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHc6IHdpZHRoLCBoOiBoZWlnaHQgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tNYXhBbmdsZTtcblxuLyoqXG4gKiBMYWJlbHMgcGxhY2VkIGFyb3VuZCByZWFsbHkgc2hhcnAgYW5nbGVzIGFyZW4ndCByZWFkYWJsZS4gQ2hlY2sgaWYgYW55XG4gKiBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgbGFiZWwgaGFzIGEgY29tYmluZWQgYW5nbGUgdGhhdCBpcyB0b28gYmlnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8UG9pbnQ+fSBsaW5lXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yIFRoZSBwb2ludCBvbiB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpbmRvd1NpemUgVGhlIGNoZWNrIGZhaWxzIGlmIHRoZSBjb21iaW5lZCBhbmdsZXMgd2l0aGluIGEgcGFydCBvZiB0aGUgbGluZSB0aGF0IGlzIGB3aW5kb3dTaXplYCBsb25nIGlzIHRvbyBiaWcuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4QW5nbGUgVGhlIG1heGltdW0gY29tYmluZWQgYW5nbGUgdGhhdCBhbnkgd2luZG93IGFsb25nIHRoZSBsYWJlbCBpcyBhbGxvd2VkIHRvIGhhdmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgd2luZG93U2l6ZSwgbWF4QW5nbGUpIHtcblxuICAgIC8vIGhvcml6b250YWwgbGFiZWxzIGFsd2F5cyBwYXNzXG4gICAgaWYgKGFuY2hvci5zZWdtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHAgPSBhbmNob3I7XG4gICAgdmFyIGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIHZhciBhbmNob3JEaXN0YW5jZSA9IDA7XG5cbiAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgaW5kZXgtLTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9XG5cbiAgICBhbmNob3JEaXN0YW5jZSArPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgaW5kZXgrKztcblxuICAgIC8vIHN0b3JlIHJlY2VudCBjb3JuZXJzIGFuZCB0aGVpciB0b3RhbCBhbmdsZSBkaWZmZXJlbmNlXG4gICAgdmFyIHJlY2VudENvcm5lcnMgPSBbXTtcbiAgICB2YXIgcmVjZW50QW5nbGVEZWx0YSA9IDA7XG5cbiAgICAvLyBtb3ZlIGZvcndhcmRzIGJ5IHRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGFuZCBjaGVjayBhbmdsZXMgYWxvbmcgdGhlIHdheVxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA8IGxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgdmFyIG5leHQgPSBsaW5lW2luZGV4ICsgMV07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoIW5leHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB2YXIgYW5nbGVEZWx0YSA9IHByZXYuYW5nbGVUbyhjdXJyZW50KSAtIGN1cnJlbnQuYW5nbGVUbyhuZXh0KTtcbiAgICAgICAgLy8gcmVzdHJpY3QgYW5nbGUgdG8gLXBpLi5waSByYW5nZVxuICAgICAgICBhbmdsZURlbHRhID0gKChhbmdsZURlbHRhICsgMyAqIE1hdGguUEkpICUgKE1hdGguUEkgKiAyKSkgLSBNYXRoLlBJO1xuXG4gICAgICAgIHJlY2VudENvcm5lcnMucHVzaCh7XG4gICAgICAgICAgICBkaXN0YW5jZTogYW5jaG9yRGlzdGFuY2UsXG4gICAgICAgICAgICBhbmdsZURlbHRhOiBhbmdsZURlbHRhXG4gICAgICAgIH0pO1xuICAgICAgICByZWNlbnRBbmdsZURlbHRhICs9IGFuZ2xlRGVsdGE7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcm5lcnMgdGhhdCBhcmUgZmFyIGVub3VnaCBhd2F5IGZyb20gdGhlIGxpc3Qgb2YgcmVjZW50IGFuY2hvcnNcbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlIC0gcmVjZW50Q29ybmVyc1swXS5kaXN0YW5jZSA+IHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgLT0gcmVjZW50Q29ybmVycy5zaGlmdCgpLmFuZ2xlRGVsdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgc3VtIG9mIGFuZ2xlcyB3aXRoaW4gdGhlIHdpbmRvdyBhcmVhIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS4gY2hlY2sgZmFpbHMuXG4gICAgICAgIGlmIChNYXRoLmFicyhyZWNlbnRBbmdsZURlbHRhKSA+IG1heEFuZ2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gY3VycmVudC5kaXN0KG5leHQpO1xuICAgIH1cblxuICAgIC8vIG5vIHBhcnQgb2YgdGhlIGxpbmUgaGFkIGFuIGFuZ2xlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiBjaGVjayBwYXNzZXMuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcExpbmU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydCBvZiBhIG11bHRpbGluZSB0aGF0IGludGVyc2VjdHMgd2l0aCB0aGUgcHJvdmlkZWQgcmVjdGFuZ3VsYXIgYm94LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8UG9pbnQ+Pn0gbGluZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHtudW1iZXJ9IHgyIHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJveFxuICogQHJldHVybnMge0FycmF5PEFycmF5PFBvaW50Pj59IGxpbmVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGlwTGluZShsaW5lcywgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgY2xpcHBlZExpbmVzID0gW107XG5cbiAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICAgIHZhciBjbGlwcGVkTGluZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcDAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgdmFyIHAxID0gbGluZVtpICsgMV07XG5cblxuICAgICAgICAgICAgaWYgKHAwLnggPCB4MSAmJiBwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55IDwgeTEgJiYgcDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueCA+PSB4MiAmJiBwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55ID49IHkyICYmIHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjbGlwcGVkTGluZSB8fCAhcDAuZXF1YWxzKGNsaXBwZWRMaW5lW2NsaXBwZWRMaW5lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lID0gW3AwXTtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZXMucHVzaChjbGlwcGVkTGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaXBwZWRMaW5lLnB1c2gocDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWRMaW5lcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25Cb3g7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gYm94IHJlcHJlc2VudHMgYW4gYXJlYSBvZiB0aGUgbWFwIHRoYXQgdGhhdCBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGxhYmVsLiBDb2xsaXNpb25GZWF0dXJlIHVzZXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgY29sbGlzaW9uIGJveGVzIHRvXG4gKiByZXByZXNlbnQgYWxsIHRoZSBhcmVhIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGFiZWwuIFRoZXkgYXJlIHVzZWQgdG9cbiAqIHByZXZlbnQgY29sbGlzaW9ucyBiZXR3ZWVuIGxhYmVscy5cbiAqXG4gKiBBIGNvbGxpc2lvbiBib3ggYWN0dWFsbHkgcmVwcmVzZW50cyBhIDNkIHZvbHVtZS4gVGhlIGZpcnN0IHR3byBkaW1lbnNpb25zLFxuICogeCBhbmQgeSwgYXJlIHNwZWNpZmllZCB3aXRoIGBhbmNob3JgIGFsb25nIHdpdGggYHgxYCwgYHkxYCwgYHgyYCwgYHkyYC5cbiAqIFRoZSB0aGlyZCBkaW1lbnNpb24sIHpvb20sIGlzIGxpbWl0ZWQgYnkgYG1heFNjYWxlYCB3aGljaCBkZXRlcm1pbmVzXG4gKiBob3cgZmFyIGluIHRoZSB6IGRpbWVuc2lvbnMgdGhlIGJveCBleHRlbmRzLlxuICpcbiAqIEFzIHlvdSB6b29tIGluIG9uIGEgbWFwLCBhbGwgcG9pbnRzIG9uIHRoZSBtYXAgZ2V0IGZ1cnRoZXIgYW5kIGZ1cnRoZXIgYXBhcnRcbiAqIGJ1dCBsYWJlbHMgc3RheSByb3VnaGx5IHRoZSBzYW1lIHNpemUuIExhYmVscyBjb3ZlciBsZXNzIHJlYWwgd29ybGQgYXJlYSBvblxuICogdGhlIG1hcCBhdCBoaWdoZXIgem9vbSBsZXZlbHMgdGhhbiB0aGV5IGRvIGF0IGxvd2VyIHpvb20gbGV2ZWxzLiBUaGlzIGlzIHdoeVxuICogYXJlYXMgYXJlIGFyZSByZXByZXNlbnRlZCB3aXRoIGFuIGFuY2hvciBwb2ludCBhbmQgb2Zmc2V0cyBmcm9tIHRoYXQgcG9pbnRcbiAqIGluc3RlYWQgb2YganVzdCB1c2luZyBmb3VyIGFic29sdXRlIHBvaW50cy5cbiAqXG4gKiBMaW5lIGxhYmVscyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzZXQgb2YgdGhlc2UgYm94ZXMgc3BhY2VkIG91dCBhbG9uZyBhIGxpbmUuXG4gKiBXaGVuIHlvdSB6b29tIGluLCBsaW5lIGxhYmVscyBjb3ZlciBsZXNzIHJlYWwgd29ybGQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmVcbiAqIHRoYW4gdGhleSB1c2VkIHRvLiBDb2xsaXNpb24gYm94ZXMgbmVhciB0aGUgZWRnZXMgdGhhdCB1c2VkIHRvIGNvdmVyIGxhYmVsXG4gKiBubyBsb25nZXIgZG8uIElmIGEgYm94IGRvZXNuJ3QgY292ZXIgdGhlIGxhYmVsIGFueW1vcmUgaXQgc2hvdWxkIGJlIGlnbm9yZWRcbiAqIHdoZW4gZG9pbmcgY29sbGlzaW9uIGNoZWNrcy4gYG1heFNjYWxlYCBpcyBob3cgbXVjaCB5b3UgY2FuIHNjYWxlIHRoZSBtYXBcbiAqIGJlZm9yZSB0aGUgbGFiZWwgaXNuJ3Qgd2l0aGluIHRoZSBib3ggYW55bW9yZS5cbiAqIEZvciBleGFtcGxlXG4gKiBsb3dlciB6b29tOlxuICogaHR0cHM6Ly9jbG91ZC5naXRodWJ1c2VyY29udGVudC5jb20vYXNzZXRzLzE0MjE2NTIvODA2MDA5NC80ZDk3NWY3Ni0wZTkxLTExZTUtODRiMS00ZWRlYjMwYTU4NzUucG5nXG4gKiBzbGlnaHRseSBoaWdoZXIgem9vbTpcbiAqIGh0dHBzOi8vY2xvdWQuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fzc2V0cy8xNDIxNjUyLzgwNjAwNjEvMjZhZTFjMzgtMGU5MS0xMWU1LThjNWEtOWYzODBiZjI5ZjBhLnBuZ1xuICogSW4gdGhlIHpvb21lZCBpbiBpbWFnZSB0aGUgdHdvIGdyZXkgYm94ZXMgb24gZWl0aGVyIHNpZGUgZG9uJ3QgY292ZXIgdGhlXG4gKiBsYWJlbCBhbnltb3JlLiBUaGVpciBtYXhTY2FsZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NhbGUuXG4gKlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25Cb3hcbiAqIEBwYXJhbSB7UG9pbnR9IGFuY2hvclBvaW50IFRoZSBhbmNob3IgcG9pbnQgdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQuXG4gKiBAcGFyYW0ge251bWJlcn0geDEgVGhlIGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvciB0byB0aGUgbGVmdCBlZGdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHkxIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IgdG8gdGhlIHRvcCBlZGdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHgyIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IgdG8gdGhlIHJpZ2h0IGVkZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0geTIgVGhlIGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvciB0byB0aGUgYm90dG9tIGVkZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4U2NhbGUgVGhlIG1heGltdW0gc2NhbGUgdGhpcyBib3ggY2FuIGJsb2NrIG90aGVyIGJveGVzIGF0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29sbGlzaW9uQm94KGFuY2hvclBvaW50LCB4MSwgeTEsIHgyLCB5MiwgbWF4U2NhbGUpIHtcbiAgICAvLyB0aGUgYm94IGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50XG4gICAgdGhpcy5hbmNob3JQb2ludCA9IGFuY2hvclBvaW50O1xuXG4gICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICB0aGlzLngxID0geDE7XG4gICAgdGhpcy55MSA9IHkxO1xuICAgIHRoaXMueDIgPSB4MjtcbiAgICB0aGlzLnkyID0geTI7XG5cbiAgICAvLyB0aGUgYm94IGlzIG9ubHkgdmFsaWQgZm9yIHNjYWxlcyA8IG1heFNjYWxlLlxuICAgIC8vIFRoZSBib3ggZG9lcyBub3QgYmxvY2sgb3RoZXIgYm94ZXMgYXQgc2NhbGVzID49IG1heFNjYWxlO1xuICAgIHRoaXMubWF4U2NhbGUgPSBtYXhTY2FsZTtcblxuICAgIC8vIHRoZSBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgY2FuIGZpcnN0IGJlIHNob3duXG4gICAgdGhpcy5wbGFjZW1lbnRTY2FsZSA9IDA7XG5cbiAgICAvLyByb3RhdGVkIGFuZCBzY2FsZWQgYmJveCB1c2VkIGZvciBpbmRleGluZ1xuICAgIHRoaXNbMF0gPSB0aGlzWzFdID0gdGhpc1syXSA9IHRoaXNbM10gPSAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29sbGlzaW9uQm94ID0gcmVxdWlyZSgnLi9jb2xsaXNpb25fYm94Jyk7XG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkZlYXR1cmU7XG5cbi8qKlxuICogQSBDb2xsaXNpb25GZWF0dXJlIHJlcHJlc2VudHMgdGhlIGFyZWEgb2YgdGhlIHRpbGUgY292ZXJlZCBieSBhIHNpbmdsZSBsYWJlbC5cbiAqIEl0IGlzIHVzZWQgd2l0aCBDb2xsaXNpb25UaWxlIHRvIGNoZWNrIGlmIHRoZSBsYWJlbCBvdmVybGFwcyB3aXRoIGFueVxuICogcHJldmlvdXMgbGFiZWxzLiBBIENvbGxpc2lvbkZlYXR1cmUgaXMgbW9zdGx5IGp1c3QgYSBzZXQgb2YgQ29sbGlzaW9uQm94XG4gKiBvYmplY3RzLlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25GZWF0dXJlXG4gKiBAcGFyYW0ge0FycmF5PFBvaW50Pn0gbGluZSBUaGUgZ2VvbWV0cnkgdGhlIGxhYmVsIGlzIHBsYWNlZCBvbi5cbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3IgVGhlIHBvaW50IGFsb25nIHRoZSBsaW5lIGFyb3VuZCB3aGljaCB0aGUgbGFiZWwgaXMgYW5jaG9yZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gc2hhcGVkIFRoZSB0ZXh0IG9yIGljb24gc2hhcGluZyByZXN1bHRzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZyBUaGUgYW1vdW50IG9mIHBhZGRpbmcgdG8gYWRkIGFyb3VuZCB0aGUgbGFiZWwgZWRnZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsaWduTGluZSBXaGV0aGVyIHRoZSBsYWJlbCBpcyBhbGlnbmVkIHdpdGggdGhlIGxpbmUgb3IgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvbGxpc2lvbkZlYXR1cmUobGluZSwgYW5jaG9yLCBzaGFwZWQsIGJveFNjYWxlLCBwYWRkaW5nLCBhbGlnbkxpbmUpIHtcblxuICAgIHZhciB5MSA9IHNoYXBlZC50b3AgKiBib3hTY2FsZSAtIHBhZGRpbmc7XG4gICAgdmFyIHkyID0gc2hhcGVkLmJvdHRvbSAqIGJveFNjYWxlICsgcGFkZGluZztcbiAgICB2YXIgeDEgPSBzaGFwZWQubGVmdCAqIGJveFNjYWxlIC0gcGFkZGluZztcbiAgICB2YXIgeDIgPSBzaGFwZWQucmlnaHQgKiBib3hTY2FsZSArIHBhZGRpbmc7XG5cbiAgICB0aGlzLmJveGVzID0gW107XG5cbiAgICBpZiAoYWxpZ25MaW5lKSB7XG5cbiAgICAgICAgdmFyIGhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgIHZhciBsZW5ndGggPSB4MiAtIHgxO1xuXG4gICAgICAgIGlmIChoZWlnaHQgPD0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICBoZWlnaHQgPSBNYXRoLm1heCgxMCAqIGJveFNjYWxlLCBoZWlnaHQpO1xuXG4gICAgICAgIHRoaXMuX2FkZExpbmVDb2xsaXNpb25Cb3hlcyhsaW5lLCBhbmNob3IsIGxlbmd0aCwgaGVpZ2h0KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm94ZXMucHVzaChuZXcgQ29sbGlzaW9uQm94KG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpLCB4MSwgeTEsIHgyLCB5MiwgSW5maW5pdHkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2V0IG9mIENvbGxpc2lvbkJveCBvYmplY3RzIGZvciBhIGxpbmUuXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmVcbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3hTaXplIFRoZSBzaXplIG9mIHRoZSBjb2xsaXNpb24gYm94ZXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcyA9IGZ1bmN0aW9uKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGJveFNpemUpIHtcbiAgICB2YXIgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgIHZhciBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCk7XG5cbiAgICAvLyBvZmZzZXQgdGhlIGNlbnRlciBvZiB0aGUgZmlyc3QgYm94IGJ5IGhhbGYgYSBib3ggc28gdGhhdCB0aGUgZWRnZSBvZiB0aGVcbiAgICAvLyBib3ggaXMgYXQgdGhlIGVkZ2Ugb2YgdGhlIGxhYmVsLlxuICAgIHZhciBmaXJzdEJveE9mZnNldCA9IC1ib3hTaXplIC8gMjtcblxuICAgIHZhciBiYm94ZXMgPSB0aGlzLmJveGVzO1xuXG4gICAgdmFyIHAgPSBhbmNob3I7XG4gICAgdmFyIGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIHZhciBhbmNob3JEaXN0YW5jZSA9IGZpcnN0Qm94T2Zmc2V0O1xuXG4gICAgLy8gbW92ZSBiYWNrd2FyZHMgYWxvbmcgdGhlIGxpbmUgdG8gdGhlIGZpcnN0IHNlZ21lbnQgdGhlIGxhYmVsIGFwcGVhcnMgb25cbiAgICBkbyB7XG4gICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgIC8vIGNoZWNrTWF4QW5nbGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYXVnaHQgdGhpc1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gYmJveGVzO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9IHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpO1xuXG4gICAgdmFyIHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5Cb3hlczsgaSsrKSB7XG4gICAgICAgIC8vIHRoZSBkaXN0YW5jZSB0aGUgYm94IHdpbGwgYmUgZnJvbSB0aGUgYW5jaG9yXG4gICAgICAgIHZhciBib3hEaXN0YW5jZVRvQW5jaG9yID0gLWxhYmVsTGVuZ3RoIC8gMiArIGkgKiBzdGVwO1xuXG4gICAgICAgIC8vIHRoZSBib3ggaXMgbm90IG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIE1vdmUgdG8gdGhlIG5leHQgc2VnbWVudC5cbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlICsgc2VnbWVudExlbmd0aCA8IGJveERpc3RhbmNlVG9BbmNob3IpIHtcbiAgICAgICAgICAgIGFuY2hvckRpc3RhbmNlICs9IHNlZ21lbnRMZW5ndGg7XG4gICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBlbm91Z2ggcm9vbSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gbGluZS5sZW5ndGgpIHJldHVybiBiYm94ZXM7XG5cbiAgICAgICAgICAgIHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudFxuICAgICAgICB2YXIgc2VnbWVudEJveERpc3RhbmNlID0gYm94RGlzdGFuY2VUb0FuY2hvciAtIGFuY2hvckRpc3RhbmNlO1xuXG4gICAgICAgIHZhciBwMCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICB2YXIgcDEgPSBsaW5lW2luZGV4ICsgMV07XG4gICAgICAgIHZhciBib3hBbmNob3JQb2ludCA9IHAxLnN1YihwMCkuX3VuaXQoKS5fbXVsdChzZWdtZW50Qm94RGlzdGFuY2UpLl9hZGQocDApO1xuXG4gICAgICAgIHZhciBkaXN0YW5jZVRvSW5uZXJFZGdlID0gTWF0aC5tYXgoTWF0aC5hYnMoYm94RGlzdGFuY2VUb0FuY2hvciAtIGZpcnN0Qm94T2Zmc2V0KSAtIHN0ZXAgLyAyLCAwKTtcbiAgICAgICAgdmFyIG1heFNjYWxlID0gbGFiZWxMZW5ndGggLyAyIC8gZGlzdGFuY2VUb0lubmVyRWRnZTtcblxuICAgICAgICBiYm94ZXMucHVzaChuZXcgQ29sbGlzaW9uQm94KGJveEFuY2hvclBvaW50LCAtYm94U2l6ZSAvIDIsIC1ib3hTaXplIC8gMiwgYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLCBtYXhTY2FsZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYm94ZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmJ1c2ggPSByZXF1aXJlKCdyYnVzaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvblRpbGU7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gdGlsZSB1c2VkIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIG92ZXJsYXBwaW5nLiBJdCBrZWVwIHRyYWNrcyBvZlxuICogd2hlcmUgcHJldmlvdXMgc3ltYm9scyBoYXZlIGJlZW4gcGxhY2VkIGFuZCBpcyB1c2VkIHRvIGNoZWNrIGlmIGEgbmV3XG4gKiBzeW1ib2wgb3ZlcmxhcHMgd2l0aCBhbnkgcHJldmlvdXNseSBhZGRlZCBzeW1ib2xzLlxuICpcbiAqIEBjbGFzcyBDb2xsaXNpb25UaWxlXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwaXRjaFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29sbGlzaW9uVGlsZShhbmdsZSwgcGl0Y2gpIHtcbiAgICB0aGlzLnRyZWUgPSByYnVzaCgpO1xuICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcblxuICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gW2NvcywgLXNpbiwgc2luLCBjb3NdO1xuXG4gICAgLy8gU3RyZXRjaCBib3hlcyBpbiB5IGRpcmVjdGlvbiB0byBhY2NvdW50IGZvciB0aGUgbWFwIHRpbHQuXG4gICAgdGhpcy55U3RyZXRjaCA9IDEgLyBNYXRoLmNvcyhwaXRjaCAvIDE4MCAqIE1hdGguUEkpO1xuXG4gICAgLy8gVGhlIGFtb3VudCB0aGUgbWFwIGlzIHNxdWlzaGVkIGRlcGVuZHMgb24gdGhlIHkgcG9zaXRpb24uXG4gICAgLy8gU29ydCBvZiBhY2NvdW50IGZvciB0aGlzIGJ5IG1ha2luZyBhbGwgYm94ZXMgYSBiaXQgYmlnZ2VyLlxuICAgIHRoaXMueVN0cmV0Y2ggPSBNYXRoLnBvdyh0aGlzLnlTdHJldGNoLCAxLjMpO1xufVxuXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5taW5TY2FsZSA9IDAuMjU7XG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZSA9IDI7XG5cblxuLyoqXG4gKiBGaW5kIHRoZSBzY2FsZSBhdCB3aGljaCB0aGUgY29sbGlzaW9uRmVhdHVyZSBjYW4gYmUgc2hvd24gd2l0aG91dFxuICogb3ZlcmxhcHBpbmcgd2l0aCBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0ge0NvbGxpc2lvbkZlYXR1cmV9IGNvbGxpc2lvbkZlYXR1cmVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHBsYWNlbWVudFNjYWxlXG4gKiBAcHJpdmF0ZVxuICovXG5Db2xsaXNpb25UaWxlLnByb3RvdHlwZS5wbGFjZUNvbGxpc2lvbkZlYXR1cmUgPSBmdW5jdGlvbihjb2xsaXNpb25GZWF0dXJlKSB7XG5cbiAgICB2YXIgbWluUGxhY2VtZW50U2NhbGUgPSB0aGlzLm1pblNjYWxlO1xuICAgIHZhciByb3RhdGlvbk1hdHJpeCA9IHRoaXMucm90YXRpb25NYXRyaXg7XG4gICAgdmFyIHlTdHJldGNoID0gdGhpcy55U3RyZXRjaDtcblxuICAgIGZvciAodmFyIGIgPSAwOyBiIDwgY29sbGlzaW9uRmVhdHVyZS5ib3hlcy5sZW5ndGg7IGIrKykge1xuXG4gICAgICAgIHZhciBib3ggPSBjb2xsaXNpb25GZWF0dXJlLmJveGVzW2JdO1xuXG4gICAgICAgIHZhciBhbmNob3JQb2ludCA9IGJveC5hbmNob3JQb2ludC5tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcbiAgICAgICAgdmFyIHggPSBhbmNob3JQb2ludC54O1xuICAgICAgICB2YXIgeSA9IGFuY2hvclBvaW50Lnk7XG5cbiAgICAgICAgYm94WzBdID0geCArIGJveC54MTtcbiAgICAgICAgYm94WzFdID0geSArIGJveC55MSAqIHlTdHJldGNoO1xuICAgICAgICBib3hbMl0gPSB4ICsgYm94LngyO1xuICAgICAgICBib3hbM10gPSB5ICsgYm94LnkyICogeVN0cmV0Y2g7XG5cbiAgICAgICAgdmFyIGJsb2NraW5nQm94ZXMgPSB0aGlzLnRyZWUuc2VhcmNoKGJveCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja2luZ0JveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2tpbmcgPSBibG9ja2luZ0JveGVzW2ldO1xuICAgICAgICAgICAgdmFyIGJsb2NraW5nQW5jaG9yUG9pbnQgPSBibG9ja2luZy5hbmNob3JQb2ludC5tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbG93ZXN0IHNjYWxlIGF0IHdoaWNoIHRoZSB0d28gYm94ZXMgY2FuIGZpdCBzaWRlIGJ5IHNpZGUgd2l0aG91dCBvdmVybGFwcGluZy5cbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIGFsZ29yaXRobTpcbiAgICAgICAgICAgIHZhciBzMSA9IChibG9ja2luZy54MSAtIGJveC54MikgLyAoeCAtIGJsb2NraW5nQW5jaG9yUG9pbnQueCk7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIGxlZnQgb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHMyID0gKGJsb2NraW5nLngyIC0gYm94LngxKSAvICh4IC0gYmxvY2tpbmdBbmNob3JQb2ludC54KTsgLy8gc2NhbGUgYXQgd2hpY2ggbmV3IGJveCBpcyB0byB0aGUgcmlnaHQgb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHMzID0gKGJsb2NraW5nLnkxIC0gYm94LnkyKSAqIHlTdHJldGNoIC8gKHkgLSBibG9ja2luZ0FuY2hvclBvaW50LnkpOyAvLyBzY2FsZSBhdCB3aGljaCBuZXcgYm94IGlzIHRvIHRoZSB0b3Agb2Ygb2xkIGJveFxuICAgICAgICAgICAgdmFyIHM0ID0gKGJsb2NraW5nLnkyIC0gYm94LnkxKSAqIHlTdHJldGNoIC8gKHkgLSBibG9ja2luZ0FuY2hvclBvaW50LnkpOyAvLyBzY2FsZSBhdCB3aGljaCBuZXcgYm94IGlzIHRvIHRoZSBib3R0b20gb2Ygb2xkIGJveFxuXG4gICAgICAgICAgICBpZiAoaXNOYU4oczEpIHx8IGlzTmFOKHMyKSkgczEgPSBzMiA9IDE7XG4gICAgICAgICAgICBpZiAoaXNOYU4oczMpIHx8IGlzTmFOKHM0KSkgczMgPSBzNCA9IDE7XG5cbiAgICAgICAgICAgIHZhciBjb2xsaXNpb25GcmVlU2NhbGUgPSBNYXRoLm1pbihNYXRoLm1heChzMSwgczIpLCBNYXRoLm1heChzMywgczQpKTtcblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IGJsb2NraW5nLm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBib3gncyBtYXhTY2FsZSB0aGUgbGFiZWwgaGFzIHNocnVuayBlbm91Z2ggdGhhdCB0aGUgYm94IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gY292ZXIgaXQsXG4gICAgICAgICAgICAgICAgLy8gc28gdW5ibG9jayB0aGUgbmV3IGJveCBhdCB0aGUgc2NhbGUgdGhhdCB0aGUgb2xkIGJveCBkaXNhcHBlYXJzLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJsb2NraW5nLm1heFNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uRnJlZVNjYWxlID4gYm94Lm1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBjYW4gb25seSBiZSBzaG93biBhZnRlciBpdCBpcyB2aXNpYmxlLCB0aGVuIHRoZSBib3ggY2FuIG5ldmVyIGJlIHNob3duLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB0aGUgbGFiZWwgY2FuIGJlIHNob3duIGFmdGVyIHRoaXMgYm94IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA9IGJveC5tYXhTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IG1pblBsYWNlbWVudFNjYWxlICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA+PSBibG9ja2luZy5wbGFjZW1lbnRTY2FsZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY29sbGlzaW9uIG9jY3VycyBhdCBhIGxvd2VyIHNjYWxlIHRoYW4gcHJldmlvdXNseSBmb3VuZCBjb2xsaXNpb25zXG4gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBjb2xsaXNpb24gb2NjdXJzIHdoaWxlIHRoZSBvdGhlciBsYWJlbCBpcyB2aXNpYmxlXG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIHRoaXMgaXMgdGhlIGxvd2VzdCBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgd29uJ3QgY29sbGlkZSB3aXRoIGFueXRoaW5nXG4gICAgICAgICAgICAgICAgbWluUGxhY2VtZW50U2NhbGUgPSBjb2xsaXNpb25GcmVlU2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtaW5QbGFjZW1lbnRTY2FsZSA+PSB0aGlzLm1heFNjYWxlKSByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWluUGxhY2VtZW50U2NhbGU7XG59O1xuXG4vKipcbiAqIFJlbWVtYmVyIHRoaXMgY29sbGlzaW9uRmVhdHVyZSBhbmQgd2hhdCBzY2FsZSBpdCB3YXMgcGxhY2VkIGF0IHRvIGJsb2NrXG4gKiBsYXRlciBmZWF0dXJlcyBmcm9tIG92ZXJsYXBwaW5nIHdpdGggaXQuXG4gKlxuICogQHBhcmFtIHtDb2xsaXNpb25GZWF0dXJlfSBjb2xsaXNpb25GZWF0dXJlXG4gKiBAcGFyYW0ge251bWJlcn0gbWluUGxhY2VtZW50U2NhbGVcbiAqIEBwcml2YXRlXG4gKi9cbkNvbGxpc2lvblRpbGUucHJvdG90eXBlLmluc2VydENvbGxpc2lvbkZlYXR1cmUgPSBmdW5jdGlvbihjb2xsaXNpb25GZWF0dXJlLCBtaW5QbGFjZW1lbnRTY2FsZSkge1xuXG4gICAgdmFyIGJveGVzID0gY29sbGlzaW9uRmVhdHVyZS5ib3hlcztcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGJveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGJveGVzW2tdLnBsYWNlbWVudFNjYWxlID0gbWluUGxhY2VtZW50U2NhbGU7XG4gICAgfVxuXG4gICAgaWYgKG1pblBsYWNlbWVudFNjYWxlIDwgdGhpcy5tYXhTY2FsZSkge1xuICAgICAgICB0aGlzLnRyZWUubG9hZChib3hlcyk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGludGVycG9sYXRlID0gcmVxdWlyZSgnLi4vdXRpbC9pbnRlcnBvbGF0ZScpO1xudmFyIEFuY2hvciA9IHJlcXVpcmUoJy4uL3N5bWJvbC9hbmNob3InKTtcbnZhciBjaGVja01heEFuZ2xlID0gcmVxdWlyZSgnLi9jaGVja19tYXhfYW5nbGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbmNob3JzO1xuXG5mdW5jdGlvbiBnZXRBbmNob3JzKGxpbmUsIHNwYWNpbmcsIG1heEFuZ2xlLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBnbHlwaFNpemUsIGJveFNjYWxlLCBvdmVyc2NhbGluZykge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICB2YXIgYW5nbGVXaW5kb3dTaXplID0gc2hhcGVkVGV4dCA/XG4gICAgICAgIDMgLyA1ICogZ2x5cGhTaXplICogYm94U2NhbGUgOlxuICAgICAgICAwO1xuXG4gICAgdmFyIGxhYmVsTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgICAgIHNoYXBlZFRleHQgPyBzaGFwZWRUZXh0LnJpZ2h0IC0gc2hhcGVkVGV4dC5sZWZ0IDogMCxcbiAgICAgICAgc2hhcGVkSWNvbiA/IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQgOiAwKTtcblxuICAgIC8vIElzIHRoZSBsaW5lIGNvbnRpbnVlZCBmcm9tIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcnk/XG4gICAgaWYgKGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IDQwOTYgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gNDA5Nikge1xuICAgICAgICB2YXIgY29udGludWVkTGluZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhlIGxhYmVsIGxvbmcsIHJlbGF0aXZlIHRvIHRoZSBzcGFjaW5nP1xuICAgIC8vIElmIHNvLCBhZGp1c3QgdGhlIHNwYWNpbmcgc28gdGhlcmUgaXMgYWx3YXlzIGEgbWluaW11bSBzcGFjZSBvZiBgc3BhY2luZyAvIDRgIGJldHdlZW4gbGFiZWwgZWRnZXMuXG4gICAgaWYgKHNwYWNpbmcgLSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICA8IHNwYWNpbmcgLyA0KSB7XG4gICAgICAgIHNwYWNpbmcgPSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICsgc3BhY2luZyAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT2Zmc2V0IHRoZSBmaXJzdCBhbmNob3IgYnk6XG4gICAgLy8gRWl0aGVyIGhhbGYgdGhlIGxhYmVsIGxlbmd0aCBwbHVzIGEgZml4ZWQgZXh0cmEgb2Zmc2V0IGlmIHRoZSBsaW5lIGlzIG5vdCBjb250aW51ZWRcbiAgICAvLyBPciBoYWxmIHRoZSBzcGFjaW5nIGlmIHRoZSBsaW5lIGlzIGNvbnRpbnVlZC5cblxuICAgIC8vIEZvciBub24tY29udGludWVkIGxpbmVzLCBhZGQgYSBiaXQgb2YgZml4ZWQgZXh0cmEgb2Zmc2V0IHRvIGF2b2lkIGNvbGxpc2lvbnMgYXQgVCBpbnRlcnNlY3Rpb25zLlxuICAgIHZhciBmaXhlZEV4dHJhT2Zmc2V0ID0gZ2x5cGhTaXplICogMjtcblxuICAgIHZhciBvZmZzZXQgPSAhY29udGludWVkTGluZSA/XG4gICAgICAgICgobGFiZWxMZW5ndGggLyAyICsgZml4ZWRFeHRyYU9mZnNldCkgKiBib3hTY2FsZSAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmcgOlxuICAgICAgICAoc3BhY2luZyAvIDIgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nO1xuXG4gICAgcmV0dXJuIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGggKiBib3hTY2FsZSwgY29udGludWVkTGluZSwgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGNvbnRpbnVlZExpbmUsIHBsYWNlQXRNaWRkbGUpIHtcblxuICAgIHZhciBkaXN0YW5jZSA9IDAsXG4gICAgICAgIG1hcmtlZERpc3RhbmNlID0gb2Zmc2V0IC0gc3BhY2luZztcblxuICAgIHZhciBhbmNob3JzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIHZhciBzZWdtZW50RGlzdCA9IGEuZGlzdChiKSxcbiAgICAgICAgICAgIGFuZ2xlID0gYi5hbmdsZVRvKGEpO1xuXG4gICAgICAgIHdoaWxlIChtYXJrZWREaXN0YW5jZSArIHNwYWNpbmcgPCBkaXN0YW5jZSArIHNlZ21lbnREaXN0KSB7XG4gICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArPSBzcGFjaW5nO1xuXG4gICAgICAgICAgICB2YXIgdCA9IChtYXJrZWREaXN0YW5jZSAtIGRpc3RhbmNlKSAvIHNlZ21lbnREaXN0LFxuICAgICAgICAgICAgICAgIHggPSBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICAgICAgeSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgNDA5NiAmJiB5ID49IDAgJiYgeSA8IDQwOTYpIHtcbiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICAgICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBhbmdsZSwgaSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaChhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0O1xuICAgIH1cblxuICAgIGlmICghcGxhY2VBdE1pZGRsZSAmJiAhYW5jaG9ycy5sZW5ndGggJiYgIWNvbnRpbnVlZExpbmUpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IGF0dGVtcHQgYXQgZmluZGluZyBhbmNob3JzIGF0IHdoaWNoIGxhYmVscyBjYW4gYmUgcGxhY2VkIGZhaWxlZC5cbiAgICAgICAgLy8gVHJ5IGFnYWluLCBidXQgdGhpcyB0aW1lIGp1c3QgdHJ5IHBsYWNpbmcgb25lIGFuY2hvciBhdCB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lLlxuICAgICAgICAvLyBUaGlzIGhhcyB0aGUgbW9zdCBlZmZlY3QgZm9yIHNob3J0IGxpbmVzIGluIG92ZXJzY2FsZWQgdGlsZXMsIHNpbmNlIHRoZVxuICAgICAgICAvLyBpbml0aWFsIG9mZnNldCB1c2VkIGluIG92ZXJzY2FsZWQgdGlsZXMgaXMgY2FsY3VsYXRlZCB0byBhbGlnbiBsYWJlbHMgd2l0aCBwb3NpdGlvbnMgaW5cbiAgICAgICAgLy8gcGFyZW50IHRpbGVzIGluc3RlYWQgb2YgcGxhY2luZyB0aGUgbGFiZWwgYXMgY2xvc2UgdG8gdGhlIGJlZ2lubmluZyBhcyBwb3NzaWJsZS5cbiAgICAgICAgYW5jaG9ycyA9IHJlc2FtcGxlKGxpbmUsIGRpc3RhbmNlIC8gMiwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGNvbnRpbnVlZExpbmUsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNob3JzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQmluUGFjayA9IHJlcXVpcmUoJy4vYmluX3BhY2snKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaEF0bGFzO1xuZnVuY3Rpb24gR2x5cGhBdGxhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgdGhpcy5iaW4gPSBuZXcgQmluUGFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmluZGV4ID0ge307XG4gICAgdGhpcy5pZHMgPSB7fTtcbiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG59XG5cbkdseXBoQXRsYXMucHJvdG90eXBlID0ge1xuICAgIGdldCBkZWJ1ZygpIHtcbiAgICAgICAgcmV0dXJuICdjYW52YXMnIGluIHRoaXM7XG4gICAgfSxcbiAgICBzZXQgZGVidWcodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLmdldEdseXBocyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBnbHlwaHMgPSB7fSxcbiAgICAgICAgc3BsaXQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgIHNwbGl0ID0ga2V5LnNwbGl0KCcjJyk7XG4gICAgICAgIG5hbWUgPSBzcGxpdFswXTtcbiAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICBpZiAoIWdseXBoc1tuYW1lXSkgZ2x5cGhzW25hbWVdID0gW107XG4gICAgICAgIGdseXBoc1tuYW1lXS5wdXNoKGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUuZ2V0UmVjdHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdHMgPSB7fSxcbiAgICAgICAgc3BsaXQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgIHNwbGl0ID0ga2V5LnNwbGl0KCcjJyk7XG4gICAgICAgIG5hbWUgPSBzcGxpdFswXTtcbiAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICBpZiAoIXJlY3RzW25hbWVdKSByZWN0c1tuYW1lXSA9IHt9O1xuICAgICAgICByZWN0c1tuYW1lXVtpZF0gPSB0aGlzLmluZGV4W2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY3RzO1xufTtcblxuR2x5cGhBdGxhcy5wcm90b3R5cGUucmVtb3ZlR2x5cGhzID0gZnVuY3Rpb24oaWQpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5pZHMpIHtcblxuICAgICAgICB2YXIgaWRzID0gdGhpcy5pZHNba2V5XTtcblxuICAgICAgICB2YXIgcG9zID0gaWRzLmluZGV4T2YoaWQpO1xuICAgICAgICBpZiAocG9zID49IDApIGlkcy5zcGxpY2UocG9zLCAxKTtcbiAgICAgICAgdGhpcy5pZHNba2V5XSA9IGlkcztcblxuICAgICAgICBpZiAoIWlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciByZWN0ID0gdGhpcy5pbmRleFtrZXldO1xuXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kYXRhO1xuICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCByZWN0Lmg7IHkrKykge1xuICAgICAgICAgICAgICAgIHZhciB5MSA9IHRoaXMud2lkdGggKiAocmVjdC55ICsgeSkgKyByZWN0Lng7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCByZWN0Lnc7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbeTEgKyB4XSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5iaW4ucmVsZWFzZShyZWN0KTtcblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW5kZXhba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmlkc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLnVwZGF0ZVRleHR1cmUodGhpcy5nbCk7XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uKGlkLCBuYW1lLCBnbHlwaCwgYnVmZmVyKSB7XG4gICAgaWYgKCFnbHlwaCkge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJ21pc3NpbmcgZ2x5cGgnLCBjb2RlLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBrZXkgPSBuYW1lICsgXCIjXCIgKyBnbHlwaC5pZDtcblxuICAgIC8vIFRoZSBnbHlwaCBpcyBhbHJlYWR5IGluIHRoaXMgdGV4dHVyZS5cbiAgICBpZiAodGhpcy5pbmRleFtrZXldKSB7XG4gICAgICAgIGlmICh0aGlzLmlkc1trZXldLmluZGV4T2YoaWQpIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5pZHNba2V5XS5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbmRleFtrZXldO1xuICAgIH1cblxuICAgIC8vIFRoZSBnbHlwaCBiaXRtYXAgaGFzIHplcm8gd2lkdGguXG4gICAgaWYgKCFnbHlwaC5iaXRtYXApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlcmVkV2lkdGggPSBnbHlwaC53aWR0aCArIGJ1ZmZlciAqIDI7XG4gICAgdmFyIGJ1ZmZlcmVkSGVpZ2h0ID0gZ2x5cGguaGVpZ2h0ICsgYnVmZmVyICogMjtcblxuICAgIC8vIEFkZCBhIDFweCBib3JkZXIgYXJvdW5kIGV2ZXJ5IGltYWdlLlxuICAgIHZhciBwYWRkaW5nID0gMTtcbiAgICB2YXIgcGFja1dpZHRoID0gYnVmZmVyZWRXaWR0aCArIDIgKiBwYWRkaW5nO1xuICAgIHZhciBwYWNrSGVpZ2h0ID0gYnVmZmVyZWRIZWlnaHQgKyAyICogcGFkZGluZztcblxuICAgIC8vIEluY3JlYXNlIHRvIG5leHQgbnVtYmVyIGRpdmlzaWJsZSBieSA0LCBidXQgYXQgbGVhc3QgMS5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiBzY2FsZSBkb3duIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFuZCBwYWNrIHRoZW1cbiAgICAvLyBpbnRvIDIgYnl0ZXMgcmF0aGVyIHRoYW4gNCBieXRlcy5cbiAgICBwYWNrV2lkdGggKz0gKDQgLSBwYWNrV2lkdGggJSA0KTtcbiAgICBwYWNrSGVpZ2h0ICs9ICg0IC0gcGFja0hlaWdodCAlIDQpO1xuXG4gICAgdmFyIHJlY3QgPSB0aGlzLmJpbi5hbGxvY2F0ZShwYWNrV2lkdGgsIHBhY2tIZWlnaHQpO1xuICAgIGlmIChyZWN0LnggPCAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignZ2x5cGggYml0bWFwIG92ZXJmbG93Jyk7XG4gICAgICAgIHJldHVybiB7IGdseXBoOiBnbHlwaCwgcmVjdDogbnVsbCB9O1xuICAgIH1cblxuICAgIHRoaXMuaW5kZXhba2V5XSA9IHJlY3Q7XG4gICAgdGhpcy5pZHNba2V5XSA9IFtpZF07XG5cbiAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kYXRhO1xuICAgIHZhciBzb3VyY2UgPSBnbHlwaC5iaXRtYXA7XG4gICAgZm9yICh2YXIgeSA9IDA7IHkgPCBidWZmZXJlZEhlaWdodDsgeSsrKSB7XG4gICAgICAgIHZhciB5MSA9IHRoaXMud2lkdGggKiAocmVjdC55ICsgeSArIHBhZGRpbmcpICsgcmVjdC54ICsgcGFkZGluZztcbiAgICAgICAgdmFyIHkyID0gYnVmZmVyZWRXaWR0aCAqIHk7XG4gICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYnVmZmVyZWRXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICB0YXJnZXRbeTEgKyB4XSA9IHNvdXJjZVt5MiArIHhdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICByZXR1cm4gcmVjdDtcbn07XG5cbkdseXBoQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCkge1xuICAgIHRoaXMuZ2wgPSBnbDtcbiAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLkFMUEhBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgZ2wuQUxQSEEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICB9XG59O1xuXG5HbHlwaEF0bGFzLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlID0gZnVuY3Rpb24oZ2wpIHtcbiAgICB0aGlzLmJpbmQoZ2wpO1xuICAgIGlmICh0aGlzLmRpcnR5KSB7XG5cbiAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2wuQUxQSEEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgaWYgKHRoaXMuY3R4KSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YVtqXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICBkYXRhLmRhdGFbaiArIDFdID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YVtqICsgMl0gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgZGF0YS5kYXRhW2ogKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3R4LnB1dEltYWdlRGF0YShkYXRhLCAwLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5iaW4uZnJlZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHZhciBmcmVlID0gdGhpcy5iaW4uZnJlZVtrXTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VSZWN0KGZyZWUueCwgZnJlZS55LCBmcmVlLncsIGZyZWUuaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRU5EIERFQlVHXG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZUdseXBoc1VSTDtcbnZhciBnZXRBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpLmdldEFycmF5QnVmZmVyO1xudmFyIEdseXBocyA9IHJlcXVpcmUoJy4uL3V0aWwvZ2x5cGhzJyk7XG52YXIgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaFNvdXJjZTtcblxuLyoqXG4gKiBBIGdseXBoIHNvdXJjZSBoYXMgYSBVUkwgZnJvbSB3aGljaCB0byBsb2FkIG5ldyBnbHlwaHMgYW5kIG93bnMgYSBHbHlwaEF0bGFzXG4gKiB0aGF0IHN0b3JlcyBjdXJyZW50bHktbG9hZGVkIGdseXBocy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIGdseXBoIHRlbXBsYXRlIHVybFxuICogQHBhcmFtIHtPYmplY3R9IGdseXBoQXRsYXMgZ2x5cGggYXRsYXMgb2JqZWN0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBHbHlwaFNvdXJjZSh1cmwsIGdseXBoQXRsYXMpIHtcbiAgICB0aGlzLnVybCA9IHVybCAmJiBub3JtYWxpemVVUkwodXJsKTtcbiAgICB0aGlzLmdseXBoQXRsYXMgPSBnbHlwaEF0bGFzO1xuICAgIHRoaXMuc3RhY2tzID0gW107XG4gICAgdGhpcy5sb2FkaW5nID0ge307XG59XG5cbkdseXBoU291cmNlLnByb3RvdHlwZS5nZXRTaW1wbGVHbHlwaHMgPSBmdW5jdGlvbihmb250c3RhY2ssIGdseXBoSURzLCB1aWQsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAodGhpcy5zdGFja3NbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnN0YWNrc1tmb250c3RhY2tdID0ge307XG5cbiAgICB2YXIgZ2x5cGhzID0ge307XG5cbiAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrc1tmb250c3RhY2tdO1xuICAgIHZhciBnbHlwaEF0bGFzID0gdGhpcy5nbHlwaEF0bGFzO1xuXG4gICAgLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIHNkZiBiaXRtYXBzIGFyZSBwYWRkZWQgYnlcbiAgICB2YXIgYnVmZmVyID0gMztcblxuICAgIHZhciBtaXNzaW5nID0ge307XG4gICAgdmFyIHJlbWFpbmluZyA9IDA7XG4gICAgdmFyIHJhbmdlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2x5cGhJRCA9IGdseXBoSURzW2ldO1xuICAgICAgICByYW5nZSA9IE1hdGguZmxvb3IoZ2x5cGhJRCAvIDI1Nik7XG5cbiAgICAgICAgaWYgKHN0YWNrW3JhbmdlXSkge1xuICAgICAgICAgICAgdmFyIGdseXBoID0gc3RhY2tbcmFuZ2VdLmdseXBoc1tnbHlwaElEXTtcbiAgICAgICAgICAgIHZhciByZWN0ICA9IGdseXBoQXRsYXMuYWRkR2x5cGgodWlkLCBmb250c3RhY2ssIGdseXBoLCBidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGdseXBoKSBnbHlwaHNbZ2x5cGhJRF0gPSBuZXcgU2ltcGxlR2x5cGgoZ2x5cGgsIHJlY3QsIGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZ1tyYW5nZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1pc3NpbmdbcmFuZ2VdID0gW107XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaXNzaW5nW3JhbmdlXS5wdXNoKGdseXBoSUQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZW1haW5pbmcpIGNhbGxiYWNrKHVuZGVmaW5lZCwgZ2x5cGhzKTtcblxuICAgIHZhciBvblJhbmdlTG9hZGVkID0gZnVuY3Rpb24oZXJyLCByYW5nZSwgZGF0YSkge1xuICAgICAgICAvLyBUT0RPIG5vdCBiZSBzaWxlbnQgYWJvdXQgZXJyb3JzXG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrc1tmb250c3RhY2tdW3JhbmdlXSA9IGRhdGEuc3RhY2tzWzBdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nW3JhbmdlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBnbHlwaElEID0gbWlzc2luZ1tyYW5nZV1baV07XG4gICAgICAgICAgICAgICAgdmFyIGdseXBoID0gc3RhY2suZ2x5cGhzW2dseXBoSURdO1xuICAgICAgICAgICAgICAgIHZhciByZWN0ICA9IGdseXBoQXRsYXMuYWRkR2x5cGgodWlkLCBmb250c3RhY2ssIGdseXBoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmIChnbHlwaCkgZ2x5cGhzW2dseXBoSURdID0gbmV3IFNpbXBsZUdseXBoKGdseXBoLCByZWN0LCBidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbWFpbmluZy0tO1xuICAgICAgICBpZiAoIXJlbWFpbmluZykgY2FsbGJhY2sodW5kZWZpbmVkLCBnbHlwaHMpO1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGZvciAodmFyIHIgaW4gbWlzc2luZykge1xuICAgICAgICB0aGlzLmxvYWRSYW5nZShmb250c3RhY2ssIHIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgIH1cbn07XG5cbi8vIEEgc2ltcGxpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2x5cGggY29udGFpbmluZyBvbmx5IHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3Igc2hhcGluZy5cbmZ1bmN0aW9uIFNpbXBsZUdseXBoKGdseXBoLCByZWN0LCBidWZmZXIpIHtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdGhpcy5hZHZhbmNlID0gZ2x5cGguYWR2YW5jZTtcbiAgICB0aGlzLmxlZnQgPSBnbHlwaC5sZWZ0IC0gYnVmZmVyIC0gcGFkZGluZztcbiAgICB0aGlzLnRvcCA9IGdseXBoLnRvcCArIGJ1ZmZlciArIHBhZGRpbmc7XG4gICAgdGhpcy5yZWN0ID0gcmVjdDtcbn1cblxuR2x5cGhTb3VyY2UucHJvdG90eXBlLmxvYWRSYW5nZSA9IGZ1bmN0aW9uKGZvbnRzdGFjaywgcmFuZ2UsIGNhbGxiYWNrKSB7XG5cbiAgICBpZiAocmFuZ2UgKiAyNTYgPiA2NTUzNSkgcmV0dXJuIGNhbGxiYWNrKCdneXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWQnKTtcblxuICAgIGlmICh0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9IHt9O1xuICAgIHZhciBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW2ZvbnRzdGFja107XG5cbiAgICBpZiAobG9hZGluZ1tyYW5nZV0pIHtcbiAgICAgICAgbG9hZGluZ1tyYW5nZV0ucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZGluZ1tyYW5nZV0gPSBbY2FsbGJhY2tdO1xuXG4gICAgICAgIHZhciByYW5nZU5hbWUgPSAocmFuZ2UgKiAyNTYpICsgJy0nICsgKHJhbmdlICogMjU2ICsgMjU1KTtcbiAgICAgICAgdmFyIHVybCA9IGdseXBoVXJsKGZvbnRzdGFjaywgcmFuZ2VOYW1lLCB0aGlzLnVybCk7XG5cbiAgICAgICAgZ2V0QXJyYXlCdWZmZXIodXJsLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSAhZXJyICYmIG5ldyBHbHlwaHMobmV3IFByb3RvYnVmKG5ldyBVaW50OEFycmF5KGRhdGEpKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvYWRpbmdbcmFuZ2VdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ1tyYW5nZV1baV0oZXJyLCByYW5nZSwgZ2x5cGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBsb2FkaW5nW3JhbmdlXTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBVc2UgQ05BTUUgc2hhcmRpbmcgdG8gbG9hZCBhIHNwZWNpZmljIGdseXBoIHJhbmdlIG92ZXIgYSByYW5kb21pemVkXG4gKiBidXQgY29uc2lzdGVudCBzdWJkb21haW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udHN0YWNrIGNvbW1hLWpvaW5lZCBmb250c1xuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlIGNvbW1hLWpvaW5lZCByYW5nZVxuICogQHBhcmFtIHt1cmx9IHVybCB0ZW1wbGF0ZWQgdXJsXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1YmRvbWFpbnM9YWJjXSBzdWJkb21haW5zIGFzIGEgc3RyaW5nIHdoZXJlIGVhY2ggbGV0dGVyIGlzIG9uZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGEgdXJsIHRvIGxvYWQgdGhhdCBzZWN0aW9uIG9mIGdseXBoc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2x5cGhVcmwoZm9udHN0YWNrLCByYW5nZSwgdXJsLCBzdWJkb21haW5zKSB7XG4gICAgc3ViZG9tYWlucyA9IHN1YmRvbWFpbnMgfHwgJ2FiYyc7XG5cbiAgICByZXR1cm4gdXJsXG4gICAgICAgIC5yZXBsYWNlKCd7c30nLCBzdWJkb21haW5zW2ZvbnRzdGFjay5sZW5ndGggJSBzdWJkb21haW5zLmxlbmd0aF0pXG4gICAgICAgIC5yZXBsYWNlKCd7Zm9udHN0YWNrfScsIGZvbnRzdGFjaylcbiAgICAgICAgLnJlcGxhY2UoJ3tyYW5nZX0nLCByYW5nZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB0ZXh0RmVhdHVyZXMsIGdlb21ldHJpZXMpIHtcblxuICAgIHZhciBsZWZ0SW5kZXggPSB7fSxcbiAgICAgICAgcmlnaHRJbmRleCA9IHt9LFxuICAgICAgICBtZXJnZWRGZWF0dXJlcyA9IFtdLFxuICAgICAgICBtZXJnZWRHZW9tID0gW10sXG4gICAgICAgIG1lcmdlZFRleHRzID0gW10sXG4gICAgICAgIG1lcmdlZEluZGV4ID0gMCxcbiAgICAgICAgaztcblxuICAgIGZ1bmN0aW9uIGFkZChrKSB7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzLnB1c2goZmVhdHVyZXNba10pO1xuICAgICAgICBtZXJnZWRHZW9tLnB1c2goZ2VvbWV0cmllc1trXSk7XG4gICAgICAgIG1lcmdlZFRleHRzLnB1c2godGV4dEZlYXR1cmVzW2tdKTtcbiAgICAgICAgbWVyZ2VkSW5kZXgrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSkge1xuICAgICAgICB2YXIgaSA9IHJpZ2h0SW5kZXhbbGVmdEtleV07XG4gICAgICAgIGRlbGV0ZSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICByaWdodEluZGV4W3JpZ2h0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXS5wb3AoKTtcbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXSA9IG1lcmdlZEdlb21baV1bMF0uY29uY2F0KGdlb21bMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKSB7XG4gICAgICAgIHZhciBpID0gbGVmdEluZGV4W3JpZ2h0S2V5XTtcbiAgICAgICAgZGVsZXRlIGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkR2VvbVtpXVswXS5zaGlmdCgpO1xuICAgICAgICBtZXJnZWRHZW9tW2ldWzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkR2VvbVtpXVswXSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEtleSh0ZXh0LCBnZW9tLCBvblJpZ2h0KSB7XG4gICAgICAgIHZhciBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gdGV4dCArICc6JyArIHBvaW50LnggKyAnOicgKyBwb2ludC55O1xuICAgIH1cblxuICAgIGZvciAoayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IGdlb21ldHJpZXNba10sXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dEZlYXR1cmVzW2tdO1xuXG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgYWRkKGspO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGVmdEtleSA9IGdldEtleSh0ZXh0LCBnZW9tKSxcbiAgICAgICAgICAgIHJpZ2h0S2V5ID0gZ2V0S2V5KHRleHQsIGdlb20sIHRydWUpO1xuXG4gICAgICAgIGlmICgobGVmdEtleSBpbiByaWdodEluZGV4KSAmJiAocmlnaHRLZXkgaW4gbGVmdEluZGV4KSAmJiAocmlnaHRJbmRleFtsZWZ0S2V5XSAhPT0gbGVmdEluZGV4W3JpZ2h0S2V5XSkpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCBhZGphY2VudCB0byBib3RoIGVuZHMgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2UgYWxsIHRocmVlXG4gICAgICAgICAgICB2YXIgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgdmFyIGkgPSBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgbWVyZ2VkR2VvbVtqXSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEdlb21baV0sIHRydWUpXSA9IGk7XG4gICAgICAgICAgICBtZXJnZWRHZW9tW2pdID0gbnVsbDtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmVhdHVyZXM6IG1lcmdlZEZlYXR1cmVzLFxuICAgICAgICB0ZXh0RmVhdHVyZXM6IG1lcmdlZFRleHRzLFxuICAgICAgICBnZW9tZXRyaWVzOiBtZXJnZWRHZW9tXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldEljb25RdWFkczogZ2V0SWNvblF1YWRzLFxuICAgIGdldEdseXBoUXVhZHM6IGdldEdseXBoUXVhZHNcbn07XG5cbnZhciBtaW5TY2FsZSA9IDAuNTsgLy8gdW5kZXJzY2FsZSBieSAxIHpvb20gbGV2ZWxcblxuLyoqXG4gKiBBIHRleHR1cmVkIHF1YWQgZm9yIHJlbmRlcmluZyBhIHNpbmdsZSBpY29uIG9yIGdseXBoLlxuICpcbiAqIFRoZSB6b29tIHJhbmdlIHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gaXMgZGVmaW5lZCBieSBtaW5TY2FsZSBhbmQgbWF4U2NhbGUuXG4gKlxuICogQHBhcmFtIHtQb2ludH0gYW5jaG9yUG9pbnQgdGhlIHBvaW50IHRoZSBzeW1ib2wgaXMgYW5jaG9yZWQgYXJvdW5kXG4gKiBAcGFyYW0ge1BvaW50fSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gdHIgVGhlIG9mZnNldCBvZiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge1BvaW50fSBibCBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge09iamVjdH0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIFRoZSBhbmdsZSBvZiB0aGUgbGFiZWwgYXQgaXQncyBjZW50ZXIsIG5vdCB0aGUgYW5nbGUgb2YgdGhpcyBxdWFkLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pblNjYWxlIFRoZSBtaW5pbXVtIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgdGlsZSdzIGludGVuZGVkIHNjYWxlLCB0aGF0IHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4U2NhbGUgVGhlIG1heGltdW0gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSB0aWxlJ3MgaW50ZW5kZWQgc2NhbGUsIHRoYXQgdGhlIGdseXBoIGNhbiBiZSBzaG93biBhdC5cbiAqXG4gKiBAY2xhc3MgU3ltYm9sUXVhZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gU3ltYm9sUXVhZChhbmNob3JQb2ludCwgdGwsIHRyLCBibCwgYnIsIHRleCwgYW5nbGUsIG1pblNjYWxlLCBtYXhTY2FsZSkge1xuICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDtcbiAgICB0aGlzLnRsID0gdGw7XG4gICAgdGhpcy50ciA9IHRyO1xuICAgIHRoaXMuYmwgPSBibDtcbiAgICB0aGlzLmJyID0gYnI7XG4gICAgdGhpcy50ZXggPSB0ZXg7XG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgIHRoaXMubWluU2NhbGUgPSBtaW5TY2FsZTtcbiAgICB0aGlzLm1heFNjYWxlID0gbWF4U2NhbGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYW4gaWNvbi5cbiAqXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gKiBAcGFyYW0ge1Bvc2l0aW9uZWRJY29ufSBzaGFwZWRJY29uXG4gKiBAcGFyYW0ge251bWJlcn0gYm94U2NhbGUgQSBtYWdpYyBudW1iZXIgZm9yIGNvbnZlcnRpbmcgZ2x5cGggbWV0cmljIHVuaXRzIHRvIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxQb2ludD4+fSBsaW5lXG4gKiBAcGFyYW0ge0xheW91dFByb3BlcnRpZXN9IGxheW91dFxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgaWNvbiBzaG91bGQgYmUgcGxhY2VkIGFsb25nIHRoZSBsaW5lLlxuICogQHJldHVybnMge0FycmF5PFN5bWJvbFF1YWQ+fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvciwgc2hhcGVkSWNvbiwgYm94U2NhbGUsIGxpbmUsIGxheW91dCwgYWxvbmdMaW5lKSB7XG5cbiAgICB2YXIgcmVjdCA9IHNoYXBlZEljb24uaW1hZ2UucmVjdDtcblxuICAgIHZhciBib3JkZXIgPSAxO1xuICAgIHZhciBsZWZ0ID0gc2hhcGVkSWNvbi5sZWZ0IC0gYm9yZGVyO1xuICAgIHZhciByaWdodCA9IGxlZnQgKyByZWN0Lnc7XG4gICAgdmFyIHRvcCA9IHNoYXBlZEljb24udG9wIC0gYm9yZGVyO1xuICAgIHZhciBib3R0b20gPSB0b3AgKyByZWN0Lmg7XG4gICAgdmFyIHRsID0gbmV3IFBvaW50KGxlZnQsIHRvcCk7XG4gICAgdmFyIHRyID0gbmV3IFBvaW50KHJpZ2h0LCB0b3ApO1xuICAgIHZhciBiciA9IG5ldyBQb2ludChyaWdodCwgYm90dG9tKTtcbiAgICB2YXIgYmwgPSBuZXcgUG9pbnQobGVmdCwgYm90dG9tKTtcblxuICAgIHZhciBhbmdsZSA9IGxheW91dFsnaWNvbi1yb3RhdGUnXSAqIE1hdGguUEkgLyAxODA7XG4gICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICB2YXIgcHJldiA9IGxpbmVbYW5jaG9yLnNlZ21lbnRdO1xuICAgICAgICBhbmdsZSArPSBNYXRoLmF0YW4yKGFuY2hvci55IC0gcHJldi55LCBhbmNob3IueCAtIHByZXYueCk7XG4gICAgfVxuXG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgdGwgPSB0bC5tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIHRyID0gdHIubWF0TXVsdChtYXRyaXgpO1xuICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgYnIgPSBici5tYXRNdWx0KG1hdHJpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtuZXcgU3ltYm9sUXVhZChuZXcgUG9pbnQoYW5jaG9yLngsIGFuY2hvci55KSwgdGwsIHRyLCBibCwgYnIsIHNoYXBlZEljb24uaW1hZ2UucmVjdCwgMCwgbWluU2NhbGUsIEluZmluaXR5KV07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYSB0ZXh0IGxhYmVsLlxuICpcbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3JcbiAqIEBwYXJhbSB7U2hhcGluZ30gc2hhcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIGZvciBjb252ZXJ0aW5nIGZyb20gZ2x5cGggbWV0cmljIHVuaXRzIHRvIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxQb2ludD4+fSBsaW5lXG4gKiBAcGFyYW0ge0xheW91dFByb3BlcnRpZXN9IGxheW91dFxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIHBsYWNlZCBhbG9uZyB0aGUgbGluZS5cbiAqIEByZXR1cm5zIHtBcnJheTxTeW1ib2xRdWFkPn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwaW5nLCBib3hTY2FsZSwgbGluZSwgbGF5b3V0LCBhbG9uZ0xpbmUpIHtcblxuICAgIHZhciB0ZXh0Um90YXRlID0gbGF5b3V0Wyd0ZXh0LXJvdGF0ZSddICogTWF0aC5QSSAvIDE4MDtcbiAgICB2YXIga2VlcFVwcmlnaHQgPSBsYXlvdXRbJ3RleHQta2VlcC11cHJpZ2h0J107XG5cbiAgICB2YXIgcG9zaXRpb25lZEdseXBocyA9IHNoYXBpbmcucG9zaXRpb25lZEdseXBocztcbiAgICB2YXIgcXVhZHMgPSBbXTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1trXTtcbiAgICAgICAgdmFyIGdseXBoID0gcG9zaXRpb25lZEdseXBoLmdseXBoO1xuICAgICAgICB2YXIgcmVjdCA9IGdseXBoLnJlY3Q7XG5cbiAgICAgICAgaWYgKCFyZWN0KSBjb250aW51ZTtcblxuICAgICAgICB2YXIgY2VudGVyWCA9IChwb3NpdGlvbmVkR2x5cGgueCArIGdseXBoLmFkdmFuY2UgLyAyKSAqIGJveFNjYWxlO1xuXG4gICAgICAgIHZhciBnbHlwaEluc3RhbmNlcztcbiAgICAgICAgdmFyIGxhYmVsTWluU2NhbGUgPSBtaW5TY2FsZTtcbiAgICAgICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICAgICAgZ2x5cGhJbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgICAgIGxhYmVsTWluU2NhbGUgPSBnZXRTZWdtZW50R2x5cGhzKGdseXBoSW5zdGFuY2VzLCBhbmNob3IsIGNlbnRlclgsIGxpbmUsIGFuY2hvci5zZWdtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChrZWVwVXByaWdodCkge1xuICAgICAgICAgICAgICAgIGxhYmVsTWluU2NhbGUgPSBNYXRoLm1pbihsYWJlbE1pblNjYWxlLCBnZXRTZWdtZW50R2x5cGhzKGdseXBoSW5zdGFuY2VzLCBhbmNob3IsIGNlbnRlclgsIGxpbmUsIGFuY2hvci5zZWdtZW50LCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbHlwaEluc3RhbmNlcyA9IFt7XG4gICAgICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgICAgICAgICBtYXhTY2FsZTogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWluU2NhbGU6IG1pblNjYWxlXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4MSA9IHBvc2l0aW9uZWRHbHlwaC54ICsgZ2x5cGgubGVmdCxcbiAgICAgICAgICAgIHkxID0gcG9zaXRpb25lZEdseXBoLnkgLSBnbHlwaC50b3AsXG4gICAgICAgICAgICB4MiA9IHgxICsgcmVjdC53LFxuICAgICAgICAgICAgeTIgPSB5MSArIHJlY3QuaCxcblxuICAgICAgICAgICAgb3RsID0gbmV3IFBvaW50KHgxLCB5MSksXG4gICAgICAgICAgICBvdHIgPSBuZXcgUG9pbnQoeDIsIHkxKSxcbiAgICAgICAgICAgIG9ibCA9IG5ldyBQb2ludCh4MSwgeTIpLFxuICAgICAgICAgICAgb2JyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnbHlwaEluc3RhbmNlc1tpXSxcbiAgICAgICAgICAgICAgICB0bCA9IG90bCxcbiAgICAgICAgICAgICAgICB0ciA9IG90cixcbiAgICAgICAgICAgICAgICBibCA9IG9ibCxcbiAgICAgICAgICAgICAgICBiciA9IG9icixcbiAgICAgICAgICAgICAgICBhbmdsZSA9IGluc3RhbmNlLmFuZ2xlICsgdGV4dFJvdGF0ZTtcblxuICAgICAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgICAgICB0bCA9IHRsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICB0ciA9IHRyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBiciA9IGJyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCBsYWJlbCBmcm9tIGV4dGVuZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIHZhciBnbHlwaE1pblNjYWxlID0gTWF0aC5tYXgoaW5zdGFuY2UubWluU2NhbGUsIGxhYmVsTWluU2NhbGUpO1xuXG4gICAgICAgICAgICB2YXIgZ2x5cGhBbmdsZSA9IChhbmNob3IuYW5nbGUgKyB0ZXh0Um90YXRlICsgaW5zdGFuY2Uub2Zmc2V0ICsgMiAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFN5bWJvbFF1YWQoaW5zdGFuY2UuYW5jaG9yUG9pbnQsIHRsLCB0ciwgYmwsIGJyLCByZWN0LCBnbHlwaEFuZ2xlLCBnbHlwaE1pblNjYWxlLCBpbnN0YW5jZS5tYXhTY2FsZSkpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG5cbi8qKlxuICogV2UgY2FuIG9ubHkgcmVuZGVyIGdseXBoIHF1YWRzIHRoYXQgc2xpZGUgYWxvbmcgYSBzdHJhaWdodCBsaW5lLiBUbyBkcmF3XG4gKiBjdXJ2ZWQgbGluZXMgd2UgbmVlZCBhbiBpbnN0YW5jZSBvZiBhIGdseXBoIGZvciBlYWNoIHNlZ21lbnQgaXQgYXBwZWFycyBvbi5cbiAqIFRoaXMgY3JlYXRlcyBhbGwgdGhlIGluc3RhbmNlcyBvZiBhIGdseXBoIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byByZW5kZXIgYSBsYWJlbC5cbiAqXG4gKiBXZSBuZWVkIGFcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZ2x5cGhJbnN0YW5jZXMgQW4gZW1wdHkgYXJyYXkgdGhhdCBnbHlwaEluc3RhbmNlcyBhcmUgYWRkZWQgdG8uXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBnbHlwaCdzIG9mZnNldCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGxhYmVsLlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50IFRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgYW5jaG9yIGV4aXN0cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yd2FyZCBJZiB0cnVlIGdldCB0aGUgZ2x5cGhzIHRoYXQgY29tZSBsYXRlciBvbiB0aGUgbGluZSwgb3RoZXJ3aXNlIGdldCB0aGUgZ2x5cGhzIHRoYXQgY29tZSBlYXJsaWVyLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBnbHlwaEluc3RhbmNlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VnbWVudEdseXBocyhnbHlwaHMsIGFuY2hvciwgb2Zmc2V0LCBsaW5lLCBzZWdtZW50LCBmb3J3YXJkKSB7XG4gICAgdmFyIHVwc2lkZURvd24gPSAhZm9yd2FyZDtcblxuICAgIGlmIChvZmZzZXQgPCAwKSBmb3J3YXJkID0gIWZvcndhcmQ7XG5cbiAgICBpZiAoZm9yd2FyZCkgc2VnbWVudCsrO1xuXG4gICAgdmFyIG5ld0FuY2hvclBvaW50ID0gbmV3IFBvaW50KGFuY2hvci54LCBhbmNob3IueSk7XG4gICAgdmFyIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgdmFyIHByZXZTY2FsZSA9IEluZmluaXR5O1xuXG4gICAgb2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcblxuICAgIHZhciBwbGFjZW1lbnRTY2FsZSA9IG1pblNjYWxlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gbmV3QW5jaG9yUG9pbnQuZGlzdChlbmQpO1xuICAgICAgICB2YXIgc2NhbGUgPSBvZmZzZXQgLyBkaXN0YW5jZTtcblxuICAgICAgICAvLyBHZXQgdGhlIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnRcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihlbmQueSAtIG5ld0FuY2hvclBvaW50LnksIGVuZC54IC0gbmV3QW5jaG9yUG9pbnQueCk7XG4gICAgICAgIGlmICghZm9yd2FyZCkgYW5nbGUgKz0gTWF0aC5QSTtcbiAgICAgICAgaWYgKHVwc2lkZURvd24pIGFuZ2xlICs9IE1hdGguUEk7XG5cbiAgICAgICAgZ2x5cGhzLnB1c2goe1xuICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IG5ld0FuY2hvclBvaW50LFxuICAgICAgICAgICAgb2Zmc2V0OiB1cHNpZGVEb3duID8gTWF0aC5QSSA6IDAsXG4gICAgICAgICAgICBtaW5TY2FsZTogc2NhbGUsXG4gICAgICAgICAgICBtYXhTY2FsZTogcHJldlNjYWxlLFxuICAgICAgICAgICAgYW5nbGU6IChhbmdsZSArIDIgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNjYWxlIDw9IHBsYWNlbWVudFNjYWxlKSBicmVhaztcblxuICAgICAgICBuZXdBbmNob3JQb2ludCA9IGVuZDtcblxuICAgICAgICAvLyBza2lwIGR1cGxpY2F0ZSBub2Rlc1xuICAgICAgICB3aGlsZSAobmV3QW5jaG9yUG9pbnQuZXF1YWxzKGVuZCkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgICAgIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0ID0gZW5kLnN1YihuZXdBbmNob3JQb2ludCkuX3VuaXQoKTtcbiAgICAgICAgbmV3QW5jaG9yUG9pbnQgPSBuZXdBbmNob3JQb2ludC5zdWIodW5pdC5fbXVsdChkaXN0YW5jZSkpO1xuXG4gICAgICAgIHByZXZTY2FsZSA9IHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBwbGFjZW1lbnRTY2FsZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmVUb2tlbnMgPSByZXF1aXJlKCcuLi91dGlsL3Rva2VuJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUljb25zO1xuXG4vLyBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgaWNvbnMgbmVlZCB0byBiZSBsb2FkZWQuXG5mdW5jdGlvbiByZXNvbHZlSWNvbnMoZmVhdHVyZXMsIGxheW91dFByb3BlcnRpZXMpIHtcbiAgICB2YXIgaWNvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ2ljb24taW1hZ2UnXSk7XG4gICAgICAgIGlmICghdGV4dCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGljb25zLmluZGV4T2YodGV4dCkgPCAwKSB7XG4gICAgICAgICAgICBpY29ucy5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb25zO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVzb2x2ZVRva2VucyA9IHJlcXVpcmUoJy4uL3V0aWwvdG9rZW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlVGV4dDtcblxuLyoqXG4gKiBGb3IgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZGV0ZXJtaW5lIHdoYXQgZ2x5cGggcmFuZ2VzIG5lZWQgdG8gYmUgbG9hZGVkXG4gKiBhbmQgYXBwbHkgYW55IHRleHQgcHJlcHJvY2Vzc2luZy4gVGhlIHJlbWFpbmluZyB1c2VycyBvZiB0ZXh0IHNob3VsZFxuICogdXNlIHRoZSBgdGV4dEZlYXR1cmVzYCBrZXkgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmdcbiAqIGZlYXR1cmUgdGV4dCBkaXJlY3RseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUZXh0KGZlYXR1cmVzLCBsYXlvdXRQcm9wZXJ0aWVzLCBnbHlwaHMpIHtcbiAgICB2YXIgdGV4dEZlYXR1cmVzID0gW107XG4gICAgdmFyIGNvZGVwb2ludHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBmbCA9IGZlYXR1cmVzLmxlbmd0aDsgaSA8IGZsOyBpKyspIHtcbiAgICAgICAgdmFyIHRleHQgPSByZXNvbHZlVG9rZW5zKGZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGxheW91dFByb3BlcnRpZXNbJ3RleHQtZmllbGQnXSk7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgdGV4dEZlYXR1cmVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IGxheW91dFByb3BlcnRpZXNbJ3RleHQtdHJhbnNmb3JtJ107XG4gICAgICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSB0ZXh0Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgIGNvZGVwb2ludHMucHVzaCh0ZXh0LmNoYXJDb2RlQXQoaikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgaW5kZXhlcyBvZiBmZWF0dXJlcyB3aXRoIHRleHQuXG4gICAgICAgIHRleHRGZWF0dXJlc1tpXSA9IHRleHQ7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGEgbGlzdCBvZiB1bmlxdWUgY29kZXBvaW50cyB3ZSBhcmUgbWlzc2luZ1xuICAgIGNvZGVwb2ludHMgPSB1bmlxKGNvZGVwb2ludHMsIGdseXBocyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0RmVhdHVyZXM6IHRleHRGZWF0dXJlcyxcbiAgICAgICAgY29kZXBvaW50czogY29kZXBvaW50c1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHVuaXEoaWRzLCBhbHJlYWR5SGF2ZSkge1xuICAgIHZhciB1ID0gW107XG4gICAgdmFyIGxhc3Q7XG4gICAgaWRzLnNvcnQoc29ydE51bWJlcnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpZHNbaV0gIT09IGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoIWFscmVhZHlIYXZlW2xhc3RdKSB1LnB1c2goaWRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdTtcbn1cblxuZnVuY3Rpb24gc29ydE51bWJlcnMoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgc2hhcGVUZXh0OiBzaGFwZVRleHQsXG4gICAgc2hhcGVJY29uOiBzaGFwZUljb25cbn07XG5cblxuLy8gVGhlIHBvc2l0aW9uIG9mIGEgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHRleHQncyBhbmNob3IgcG9pbnQuXG5mdW5jdGlvbiBQb3NpdGlvbmVkR2x5cGgoY29kZVBvaW50LCB4LCB5LCBnbHlwaCkge1xuICAgIHRoaXMuY29kZVBvaW50ID0gY29kZVBvaW50O1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmdseXBoID0gZ2x5cGg7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBwb3NpdGlvbmVkIGdseXBocyBhbmQgc29tZSBtZXRhZGF0YVxuZnVuY3Rpb24gU2hhcGluZyhwb3NpdGlvbmVkR2x5cGhzLCB0ZXh0LCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQpIHtcbiAgICB0aGlzLnBvc2l0aW9uZWRHbHlwaHMgPSBwb3NpdGlvbmVkR2x5cGhzO1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy50b3AgPSB0b3A7XG4gICAgdGhpcy5ib3R0b20gPSBib3R0b207XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG59XG5cbmZ1bmN0aW9uIHNoYXBlVGV4dCh0ZXh0LCBnbHlwaHMsIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnksIHNwYWNpbmcsIHRyYW5zbGF0ZSkge1xuXG4gICAgdmFyIHBvc2l0aW9uZWRHbHlwaHMgPSBbXTtcbiAgICB2YXIgc2hhcGluZyA9IG5ldyBTaGFwaW5nKHBvc2l0aW9uZWRHbHlwaHMsIHRleHQsIHRyYW5zbGF0ZVsxXSwgdHJhbnNsYXRlWzFdLCB0cmFuc2xhdGVbMF0sIHRyYW5zbGF0ZVswXSk7XG5cbiAgICAvLyB0aGUgeSBvZmZzZXQgKnNob3VsZCogYmUgcGFydCBvZiB0aGUgZm9udCBtZXRhZGF0YVxuICAgIHZhciB5T2Zmc2V0ID0gLTE3O1xuXG4gICAgdmFyIHggPSB0cmFuc2xhdGVbMF07XG4gICAgdmFyIHkgPSB0cmFuc2xhdGVbMV0gKyB5T2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGNvZGVQb2ludCwgeCwgeSwgZ2x5cGgpKTtcbiAgICAgICAgeCArPSBnbHlwaC5hZHZhbmNlICsgc3BhY2luZztcbiAgICB9XG5cbiAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBsaW5ld3JhcChzaGFwaW5nLCBnbHlwaHMsIGxpbmVIZWlnaHQsIG1heFdpZHRoLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnkpO1xuXG4gICAgcmV0dXJuIHNoYXBpbmc7XG59XG5cbnZhciBicmVha2FibGUgPSB7IDMyOiB0cnVlIH07IC8vIEN1cnJlbnRseSBvbmx5IGJyZWFrcyBhdCByZWd1bGFyIHNwYWNlc1xuXG5mdW5jdGlvbiBsaW5ld3JhcChzaGFwaW5nLCBnbHlwaHMsIGxpbmVIZWlnaHQsIG1heFdpZHRoLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnkpIHtcbiAgICB2YXIgbGFzdFNhZmVCcmVhayA9IG51bGw7XG5cbiAgICB2YXIgbGVuZ3RoQmVmb3JlQ3VycmVudExpbmUgPSAwO1xuICAgIHZhciBsaW5lU3RhcnRJbmRleCA9IDA7XG4gICAgdmFyIGxpbmUgPSAwO1xuXG4gICAgdmFyIG1heExpbmVMZW5ndGggPSAwO1xuXG4gICAgdmFyIHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG5cbiAgICBpZiAobWF4V2lkdGgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1tpXTtcblxuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoLnggLT0gbGVuZ3RoQmVmb3JlQ3VycmVudExpbmU7XG4gICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGgueSArPSBsaW5lSGVpZ2h0ICogbGluZTtcblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaC54ID4gbWF4V2lkdGggJiYgbGFzdFNhZmVCcmVhayAhPT0gbnVsbCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVMZW5ndGggPSBwb3NpdGlvbmVkR2x5cGhzW2xhc3RTYWZlQnJlYWsgKyAxXS54O1xuICAgICAgICAgICAgICAgIG1heExpbmVMZW5ndGggPSBNYXRoLm1heChsaW5lTGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSBsYXN0U2FmZUJyZWFrICsgMTsgayA8PSBpOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoc1trXS55ICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHNba10ueCAtPSBsaW5lTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqdXN0aWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgbGluZVN0YXJ0SW5kZXgsIGxhc3RTYWZlQnJlYWsgLSAxLCBqdXN0aWZ5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleCA9IGxhc3RTYWZlQnJlYWsgKyAxO1xuICAgICAgICAgICAgICAgIGxhc3RTYWZlQnJlYWsgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxlbmd0aEJlZm9yZUN1cnJlbnRMaW5lICs9IGxpbmVMZW5ndGg7XG4gICAgICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYnJlYWthYmxlW3Bvc2l0aW9uZWRHbHlwaC5jb2RlUG9pbnRdKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNhZmVCcmVhayA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFzdFBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNbcG9zaXRpb25lZEdseXBocy5sZW5ndGggLSAxXTtcbiAgICB2YXIgbGFzdExpbmVMZW5ndGggPSBsYXN0UG9zaXRpb25lZEdseXBoLnggKyBnbHlwaHNbbGFzdFBvc2l0aW9uZWRHbHlwaC5jb2RlUG9pbnRdLmFkdmFuY2U7XG4gICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KG1heExpbmVMZW5ndGgsIGxhc3RMaW5lTGVuZ3RoKTtcblxuICAgIHZhciBoZWlnaHQgPSAobGluZSArIDEpICogbGluZUhlaWdodDtcblxuICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgbGluZVN0YXJ0SW5kZXgsIHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoIC0gMSwganVzdGlmeSk7XG4gICAgYWxpZ24ocG9zaXRpb25lZEdseXBocywganVzdGlmeSwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBtYXhMaW5lTGVuZ3RoLCBsaW5lSGVpZ2h0LCBsaW5lKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRpbmcgYm94XG4gICAgc2hhcGluZy50b3AgKz0gLXZlcnRpY2FsQWxpZ24gKiBoZWlnaHQ7XG4gICAgc2hhcGluZy5ib3R0b20gPSBzaGFwaW5nLnRvcCArIGhlaWdodDtcbiAgICBzaGFwaW5nLmxlZnQgKz0gLWhvcml6b250YWxBbGlnbiAqIG1heExpbmVMZW5ndGg7XG4gICAgc2hhcGluZy5yaWdodCA9IHNoYXBpbmcubGVmdCArIG1heExpbmVMZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGdseXBocywgc3RhcnQsIGVuZCwganVzdGlmeSkge1xuICAgIHZhciBsYXN0QWR2YW5jZSA9IGdseXBoc1twb3NpdGlvbmVkR2x5cGhzW2VuZF0uY29kZVBvaW50XS5hZHZhbmNlO1xuICAgIHZhciBsaW5lSW5kZW50ID0gKHBvc2l0aW9uZWRHbHlwaHNbZW5kXS54ICsgbGFzdEFkdmFuY2UpICoganVzdGlmeTtcblxuICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8PSBlbmQ7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggLT0gbGluZUluZGVudDtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gYWxpZ24ocG9zaXRpb25lZEdseXBocywganVzdGlmeSwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBtYXhMaW5lTGVuZ3RoLCBsaW5lSGVpZ2h0LCBsaW5lKSB7XG4gICAgdmFyIHNoaWZ0WCA9IChqdXN0aWZ5IC0gaG9yaXpvbnRhbEFsaWduKSAqIG1heExpbmVMZW5ndGg7XG4gICAgdmFyIHNoaWZ0WSA9ICgtdmVydGljYWxBbGlnbiAqIChsaW5lICsgMSkgKyAwLjUpICogbGluZUhlaWdodDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggKz0gc2hpZnRYO1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gc2hpZnRZO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBzaGFwZUljb24oaW1hZ2UsIGxheW91dCkge1xuICAgIGlmICghaW1hZ2UgfHwgIWltYWdlLnJlY3QpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGR4ID0gbGF5b3V0WydpY29uLW9mZnNldCddWzBdO1xuICAgIHZhciBkeSA9IGxheW91dFsnaWNvbi1vZmZzZXQnXVsxXTtcbiAgICB2YXIgeDEgPSBkeCAtIGltYWdlLndpZHRoIC8gMjtcbiAgICB2YXIgeDIgPSB4MSArIGltYWdlLndpZHRoO1xuICAgIHZhciB5MSA9IGR5IC0gaW1hZ2UuaGVpZ2h0IC8gMjtcbiAgICB2YXIgeTIgPSB5MSArIGltYWdlLmhlaWdodDtcblxuICAgIHJldHVybiBuZXcgUG9zaXRpb25lZEljb24oaW1hZ2UsIHkxLCB5MiwgeDEsIHgyKTtcbn1cblxuZnVuY3Rpb24gUG9zaXRpb25lZEljb24oaW1hZ2UsIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCkge1xuICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgIHRoaXMucmlnaHQgPSByaWdodDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJpblBhY2sgPSByZXF1aXJlKCcuL2Jpbl9wYWNrJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ByaXRlQXRsYXM7XG5mdW5jdGlvbiBTcHJpdGVBdGxhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgdGhpcy5iaW4gPSBuZXcgQmluUGFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgIHRoaXMuZGF0YSA9IGZhbHNlO1xuICAgIHRoaXMudGV4dHVyZSA9IDA7IC8vIFdlYkdMIElEXG4gICAgdGhpcy5maWx0ZXIgPSAwOyAvLyBXZWJHTCBJRFxuICAgIHRoaXMucGl4ZWxSYXRpbyA9IDE7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG59XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZSA9IHtcbiAgICBnZXQgZGVidWcoKSB7XG4gICAgICAgIHJldHVybiAnY2FudmFzJyBpbiB0aGlzO1xuICAgIH0sXG4gICAgc2V0IGRlYnVnKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW87XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbztcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyAncHgnO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbihuZXdSYXRpbykge1xuICAgIGlmICh0aGlzLnBpeGVsUmF0aW8gPT09IG5ld1JhdGlvKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgb2xkUmF0aW8gPSB0aGlzLnBpeGVsUmF0aW87XG4gICAgdGhpcy5waXhlbFJhdGlvID0gbmV3UmF0aW87XG5cbiAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBvbGREYXRhID0gdGhpcy5kYXRhO1xuXG4gICAgICAgIHRoaXMuZGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFsbG9jYXRlKCk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBvbGRXaWR0aCA9IHRoaXMud2lkdGggKiBvbGRSYXRpbztcbiAgICAgICAgdmFyIG9sZEhlaWdodCA9IHRoaXMuaGVpZ2h0ICogb2xkUmF0aW87XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGggKiBuZXdSYXRpbztcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IHRoaXMuaGVpZ2h0ICogbmV3UmF0aW87XG5cbiAgICAgICAgLy8gQmFzaWMgaW1hZ2Ugc2NhbGluZy4gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggYmV0dGVyIGltYWdlIHNjYWxpbmcuXG4gICAgICAgIHZhciBuZXdJbWFnZSA9IHRoaXMuZGF0YTtcbiAgICAgICAgdmFyIG9sZEltYWdlID0gb2xkRGF0YTtcblxuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IG5ld0hlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgb2xkWU9mZnNldCA9IE1hdGguZmxvb3IoKHkgKiBvbGRIZWlnaHQpIC8gbmV3SGVpZ2h0KSAqIG9sZFdpZHRoO1xuICAgICAgICAgICAgdmFyIG5ld1lPZmZzZXQgPSB5ICogbmV3V2lkdGg7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG5ld1dpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkWCA9IE1hdGguZmxvb3IoKHggKiBvbGRXaWR0aCkgLyBuZXdXaWR0aCk7XG4gICAgICAgICAgICAgICAgbmV3SW1hZ2VbbmV3WU9mZnNldCArIHhdID0gb2xkSW1hZ2Vbb2xkWU9mZnNldCArIG9sZFhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2xkRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpcnR5O1xufTtcblxuZnVuY3Rpb24gY29weUJpdG1hcChzcmMsIHNyY1N0cmlkZSwgc3JjWCwgc3JjWSwgZHN0LCBkc3RTdHJpZGUsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIHdyYXApIHtcbiAgICB2YXIgc3JjSSA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYO1xuICAgIHZhciBkc3RJID0gZHN0WSAqIGRzdFN0cmlkZSArIGRzdFg7XG4gICAgdmFyIHgsIHk7XG5cbiAgICBpZiAod3JhcCkge1xuICAgICAgICAvLyBhZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZVxuICAgICAgICBkc3RJIC09IGRzdFN0cmlkZTtcbiAgICAgICAgZm9yICh5ID0gLTE7IHkgPD0gaGVpZ2h0OyB5KyssIHNyY0kgPSAoKHkgKyBoZWlnaHQpICUgaGVpZ2h0ICsgc3JjWSkgKiBzcmNTdHJpZGUgKyBzcmNYLCBkc3RJICs9IGRzdFN0cmlkZSkge1xuICAgICAgICAgICAgZm9yICh4ID0gLTE7IHggPD0gd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArICgoeCArIHdpZHRoKSAlIHdpZHRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKywgc3JjSSArPSBzcmNTdHJpZGUsIGRzdEkgKz0gZHN0U3RyaWRlKSB7XG4gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArIHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGVJbWFnZSA9IGZ1bmN0aW9uKHBpeGVsV2lkdGgsIHBpeGVsSGVpZ2h0KSB7XG5cbiAgICAvLyBJbmNyZWFzZSB0byBuZXh0IG51bWJlciBkaXZpc2libGUgYnkgNCwgYnV0IGF0IGxlYXN0IDEuXG4gICAgLy8gVGhpcyBpcyBzbyB3ZSBjYW4gc2NhbGUgZG93biB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgcGFjayB0aGVtXG4gICAgLy8gaW50byAyIGJ5dGVzIHJhdGhlciB0aGFuIDQgYnl0ZXMuXG4gICAgLy8gUGFkIGljb25zIHRvIHByZXZlbnQgdGhlbSBmcm9tIHBvbGx1dGluZyBuZWlnaGJvdXJzIGR1cmluZyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIHZhciBwYWRkaW5nID0gMjtcbiAgICB2YXIgcGFja1dpZHRoID0gcGl4ZWxXaWR0aCArIHBhZGRpbmcgKyAoNCAtIChwaXhlbFdpZHRoICsgcGFkZGluZykgJSA0KTtcbiAgICB2YXIgcGFja0hlaWdodCA9IHBpeGVsSGVpZ2h0ICsgcGFkZGluZyArICg0IC0gKHBpeGVsSGVpZ2h0ICsgcGFkZGluZykgJSA0KTsvLyArIDQ7XG5cbiAgICAvLyBXZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IGFyZWEgaW4gdGhlIGJpbiwgYW5kIHN0b3JlIGFuIGVtcHR5IGltYWdlIGluIGl0LlxuICAgIC8vIEFkZCBhIDFweCBib3JkZXIgYXJvdW5kIGV2ZXJ5IGltYWdlLlxuICAgIHZhciByZWN0ID0gdGhpcy5iaW4uYWxsb2NhdGUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICBpZiAocmVjdC53ID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cblxuICAgIHJlY3Qub3JpZ2luYWxXaWR0aCA9IHBpeGVsV2lkdGg7XG4gICAgcmVjdC5vcmlnaW5hbEhlaWdodCA9IHBpeGVsSGVpZ2h0O1xuXG4gICAgcmV0dXJuIHJlY3Q7XG59O1xuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0SW1hZ2UgPSBmdW5jdGlvbihuYW1lLCB3cmFwKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VzW25hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3ByaXRlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBwb3MgPSB0aGlzLnNwcml0ZS5nZXRTcHJpdGVQb3NpdGlvbihuYW1lKTtcbiAgICBpZiAoIXBvcy53aWR0aCB8fCAhcG9zLmhlaWdodCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSBwb3Mud2lkdGggLyBwb3MucGl4ZWxSYXRpbztcbiAgICB2YXIgaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHBvcy5waXhlbFJhdGlvO1xuICAgIHZhciByZWN0ID0gdGhpcy5hbGxvY2F0ZUltYWdlKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChyZWN0LncgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuXG4gICAgdmFyIGltYWdlID0gbmV3IEF0bGFzSW1hZ2UocmVjdCwgd2lkdGgsIGhlaWdodCwgcG9zLnNkZik7XG4gICAgdGhpcy5pbWFnZXNbbmFtZV0gPSBpbWFnZTtcblxuICAgIHRoaXMuY29weShyZWN0LCBwb3MsIHdyYXApO1xuXG4gICAgcmV0dXJuIGltYWdlO1xufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbihuYW1lLCByZXBlYXRpbmcpIHtcbiAgICB2YXIgaW1hZ2UgPSB0aGlzLmdldEltYWdlKG5hbWUsIHJlcGVhdGluZyk7XG4gICAgdmFyIHJlY3QgPSBpbWFnZSAmJiBpbWFnZS5yZWN0O1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdoZW4gdGhlIGltYWdlIGlzIHJlcGVhdGluZywgZ2V0IHRoZSBjb3JyZWN0IHBvc2l0aW9uIG9mIHRoZSBpbWFnZSwgcmF0aGVyIHRoYW4gdGhlXG4gICAgLy8gb25lIHJvdW5kZWQgdXAgdG8gNCBwaXhlbHMuXG4gICAgdmFyIHdpZHRoID0gcmVwZWF0aW5nID8gaW1hZ2Uud2lkdGggOiByZWN0Lnc7XG4gICAgdmFyIGhlaWdodCA9IHJlcGVhdGluZyA/IGltYWdlLmhlaWdodCA6IHJlY3QuaDtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzaXplOiBbd2lkdGgsIGhlaWdodF0sXG4gICAgICAgIHRsOiBbKHJlY3QueCArIHBhZGRpbmcpICAgICAgICAgLyB0aGlzLndpZHRoLCAocmVjdC55ICsgcGFkZGluZykgICAgICAgICAgLyB0aGlzLmhlaWdodF0sXG4gICAgICAgIGJyOiBbKHJlY3QueCArIHBhZGRpbmcgKyB3aWR0aCkgLyB0aGlzLndpZHRoLCAocmVjdC55ICsgcGFkZGluZyArIGhlaWdodCkgLyB0aGlzLmhlaWdodF1cbiAgICB9O1xufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3IodGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgIHZhciBoID0gTWF0aC5mbG9vcih0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheSh3ICogaCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5TcHJpdGVBdGxhcy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRzdCwgc3JjLCB3cmFwKSB7XG4gICAgLy8gaWYgKCFzcHJpdGUtPnJhc3RlcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zcHJpdGUuaW1nLmRhdGEpIHJldHVybjtcbiAgICB2YXIgc3JjSW1nID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuc3ByaXRlLmltZy5kYXRhLmJ1ZmZlcik7XG5cbiAgICB0aGlzLmFsbG9jYXRlKCk7XG4gICAgdmFyIGRzdEltZyA9IHRoaXMuZGF0YTtcblxuICAgIHZhciBwYWRkaW5nID0gMTtcblxuICAgIGNvcHlCaXRtYXAoXG4gICAgICAgIC8qIHNvdXJjZSBidWZmZXIgKi8gIHNyY0ltZyxcbiAgICAgICAgLyogc291cmNlIHN0cmlkZSAqLyAgdGhpcy5zcHJpdGUuaW1nLndpZHRoLFxuICAgICAgICAvKiBzb3VyY2UgeCAqLyAgICAgICBzcmMueCxcbiAgICAgICAgLyogc291cmNlIHkgKi8gICAgICAgc3JjLnksXG4gICAgICAgIC8qIGRlc3QgYnVmZmVyICovICAgIGRzdEltZyxcbiAgICAgICAgLyogZGVzdCBzdHJpZGUgKi8gICAgdGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgLyogZGVzdCB4ICovICAgICAgICAgKGRzdC54ICsgcGFkZGluZykgKiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgIC8qIGRlc3QgeSAqLyAgICAgICAgIChkc3QueSArIHBhZGRpbmcpICogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAvKiBpY29uIGRpbWVuc2lvbiAqLyBzcmMud2lkdGgsXG4gICAgICAgIC8qIGljb24gZGltZW5zaW9uICovIHNyYy5oZWlnaHQsXG4gICAgICAgIC8qIHdyYXAgKi8gd3JhcFxuICAgICk7XG5cbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGUgPSBmdW5jdGlvbihzcHJpdGUpIHtcbiAgICB0aGlzLnNwcml0ZSA9IHNwcml0ZTtcbn07XG5cblNwcml0ZUF0bGFzLnByb3RvdHlwZS5hZGRJY29ucyA9IGZ1bmN0aW9uKGljb25zLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5nZXRJbWFnZShpY29uc1tpXSk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwgdGhpcy5pbWFnZXMpO1xufTtcblxuU3ByaXRlQXRsYXMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihnbCwgbGluZWFyKSB7XG4gICAgdmFyIGZpcnN0ID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXJWYWwgPSBsaW5lYXIgPyBnbC5MSU5FQVIgOiBnbC5ORUFSRVNUO1xuICAgIGlmIChmaWx0ZXJWYWwgIT09IHRoaXMuZmlsdGVyKSB7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJWYWwpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyVmFsKTtcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJWYWw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgpO1xuXG4gICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAvLyBlbnVtIHRhcmdldFxuICAgICAgICAgICAgICAgIDAsIC8vIGluZCBsZXZlbFxuICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGluZCBpbnRlcm5hbGZvcm1hdFxuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIC8vIEdMc2l6ZWkgd2lkdGhcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCAqIHRoaXMucGl4ZWxSYXRpbywgLy8gR0xzaXplaSBoZWlnaHRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbmQgYm9yZGVyXG4gICAgICAgICAgICAgICAgZ2wuUkdCQSwgLy8gZW51bSBmb3JtYXRcbiAgICAgICAgICAgICAgICBnbC5VTlNJR05FRF9CWVRFLCAvLyBlbnVtIHR5cGVcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSAvLyBPYmplY3QgZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgLy8gZW51bSB0YXJnZXRcbiAgICAgICAgICAgICAgICAwLCAvLyBpbnQgbGV2ZWxcbiAgICAgICAgICAgICAgICAwLCAvLyBpbnQgeG9mZnNldFxuICAgICAgICAgICAgICAgIDAsIC8vIGludCB5b2Zmc2V0XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCAqIHRoaXMucGl4ZWxSYXRpbywgLy8gbG9uZyB3aWR0aFxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvLCAvLyBsb25nIGhlaWdodFxuICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGVudW0gZm9ybWF0XG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSwgLy8gZW51bSB0eXBlXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikgLy8gT2JqZWN0IHBpeGVsc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAvLyBERUJVR1xuICAgICAgICBpZiAodGhpcy5jdHgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMud2lkdGggKiB0aGlzLnBpeGVsUmF0aW8sIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvKTtcbiAgICAgICAgICAgIGRhdGEuZGF0YS5zZXQobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRoaXMuZGF0YS5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnB1dEltYWdlRGF0YShkYXRhLCAwLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5iaW4uZnJlZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIHZhciBmcmVlID0gdGhpcy5iaW4uZnJlZVtrXTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VSZWN0KGZyZWUueCAqIHRoaXMucGl4ZWxSYXRpbywgZnJlZS55ICogdGhpcy5waXhlbFJhdGlvLCBmcmVlLncgKiB0aGlzLnBpeGVsUmF0aW8sIGZyZWUuaCAqIHRoaXMucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRU5EIERFQlVHXG4gICAgfVxufTtcblxuZnVuY3Rpb24gQXRsYXNJbWFnZShyZWN0LCB3aWR0aCwgaGVpZ2h0LCBzZGYpIHtcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnNkZiA9IHNkZjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbnZhciBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcbnZhciBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcbnZhciBMYXRMbmdCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZ19ib3VuZHMnKTtcbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbi8qKlxuICogT3B0aW9ucyBjb21tb24gdG8gTWFwI2p1bXBUbywgTWFwI2Vhc2VUbywgYW5kIE1hcCNmbHlUbywgY29udHJvbGxpbmcgdGhlIGRlc3RpbmF0aW9uXG4gKiBsb2NhdGlvbiwgem9vbSBsZXZlbCwgYmVhcmluZyBhbmQgcGl0Y2guIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25zOyB1bnNwZWNpZmllZFxuICogb3B0aW9ucyB3aWxsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoYXQgcHJvcGVydHkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FtZXJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtBcnJheX0gY2VudGVyIExhdGl0dWRlIGFuZCBsb25naXR1ZGUgKHBhc3NlZCBhcyBgW2xhdCwgbG5nXWApXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBNYXAgem9vbSBsZXZlbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgTWFwIHJvdGF0aW9uIGJlYXJpbmcgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGl0Y2ggVGhlIGFuZ2xlIGF0IHdoaWNoIHRoZSBjYW1lcmEgaXMgbG9va2luZyBhdCB0aGUgZ3JvdW5kXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byBtYXAgbW92ZW1lbnQgbWV0aG9kcyB0aGF0IGludm9sdmUgYW5pbWF0aW9uLCBzdWNoIGFzIE1hcCNwYW5CeSBhbmRcbiAqIE1hcCNlYXNlVG8sIGNvbnRyb2xsaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uIEFsbCBwcm9wZXJ0aWVzXG4gKiBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5pbWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIE51bWJlciBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVhc2luZ1xuICogQHByb3BlcnR5IHtBcnJheX0gb2Zmc2V0IHBvaW50LCBvcmlnaW4gb2YgbW92ZW1lbnQgcmVsYXRpdmUgdG8gbWFwIGNlbnRlclxuICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRlIFdoZW4gc2V0IHRvIGZhbHNlLCBubyBhbmltYXRpb24gaGFwcGVuc1xuICovXG5cbnZhciBDYW1lcmEgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge307XG5cbnV0aWwuZXh0ZW5kKENhbWVyYS5wcm90b3R5cGUsIC8qKiBAbGVuZHMgTWFwLnByb3RvdHlwZSAqL3tcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdmlldyBnZW9ncmFwaGljYWwgcG9pbnQuXG4gICAgICogQHJldHVybnMge0xhdExuZ31cbiAgICAgKi9cbiAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uY2VudGVyOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCBsb2NhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGNlbnRlciBMYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIChwYXNzZWQgYXMgYFtsYXQsIGxuZ11gKVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldENlbnRlcihbLTc0LCAzOF0pO1xuICAgICAqL1xuICAgIHNldENlbnRlcjogZnVuY3Rpb24oY2VudGVyKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFuIGJ5IGEgY2VydGFpbiBudW1iZXIgb2YgcGl4ZWxzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvZmZzZXQgW3gsIHldXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBwYW5CeTogZnVuY3Rpb24ob2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLCB1dGlsLmV4dGVuZCh7b2Zmc2V0OiBQb2ludC5jb252ZXJ0KG9mZnNldCkubXVsdCgtMSl9LCBvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYW4gdG8gYSBjZXJ0YWluIGxvY2F0aW9uIHdpdGggZWFzaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGF0bG5nIGEgYExhdExuZ2Agb2JqZWN0XG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBwYW5UbzogZnVuY3Rpb24obGF0bG5nLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGxhdGxuZyA9IExhdExuZy5jb252ZXJ0KGxhdGxuZyk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IHV0aWwuZWFzZSxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkucm90YXRlKC10ci5hbmdsZSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QobGF0bG5nKS5zdWIob2Zmc2V0KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubm9Nb3ZlU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lYXNlKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IHRyLnVucHJvamVjdChmcm9tLmFkZCh0by5zdWIoZnJvbSkubXVsdChrKSkpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB6b29tXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRab29tOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFwIHpvb20uIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tIE1hcCB6b29tIGxldmVsXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgdG8gNVxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb206IGZ1bmN0aW9uKHpvb20pIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb206IHpvb219KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRvIGEgY2VydGFpbiB6b29tIGxldmVsIHdpdGggZWFzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21UbzogZnVuY3Rpb24oem9vbSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgZHVyYXRpb246IDUwMFxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBvcHRpb25zLmVhc2luZyA9IHRoaXMuX3VwZGF0ZUVhc2luZyhvcHRpb25zLmR1cmF0aW9uLCB6b29tLCBvcHRpb25zLmVhc2luZyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBhcm91bmQgPSB0ci5jZW50ZXIsXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0ci56b29tO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuXG4gICAgICAgIGlmICghdGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgdHIuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShzdGFydFpvb20sIHpvb20sIGspLCBhcm91bmQpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJykuZmlyZSgnem9vbScpO1xuICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZWFzZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kdXJhdGlvbiA+PSAyMDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24gPCAyMDApIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9vblpvb21FbmQpO1xuICAgICAgICAgICAgdGhpcy5fb25ab29tRW5kID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMjAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIGluIGJ5IDEgbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbUluOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBab29tIG91dCBieSAxIGxldmVsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21PdXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgLSAxLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGJlYXJpbmcgaW4gZGVncmVlc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QmVhcmluZzogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nOyB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1hcCByb3RhdGlvbi4gRXF1aXZhbGVudCB0byBganVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgTWFwIHJvdGF0aW9uIGJlYXJpbmcgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByb3RhdGUgdGhlIG1hcCB0byA5MCBkZWdyZWVzXG4gICAgICogbWFwLnNldEJlYXJpbmcoOTApO1xuICAgICAqL1xuICAgIHNldEJlYXJpbmc6IGZ1bmN0aW9uKGJlYXJpbmcpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBiZWFyaW5nIGJ5IGEgY2VydGFpbiBudW1iZXIgb2YgZGVncmVlcyB3aXRoIGVhc2luZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmdcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJvdGF0ZVRvOiBmdW5jdGlvbihiZWFyaW5nLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgYXJvdW5kID0gdHIuY2VudGVyO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmVhcmluZyA9IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZywgc3RhcnQpO1xuXG4gICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpcmUoJ21vdmVzdGFydCcpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgdHIuc2V0QmVhcmluZ0Fyb3VuZChpbnRlcnBvbGF0ZShzdGFydCwgYmVhcmluZywgayksIGFyb3VuZCk7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnKS5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgbWFwIGJlYXJpbmcgdG8gMCAobm9ydGgpIHdpdGggZWFzaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGg6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5yb3RhdGVUbygwLCB1dGlsLmV4dGVuZCh7ZHVyYXRpb246IDEwMDB9LCBvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbmltYXRlcyBtYXAgYmVhcmluZyB0byAwIChub3J0aCkgaWYgaXQncyBhbHJlYWR5IGNsb3NlIHRvIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzbmFwVG9Ob3J0aDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5vcHRpb25zLmJlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNldE5vcnRoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYW5nbGUgaW4gZGVncmVlc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UGl0Y2g6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFwIGFuZ2xlLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaXRjaCBUaGUgYW5nbGUgYXQgd2hpY2ggdGhlIGNhbWVyYSBpcyBsb29raW5nIGF0IHRoZSBncm91bmRcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQaXRjaDogZnVuY3Rpb24ocGl0Y2gpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3BpdGNoOiBwaXRjaH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBab29tIHRvIGNvbnRhaW4gY2VydGFpbiBnZW9ncmFwaGljYWwgYm91bmRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBib3VuZHMgW1ttaW5MYXQsIG1pbkxuZ10sIFttYXhMYXQsIG1heExuZ11dXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc3BlZWQ9MS4yXSBIb3cgZmFzdCBhbmltYXRpb24gb2NjdXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmN1cnZlPTEuNDJdIEhvdyBtdWNoIHpvb21pbmcgb3V0IG9jY3VycyBkdXJpbmcgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5lYXNpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5wYWRkaW5nIGhvdyBtdWNoIHBhZGRpbmcgdGhlcmUgaXMgYXJvdW5kIHRoZSBnaXZlbiBib3VuZHMgb24gZWFjaCBzaWRlIGluIHBpeGVsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heFpvb21cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBmaXRCb3VuZHM6IGZ1bmN0aW9uKGJvdW5kcywgb3B0aW9ucykge1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBtYXhab29tOiBJbmZpbml0eVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBib3VuZHMgPSBMYXRMbmdCb3VuZHMuY29udmVydChib3VuZHMpO1xuXG4gICAgICAgIHZhciBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBudyA9IHRyLnByb2plY3QoYm91bmRzLmdldE5vcnRoV2VzdCgpKSxcbiAgICAgICAgICAgIHNlID0gdHIucHJvamVjdChib3VuZHMuZ2V0U291dGhFYXN0KCkpLFxuICAgICAgICAgICAgc2l6ZSA9IHNlLnN1YihudyksXG4gICAgICAgICAgICBzY2FsZVggPSAodHIud2lkdGggLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LngpICogMikgLyBzaXplLngsXG4gICAgICAgICAgICBzY2FsZVkgPSAodHIuaGVpZ2h0IC0gb3B0aW9ucy5wYWRkaW5nICogMiAtIE1hdGguYWJzKG9mZnNldC55KSAqIDIpIC8gc2l6ZS55O1xuXG4gICAgICAgIG9wdGlvbnMuY2VudGVyID0gdHIudW5wcm9qZWN0KG53LmFkZChzZSkuZGl2KDIpKTtcbiAgICAgICAgb3B0aW9ucy56b29tID0gTWF0aC5taW4odHIuc2NhbGVab29tKHRyLnNjYWxlICogTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSwgb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgb3B0aW9ucy5iZWFyaW5nID0gMDtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5saW5lYXIgP1xuICAgICAgICAgICAgdGhpcy5lYXNlVG8ob3B0aW9ucykgOlxuICAgICAgICAgICAgdGhpcy5mbHlUbyhvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgd2l0aG91dFxuICAgICAqIGEgdHJhbnNpdGlvbi4gVGhlIG1hcCB3aWxsIHJldGFpbiB0aGUgY3VycmVudCB2YWx1ZXMgZm9yIGFueSBvcHRpb25zXG4gICAgICogbm90IGluY2x1ZGVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9uc30gb3B0aW9ucyBtYXAgdmlldyBvcHRpb25zXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAganVtcFRvOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIHZhciB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICAgIGJlYXJpbmdDaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoJ2NlbnRlcicgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgdHIuY2VudGVyID0gTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5jZW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdiZWFyaW5nJyBpbiBvcHRpb25zICYmIHRyLmJlYXJpbmcgIT09ICtvcHRpb25zLmJlYXJpbmcpIHtcbiAgICAgICAgICAgIGJlYXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLmJlYXJpbmcgPSArb3B0aW9ucy5iZWFyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdwaXRjaCcgaW4gb3B0aW9ucyAmJiB0ci5waXRjaCAhPT0gK29wdGlvbnMucGl0Y2gpIHtcbiAgICAgICAgICAgIHBpdGNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5waXRjaCA9ICtvcHRpb25zLnBpdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnKTtcblxuICAgICAgICBpZiAoem9vbUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlYXJpbmdDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpdGNoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdwaXRjaCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZSgnbW92ZWVuZCcpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFYXNpbmcgYW5pbWF0aW9uIHRvIGEgc3BlY2lmaWVkIGxvY2F0aW9uL3pvb20vYmVhcmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zfkFuaW1hdGlvbk9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgYW5kIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgZWFzZVRvOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IHV0aWwuZWFzZVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpLnJvdGF0ZSgtdHIuYW5nbGUpLFxuICAgICAgICAgICAgZnJvbSA9IHRyLnBvaW50LFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoLFxuXG4gICAgICAgICAgICBzY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKSxcbiAgICAgICAgICAgIHRvID0gJ2NlbnRlcicgaW4gb3B0aW9ucyA/IHRyLnByb2plY3QoTGF0TG5nLmNvbnZlcnQob3B0aW9ucy5jZW50ZXIpKS5zdWIob2Zmc2V0LmRpdihzY2FsZSkpIDogZnJvbSxcbiAgICAgICAgICAgIGFyb3VuZCA9IExhdExuZy5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcblxuICAgICAgICBpZiAoem9vbSAhPT0gc3RhcnRab29tKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuem9vbWluZyAmJiAhYXJvdW5kKSB7XG4gICAgICAgICAgICBhcm91bmQgPSB0ci5wb2ludExvY2F0aW9uKHRyLmNlbnRlclBvaW50LmFkZCh0by5zdWIoZnJvbSkuZGl2KDEgLSAxIC8gc2NhbGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ21vdmVzdGFydCcpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRab29tQXJvdW5kKGludGVycG9sYXRlKHN0YXJ0Wm9vbSwgem9vbSwgayksIGFyb3VuZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLmNlbnRlciA9IHRyLnVucHJvamVjdChmcm9tLmFkZCh0by5zdWIoZnJvbSkubXVsdChrKSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJyk7XG4gICAgICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncm90YXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZseWluZyBhbmltYXRpb24gdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24vem9vbS9iZWFyaW5nIHdpdGggYXV0b21hdGljIGN1cnZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnN9IG9wdGlvbnMgbWFwIHZpZXcgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIEhvdyBmYXN0IGFuaW1hdGlvbiBvY2N1cnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY3VydmU9MS40Ml0gSG93IG11Y2ggem9vbWluZyBvdXQgb2NjdXJzIGR1cmluZyBhbmltYXRpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgIHpvb206IDksXG4gICAgICogICBzcGVlZDogMC4yLFxuICAgICAqICAgY3VydmU6IDEsXG4gICAgICogICBlYXNpbmc6IGZ1bmN0aW9uKHQpIHtcbiAgICAgKiAgICAgcmV0dXJuIHQ7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZmx5VG86IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCk7XG5cbiAgICAgICAgdmFyIGNlbnRlciA9ICdjZW50ZXInIGluIG9wdGlvbnMgPyBMYXRMbmcuY29udmVydChvcHRpb25zLmNlbnRlcikgOiB0aGlzLmdldENlbnRlcigpO1xuICAgICAgICB2YXIgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gICtvcHRpb25zLnpvb20gOiBzdGFydFpvb207XG4gICAgICAgIHZhciBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcblxuICAgICAgICB2YXIgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICBmcm9tID0gdHIucG9pbnQsXG4gICAgICAgICAgICB0byA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIob2Zmc2V0LmRpdihzY2FsZSkpO1xuXG4gICAgICAgIHZhciBzdGFydFdvcmxkU2l6ZSA9IHRyLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIHJobyA9IG9wdGlvbnMuY3VydmUsXG4gICAgICAgICAgICBWID0gb3B0aW9ucy5zcGVlZCxcblxuICAgICAgICAgICAgdzAgPSBNYXRoLm1heCh0ci53aWR0aCwgdHIuaGVpZ2h0KSxcbiAgICAgICAgICAgIHcxID0gdzAgLyBzY2FsZSxcbiAgICAgICAgICAgIHUxID0gdG8uc3ViKGZyb20pLm1hZygpLFxuICAgICAgICAgICAgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICBmdW5jdGlvbiByKGkpIHtcbiAgICAgICAgICAgIHZhciBiID0gKHcxICogdzEgLSB3MCAqIHcwICsgKGkgPyAtMSA6IDEpICogcmhvMiAqIHJobzIgKiB1MSAqIHUxKSAvICgyICogKGkgPyB3MSA6IHcwKSAqIHJobzIgKiB1MSk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGIgKiBiICsgMSkgLSBiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNpbmgobikgeyByZXR1cm4gKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gY29zaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgKyBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiB0YW5oKG4pIHsgcmV0dXJuIHNpbmgobikgLyBjb3NoKG4pOyB9XG5cbiAgICAgICAgdmFyIHIwID0gcigwKSxcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gKGNvc2gocjApIC8gY29zaChyMCArIHJobyAqIHMpKTsgfSxcbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gdzAgKiAoKGNvc2gocjApICogdGFuaChyMCArIHJobyAqIHMpIC0gc2luaChyMCkpIC8gcmhvMikgLyB1MTsgfSxcbiAgICAgICAgICAgIFMgPSAocigxKSAtIHIwKSAvIHJobztcblxuICAgICAgICBpZiAoTWF0aC5hYnModTEpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcztcblxuICAgICAgICAgICAgdmFyIGsgPSB3MSA8IHcwID8gLTEgOiAxO1xuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcblxuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMTAwMCAqIFMgLyBWO1xuXG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0Jyk7XG5cbiAgICAgICAgdGhpcy5fZWFzZShmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgdmFyIHMgPSBrICogUyxcbiAgICAgICAgICAgICAgICB1cyA9IHUocyk7XG5cbiAgICAgICAgICAgIHRyLnpvb20gPSBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oMSAvIHcocykpO1xuICAgICAgICAgICAgdHIuY2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKHRvLnN1Yihmcm9tKS5tdWx0KHVzKSksIHN0YXJ0V29ybGRTaXplKTtcblxuICAgICAgICAgICAgaWYgKGJlYXJpbmcgIT09IHN0YXJ0QmVhcmluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnKS5maXJlKCd6b29tJyk7XG4gICAgICAgICAgICBpZiAoYmVhcmluZyAhPT0gc3RhcnRCZWFyaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyb3RhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW92ZWVuZCcpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgaXNFYXNpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hYm9ydEZuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Fib3J0Rm4pIHtcbiAgICAgICAgICAgIHRoaXMuX2Fib3J0Rm4uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaEVhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2Vhc2U6IGZ1bmN0aW9uKGZyYW1lLCBmaW5pc2gsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZmluaXNoRm4gPSBmaW5pc2g7XG4gICAgICAgIHRoaXMuX2Fib3J0Rm4gPSBicm93c2VyLnRpbWVkKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBmcmFtZS5jYWxsKHRoaXMsIG9wdGlvbnMuZWFzaW5nKHQpKTtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoRWFzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlID8gMCA6IG9wdGlvbnMuZHVyYXRpb24sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfZmluaXNoRWFzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9hYm9ydEZuO1xuICAgICAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uIG1pZ2h0IGVtaXQgZXZlbnRzIHdoaWNoIHRyaWdnZXIgbmV3IGVhc2VzLCB3aGljaFxuICAgICAgICAvLyBzZXQgYSBuZXcgX2ZpbmlzaEZuLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgdmFyIGZpbmlzaCA9IHRoaXMuX2ZpbmlzaEZuO1xuICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoRm47XG4gICAgICAgIGZpbmlzaC5jYWxsKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvLyBjb252ZXJ0IGJlYXJpbmcgc28gdGhhdCBpdCdzIG51bWVyaWNhbGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IGl0IGludGVycG9sYXRlcyBwcm9wZXJseVxuICAgIF9ub3JtYWxpemVCZWFyaW5nOiBmdW5jdGlvbihiZWFyaW5nLCBjdXJyZW50QmVhcmluZykge1xuICAgICAgICBiZWFyaW5nID0gdXRpbC53cmFwKGJlYXJpbmcsIC0xODAsIDE4MCk7XG4gICAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoYmVhcmluZyAtIGN1cnJlbnRCZWFyaW5nKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgLSAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nIC09IDM2MDtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcbiAgICAgICAgcmV0dXJuIGJlYXJpbmc7XG4gICAgfSxcblxuICAgIF91cGRhdGVFYXNpbmc6IGZ1bmN0aW9uKGR1cmF0aW9uLCB6b29tLCBiZXppZXIpIHtcbiAgICAgICAgdmFyIGVhc2luZztcblxuICAgICAgICBpZiAodGhpcy5lYXNlKSB7XG4gICAgICAgICAgICB2YXIgZWFzZSA9IHRoaXMuZWFzZSxcbiAgICAgICAgICAgICAgICB0ID0gKERhdGUubm93KCkgLSBlYXNlLnN0YXJ0KSAvIGVhc2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBlYXNlLmVhc2luZyh0ICsgMC4wMSkgLSBlYXNlLmVhc2luZyh0KSxcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbWFrZSBuZXcgYmV6aWVyIHRoYXQgaXMgY29udGludW91cyB3aXRoIGxhc3RcbiAgICAgICAgICAgICAgICB4ID0gMC4yNyAvIE1hdGguc3FydChzcGVlZCAqIHNwZWVkICsgMC4wMDAxKSAqIDAuMDEsXG4gICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCgwLjI3ICogMC4yNyAtIHggKiB4KTtcblxuICAgICAgICAgICAgZWFzaW5nID0gdXRpbC5iZXppZXIoeCwgeSwgMC4yNSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlYXNpbmcgPSBiZXppZXIgPyB1dGlsLmJlemllci5hcHBseSh1dGlsLCBiZXppZXIpIDogdXRpbC5lYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RvcmUgaW5mb3JtYXRpb24gb24gY3VycmVudCBlYXNpbmdcbiAgICAgICAgdGhpcy5lYXNlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXG4gICAgICAgICAgICB0bzogTWF0aC5wb3coMiwgem9vbSksXG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IGVhc2luZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBlYXNpbmc7XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb250cm9sID0gcmVxdWlyZSgnLi9jb250cm9sJyk7XG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRpb247XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdHRyaWJ1dGlvbiBjb250cm9sXG4gKiBAY2xhc3MgQXR0cmlidXRpb25cbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuQXR0cmlidXRpb24oKSk7XG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0aW9uKCkge31cblxuQXR0cmlidXRpb24ucHJvdG90eXBlID0gdXRpbC5pbmhlcml0KENvbnRyb2wsIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0J1xuICAgIH0sXG5cbiAgICBvbkFkZDogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybC1hdHRyaWInLFxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgY2xhc3NOYW1lLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICBtYXAub24oJ3NvdXJjZS5sb2FkJywgdGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO1xuICAgICAgICBtYXAub24oJ3NvdXJjZS5jaGFuZ2UnLCB0aGlzLl91cGRhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIG1hcC5vbignc291cmNlLnJlbW92ZScsIHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmsuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGlvbnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fbWFwLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9tYXAuc3R5bGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5hdHRyaWJ1dGlvbiAmJiBhdHRyaWJ1dGlvbnMuaW5kZXhPZihzb3VyY2UuYXR0cmlidXRpb24pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMucHVzaChzb3VyY2UuYXR0cmlidXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUwgPSBhdHRyaWJ1dGlvbnMuam9pbignIHwgJyk7XG4gICAgICAgIHRoaXMuX2VkaXRMaW5rID0gdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21hcGJveC1pbXByb3ZlLW1hcCcpWzBdO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlRWRpdExpbms6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdExpbmspIHtcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0TGluay5ocmVmID0gJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwLWZlZWRiYWNrLyMvJyArXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlci5sbmcgKyAnLycgKyBjZW50ZXIubGF0ICsgJy8nICsgTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBDb250cm9sO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgbWFwLXJlbGF0ZWQgaW50ZXJmYWNlIGVsZW1lbnRzLlxuICpcbiAqIEBjbGFzcyBDb250cm9sXG4gKi9cbmZ1bmN0aW9uIENvbnRyb2woKSB7fVxuXG5Db250cm9sLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgdGhpcyBjb250cm9sIHRvIHRoZSBtYXAsIHJldHVybmluZyB0aGUgY29udHJvbCBpdHNlbGZcbiAgICAgKiBmb3IgY2hhaW5pbmcuIFRoaXMgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBET00gZWxlbWVudCBpbnRvXG4gICAgICogdGhlIG1hcCdzIERPTSBlbGVtZW50IGlmIHRoZSBjb250cm9sIGhhcyBhIGBwb3NpdGlvbmAgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcFxuICAgICAqIEByZXR1cm5zIHtDb250cm9sfSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbzogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciA9IHRoaXMub25BZGQobWFwKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgICAgICB2YXIgY29ybmVyID0gbWFwLl9jb250cm9sQ29ybmVyc1twb3NdO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSAnIG1hcGJveGdsLWN0cmwnO1xuICAgICAgICAgICAgaWYgKHBvcy5pbmRleE9mKCdib3R0b20nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3JuZXIuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgY29ybmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3JuZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhpcyBjb250cm9sIGZyb20gdGhlIG1hcCBpdCBoYXMgYmVlbiBhZGRlZCB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtDb250cm9sfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vblJlbW92ZSkgdGhpcy5vblJlbW92ZSh0aGlzLl9tYXApO1xuICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5hdmlnYXRpb247XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5hdmlnYXRpb24gY29udHJvbCB3aXRoIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzXG4gKiBAY2xhc3MgTmF2aWdhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBvc2l0aW9uPXRvcC1yaWdodF0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgY29udHJvbCdzIHBvc2l0aW9uIG9uIHRoZSBtYXAuIE9wdGlvbnMgYXJlIGB0b3AtcmlnaHRgLCBgdG9wLWxlZnRgLCBgYm90dG9tLXJpZ2h0YCwgYGJvdHRvbS1sZWZ0YFxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uKHtwb3NpdGlvbjogJ3RvcC1sZWZ0J30pKTsgLy8gcG9zaXRpb24gaXMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTmF2aWdhdGlvbihvcHRpb25zKSB7XG4gICAgdXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5OYXZpZ2F0aW9uLnByb3RvdHlwZSA9IHV0aWwuaW5oZXJpdChDb250cm9sLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBwb3NpdGlvbjogJ3RvcC1yaWdodCdcbiAgICB9LFxuXG4gICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBjbGFzc05hbWUgKyAnLWdyb3VwJywgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20taW4nLCBtYXAuem9vbUluLmJpbmQobWFwKSk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lICsgJy1pY29uICcgKyBjbGFzc05hbWUgKyAnLXpvb20tb3V0JywgbWFwLnpvb21PdXQuYmluZChtYXApKTtcbiAgICAgICAgdGhpcy5fY29tcGFzcyA9IHRoaXMuX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWUgKyAnLWNvbXBhc3MnLCBtYXAucmVzZXROb3J0aC5iaW5kKG1hcCkpO1xuXG4gICAgICAgIHZhciBjb21wYXNzQ2FudmFzID0gdGhpcy5fY29tcGFzc0NhbnZhcyA9IERPTS5jcmVhdGUoJ2NhbnZhcycsIGNsYXNzTmFtZSArICctY29tcGFzcy1jYW52YXMnLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgY29tcGFzc0NhbnZhcy5zdHlsZS5jc3NUZXh0ID0gJ3dpZHRoOjMwcHg7IGhlaWdodDozMHB4Oyc7XG4gICAgICAgIGNvbXBhc3NDYW52YXMud2lkdGggPSAyNiAqIDI7XG4gICAgICAgIGNvbXBhc3NDYW52YXMuaGVpZ2h0ID0gMjYgKiAyO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Db21wYXNzRG93bi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzTW92ZSA9IHRoaXMuX29uQ29tcGFzc01vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25Db21wYXNzVXAgPSB0aGlzLl9vbkNvbXBhc3NVcC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2NvbXBhc3NDdHggPSBjb21wYXNzQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX2RyYXdOb3J0aCgpO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfSxcblxuICAgIF9vbkNvbXBhc3NEb3duOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uQ29tcGFzc01vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Db21wYXNzVXApO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcblxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG5cbiAgICBfb25Db21wYXNzTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgeCA9IGUuc2NyZWVuWCxcbiAgICAgICAgICAgIGQgPSB4IDwgMiA/IC01IDogLy8gbGVmdCBlZGdlIG9mIHRoZSBzY3JlZW4sIGNvbnRpbnVlIHJvdGF0aW5nXG4gICAgICAgICAgICAgICAgeCA+IHdpbmRvdy5zY3JlZW4ud2lkdGggLSAyID8gNSA6IC8vIHJpZ2h0IGVkZ2VcbiAgICAgICAgICAgICAgICAoeCAtIHRoaXMuX3ByZXZYKSAvIDQ7XG5cbiAgICAgICAgdGhpcy5fbWFwLnNldEJlYXJpbmcodGhpcy5fbWFwLmdldEJlYXJpbmcoKSAtIGQpO1xuICAgICAgICB0aGlzLl9wcmV2WCA9IGUuc2NyZWVuWDtcbiAgICAgICAgdGhpcy5fbW92ZWQgPSB0cnVlO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX29uQ29tcGFzc1VwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Db21wYXNzTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbkNvbXBhc3NVcCk7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21hcC5zbmFwVG9Ob3J0aCgpO1xuICAgIH0sXG5cbiAgICBfY3JlYXRlQnV0dG9uOiBmdW5jdGlvbihjbGFzc05hbWUsIGZuKSB7XG4gICAgICAgIHZhciBhID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgY2xhc3NOYW1lLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGZuKCk7IH0pO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9LFxuXG4gICAgX2RyYXdOb3J0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByYWQgPSAyMCxcbiAgICAgICAgICAgIHdpZHRoID0gOCxcbiAgICAgICAgICAgIGNlbnRlciA9IDI2LFxuICAgICAgICAgICAgYW5nbGUgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICsgKE1hdGguUEkgLyAyKSxcbiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2NvbXBhc3NDdHg7XG5cbiAgICAgICAgdGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCA9IHRoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg7XG5cbiAgICAgICAgY3R4LnRyYW5zbGF0ZShjZW50ZXIsIGNlbnRlcik7XG4gICAgICAgIGN0eC5yb3RhdGUoYW5nbGUpO1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJztcbiAgICAgICAgY3R4LmxpbmVUbygwLCAtd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKC1yYWQsIDApO1xuICAgICAgICBjdHgubGluZVRvKDAsIHdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2JiYic7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgd2lkdGgpO1xuICAgICAgICBjdHgubGluZVRvKHJhZCwgMCk7XG4gICAgICAgIGN0eC5saW5lVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjZmZmJztcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDQ7XG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgLXdpZHRoKTtcbiAgICAgICAgY3R4LmxpbmVUbygwLCB3aWR0aCk7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyksXG4gICAgTGF0TG5nQm91bmRzID0gcmVxdWlyZSgnLi4vLi4vZ2VvL2xhdF9sbmdfYm91bmRzJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJveFpvb207XG5cblxuZnVuY3Rpb24gQm94Wm9vbShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgdGhpcy5fY29udGFpbmVyID0gbWFwLmdldENvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkJveFpvb20ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duKTtcbiAgICB9LFxuXG4gICAgX29uTW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5zaGlmdEtleSB8fCAoZS53aGljaCA9PT0gMSAmJiBlLmJ1dHRvbiA9PT0gMSkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5fYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtYm94em9vbScsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3Jvc3NoYWlyJyk7XG5cbiAgICAgICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZSgnYm94em9vbXN0YXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluWCA9IE1hdGgubWluKHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKHAwLnksIHAxLnkpLFxuICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KHAwLnksIHAxLnkpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fYm94LCAndHJhbnNsYXRlKCcgKyBtaW5YICsgJ3B4LCcgKyBtaW5ZICsgJ3B4KScpO1xuXG4gICAgICAgIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IChtYXhYIC0gbWluWCkgKyAncHgnO1xuICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gKG1heFkgLSBtaW5ZKSArICdweCc7XG4gICAgfSxcblxuICAgIF9vbk1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpLFxuICAgICAgICAgICAgYm91bmRzID0gbmV3IExhdExuZ0JvdW5kcyh0aGlzLl9tYXAudW5wcm9qZWN0KHAwKSwgdGhpcy5fbWFwLnVucHJvamVjdChwMSkpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuXG4gICAgICAgIHRoaXMuX21hcFxuICAgICAgICAgICAgLmZpdEJvdW5kcyhib3VuZHMsIHtsaW5lYXI6IHRydWV9KVxuICAgICAgICAgICAgLmZpcmUoJ2JveHpvb21lbmQnLCB7Ym94Wm9vbUJvdW5kczogYm91bmRzfSk7XG4gICAgfSxcblxuICAgIF9vbktleURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKCdib3h6b29tY2FuY2VsJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZpbmlzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2JveCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuXG4gICAgICAgIHRoaXMuX2JveC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JveCk7XG4gICAgICAgIHRoaXMuX2JveCA9IG51bGw7XG5cbiAgICAgICAgRE9NLmVuYWJsZURyYWcoKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvdWJsZUNsaWNrWm9vbTtcblxuZnVuY3Rpb24gRG91YmxlQ2xpY2tab29tKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl9vbkRibENsaWNrID0gdGhpcy5fb25EYmxDbGljay5iaW5kKHRoaXMpO1xufVxuXG5Eb3VibGVDbGlja1pvb20ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fb25EYmxDbGljayk7XG4gICAgfSxcblxuICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9vbkRibENsaWNrKTtcbiAgICB9LFxuXG4gICAgX29uRGJsQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX21hcC56b29tVG8oTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSArIDEsIHthcm91bmQ6IGUubGF0TG5nfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdQYW47XG5cblxudmFyIGluZXJ0aWFMaW5lYXJpdHkgPSAwLjI1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSB1dGlsLmJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAzMDAwLCAvLyBweC9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDQwMDA7IC8vIHB4L3NeMlxuXG5cbmZ1bmN0aW9uIERyYWdQYW4obWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkRyYWdQYW4ucHJvdG90eXBlID0ge1xuICAgIGVuYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uRG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uRG93bik7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vbkRvd24pO1xuICAgIH0sXG5cbiAgICBfb25Eb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX3BvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG5cbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtbRGF0ZS5ub3coKSwgdGhpcy5fcG9zXV07XG5cbiAgICAgICAgaWYgKCFlLnRvdWNoZXMpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25Nb3ZlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAobWFwLmJveFpvb20uYWN0aXZlIHx8IG1hcC5kcmFnUm90YXRlLmFjdGl2ZSB8fCAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGluZXJ0aWEucHVzaChbbm93LCBwb3NdKTtcbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMiAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gNTApIGluZXJ0aWEuc2hpZnQoKTtcblxuICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICBtYXAudHJhbnNmb3JtLnNldExvY2F0aW9uQXRQb2ludChtYXAudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odGhpcy5fcG9zKSwgcG9zKTtcbiAgICAgICAgbWFwLmZpcmUoJ21vdmUnKTtcblxuICAgICAgICB0aGlzLl9wb3MgPSBwb3M7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25VcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgZmxpbmdPZmZzZXQgPSBsYXN0WzFdLnN1YihmaXJzdFsxXSksXG4gICAgICAgICAgICBmbGluZ0R1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwLFxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcHgvcyB2ZWxvY2l0eSAmIGFkanVzdCBmb3IgaW5jcmVhc2VkIGluaXRpYWwgYW5pbWF0aW9uIHNwZWVkIHdoZW4gZWFzaW5nIG91dFxuICAgICAgICAgICAgdmVsb2NpdHkgPSBmbGluZ09mZnNldC5tdWx0KGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKSxcbiAgICAgICAgICAgIHNwZWVkID0gdmVsb2NpdHkubWFnKCk7IC8vIHB4L3NcblxuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChzcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHVyYXRpb24gPSBzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICBvZmZzZXQgPSB2ZWxvY2l0eS5tdWx0KC1kdXJhdGlvbiAvIDIpO1xuXG4gICAgICAgIHRoaXMuX21hcC5wYW5CeShvZmZzZXQsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX29uTW91c2VVcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9vblVwKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIF9vblRvdWNoRW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX29uVXAoKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5JyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdSb3RhdGU7XG5cblxuZnVuY3Rpb24gRHJhZ1JvdGF0ZShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICB1dGlsLmJpbmRIYW5kbGVycyh0aGlzKTtcbn1cblxuRHJhZ1JvdGF0ZS5wcm90b3R5cGUgPSB7XG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fb25Db250ZXh0TWVudSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fb25Db250ZXh0TWVudSk7XG4gICAgfSxcblxuICAgIF9vbkNvbnRleHRNZW51OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9tYXAuc3RvcCgpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgdmFyIHAwID0gdGhpcy5fc3RhcnRQb3MsXG4gICAgICAgICAgICBwMSA9IHRoaXMuX3BvcyxcbiAgICAgICAgICAgIHAyID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKSxcblxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgY2VudGVyID0gbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludCwgLy8gQ2VudGVyIG9mIHJvdGF0aW9uXG4gICAgICAgICAgICBzdGFydFRvQ2VudGVyID0gcDAuc3ViKGNlbnRlciksXG4gICAgICAgICAgICBzdGFydFRvQ2VudGVyRGlzdCA9IHN0YXJ0VG9DZW50ZXIubWFnKCk7XG5cbiAgICAgICAgaWYgKCFtYXAucm90YXRpbmcpIHtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3Zlc3RhcnQnKTtcbiAgICAgICAgICAgIG1hcC5yb3RhdGluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2xpY2sgd2FzIHRvbyBjbG9zZSB0byB0aGUgY2VudGVyLCBtb3ZlIHRoZSBjZW50ZXIgb2Ygcm90YXRpb24gYnkgMjAwIHBpeGVsc1xuICAgICAgICAvLyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjbGljay5cbiAgICAgICAgaWYgKHN0YXJ0VG9DZW50ZXJEaXN0IDwgMjAwKSB7XG4gICAgICAgICAgICBjZW50ZXIgPSBwMC5hZGQobmV3IFBvaW50KC0yMDAsIDApLl9yb3RhdGUoc3RhcnRUb0NlbnRlci5hbmdsZSgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVhcmluZ0RpZmYgPSBwMS5zdWIoY2VudGVyKS5hbmdsZVdpdGgocDIuc3ViKGNlbnRlcikpIC8gTWF0aC5QSSAqIDE4MDtcbiAgICAgICAgbWFwLnRyYW5zZm9ybS5iZWFyaW5nID0gbWFwLmdldEJlYXJpbmcoKSAtIGJlYXJpbmdEaWZmO1xuXG4gICAgICAgIG1hcC5maXJlKCdtb3ZlJykuZmlyZSgncm90YXRlJyk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fcG9zID0gcDI7XG4gICAgfSxcblxuICAgIF9vblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICBtYXAucm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgbWFwLnNuYXBUb05vcnRoKCk7XG5cbiAgICAgICAgaWYgKCFtYXAucm90YXRpbmcpIHtcbiAgICAgICAgICAgIG1hcC5fcmVyZW5kZXIoKTtcbiAgICAgICAgICAgIG1hcC5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uTW91c2VVcDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleWJvYXJkO1xuXG5cbnZhciBwYW5EZWx0YSA9IDgwLFxuICAgIHJvdGF0ZURlbHRhID0gMjtcblxuLyoqXG4gKiBUaGUgYEtleWJvYXJkYCBoYW5kbGVyIHJlc3BvbmRzIHRvIGtleWJvYXJkIGlucHV0IGJ5IHpvb21pbmcsIHJvdGF0aW5nLCBvciBwYW5uaW5nIHRoZVxuICogbWFwLiBUaGUgZm9sbG93aW5nIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgc3VwcG9ydGVkOlxuICogICogYD1gIC8gYCtgOiBpbmNyZWFzZSB6b29tIGxldmVsIGJ5IDFcbiAqICAqIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogaW5jcmVhc2Ugem9vbSBsZXZlbCBieSAyXG4gKiAgKiBgLWA6IGRlY3JlYXNlIHpvb20gbGV2ZWwgYnkgMVxuICogICogYFNoaWZ0LS1gOiBkZWNyZWFzZSB6b29tIGxldmVsIGJ5IDJcbiAqICAqIEFycm93IGtleXM6IHBhbiBieSA4MCBwaXhlbHNcbiAqICAqIGBTaGlmdCvih6JgOiBpbmNyZWFzZSByb3RhdGlvbiBieSAyIGRlZ3JlZXNcbiAqICAqIGBTaGlmdCvih6BgOiBkZWNyZWFzZSByb3RhdGlvbiBieSAyIGRlZ3JlZXNcbiAqIEBjbGFzcyBLZXlib2FyZFxuICogQGV4YW1wbGVcbiAqICAgLy8gRGlzYWJsZSB0aGUga2V5Ym9hcmQgaGFuZGxlclxuICogICBtYXAua2V5Ym9hcmQuZGlzYWJsZSgpO1xuICogQGV4YW1wbGVcbiAqICAgLy8gRW5hYmxlIHRoZSBrZXlib2FyZCBoYW5kbGVyXG4gKiAgIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAqL1xuZnVuY3Rpb24gS2V5Ym9hcmQobWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdGhpcy5fb25LZXlEb3duID0gdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyk7XG59XG5cbktleWJvYXJkLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuICAgIH0sXG5cbiAgICBfb25LZXlEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSA2MTpcbiAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgIGNhc2UgMTcxOlxuICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgIG1hcC56b29tVG8oTWF0aC5yb3VuZChtYXAuZ2V0Wm9vbSgpKSArIChlLnNoaWZ0S2V5ID8gMiA6IDEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICBtYXAuem9vbVRvKE1hdGgucm91bmQobWFwLmdldFpvb20oKSkgLSAoZS5zaGlmdEtleSA/IDIgOiAxKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBtYXAuc2V0QmVhcmluZyhtYXAuZ2V0QmVhcmluZygpIC0gcm90YXRlRGVsdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXAucGFuQnkoWy1wYW5EZWx0YSwgMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgbWFwLnNldEJlYXJpbmcobWFwLmdldEJlYXJpbmcoKSArIHJvdGF0ZURlbHRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwLnBhbkJ5KFtwYW5EZWx0YSwgMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIG1hcC5wYW5CeShbMCwgLXBhbkRlbHRhXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgbWFwLnBhbkJ5KFswLCBwYW5EZWx0YV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUGluY2g7XG5cblxuZnVuY3Rpb24gUGluY2gobWFwKSB7XG4gICAgdGhpcy5fbWFwID0gbWFwO1xuICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cblBpbmNoLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uU3RhcnQsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgZGlzYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25TdGFydCk7XG4gICAgfSxcblxuICAgIF9vblN0YXJ0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRTY2FsZSA9IHRoaXMuX21hcC50cmFuc2Zvcm0uc2NhbGU7XG4gICAgICAgIHRoaXMuX3N0YXJ0QmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZztcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUsIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vbkVuZCwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBfb25Nb3ZlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pLFxuICAgICAgICAgICAgcCA9IHAwLmFkZChwMSkuZGl2KDIpLFxuICAgICAgICAgICAgdmVjID0gcDAuc3ViKHAxKSxcbiAgICAgICAgICAgIHNjYWxlID0gdmVjLm1hZygpIC8gdGhpcy5fc3RhcnRWZWMubWFnKCksXG4gICAgICAgICAgICBiZWFyaW5nID0gdmVjLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykgKiAxODAgLyBNYXRoLlBJLFxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwO1xuXG4gICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgem9vbTogbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIGJlYXJpbmc6IHRoaXMuX3N0YXJ0QmVhcmluZyArIGJlYXJpbmcsXG4gICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgIGFyb3VuZDogbWFwLnVucHJvamVjdChwKVxuICAgICAgICB9KTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcblxuICAgIF9vbkVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9tYXAuc25hcFRvTm9ydGgoKTtcblxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uRW5kKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKSxcbiAgICBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNjcm9sbFpvb207XG5cblxudmFyIHVhID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICBmaXJlZm94ID0gdWEuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMSxcbiAgICBzYWZhcmkgPSB1YS5pbmRleE9mKCdzYWZhcmknKSAhPT0gLTEgJiYgdWEuaW5kZXhPZignY2hyb20nKSA9PT0gLTE7XG5cblxuZnVuY3Rpb24gU2Nyb2xsWm9vbShtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICB1dGlsLmJpbmRIYW5kbGVycyh0aGlzKTtcbn1cblxuU2Nyb2xsWm9vbS5wcm90b3R5cGUgPSB7XG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fb25XaGVlbCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgdGhpcy5fb25XaGVlbCwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fb25XaGVlbCk7XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9vbldoZWVsKTtcbiAgICB9LFxuXG4gICAgX29uV2hlZWw6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciB2YWx1ZTtcblxuICAgICAgICBpZiAoZS50eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGUuZGVsdGFZO1xuICAgICAgICAgICAgLy8gRmlyZWZveCBkb3VibGVzIHRoZSB2YWx1ZXMgb24gcmV0aW5hIHNjcmVlbnMuLi5cbiAgICAgICAgICAgIGlmIChmaXJlZm94ICYmIGUuZGVsdGFNb2RlID09PSB3aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUwpIHZhbHVlIC89IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIGlmIChlLmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHZhbHVlICo9IDQwO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAnbW91c2V3aGVlbCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gLWUud2hlZWxEZWx0YVk7XG4gICAgICAgICAgICBpZiAoc2FmYXJpKSB2YWx1ZSA9IHZhbHVlIC8gMztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub3cgPSAod2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGUpLm5vdygpLFxuICAgICAgICAgICAgdGltZURlbHRhID0gbm93IC0gKHRoaXMuX3RpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fdGltZSA9IG5vdztcblxuICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgKHZhbHVlICUgNC4wMDAyNDQxNDA2MjUpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3doZWVsJztcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGlzIHZhbHVlIHRvIG1hdGNoIHRyYWNrcGFkLlxuICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlIC8gNCk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gMCAmJiBNYXRoLmFicyh2YWx1ZSkgPCA0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgdHJhY2twYWQgZXZlbnQgYmVjYXVzZSBpdCBpcyBzbyBzbWFsbC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAndHJhY2twYWQnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodGltZURlbHRhID4gNDAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIG5ldyBzY3JvbGwgYWN0aW9uLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSB0aW1lb3V0IGluIGNhc2UgdGhpcyB3YXMgYSBzaW5ndWxhciBldmVudCwgYW5kIGRlbHkgaXQgYnkgdXAgdG8gNDBtcy5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwgNDApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3R5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXRpbmcgZXZlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIGV2ZW50IGp1c3QgeWV0LlxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbHRhIHBlciB0aW1lIGlzIHNtYWxsLCB3ZSBhc3N1bWUgaXQncyBhIGZhc3QgdHJhY2twYWQ7IG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IChNYXRoLmFicyh0aW1lRGVsdGEgKiB2YWx1ZSkgPCAyMDApID8gJ3RyYWNrcGFkJyA6ICd3aGVlbCc7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgZGVsYXllZCBldmVudCBpc24ndCBmaXJlZCBhZ2FpbiwgYmVjYXVzZSB3ZSBhY2N1bXVsYXRlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZXZlbnQgKHdoaWNoIHdhcyBsZXNzIHRoYW4gNDBtcyBhZ28pIGludG8gdGhpcyBldmVudC5cbiAgICAgICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiB2YWx1ZSkgdmFsdWUgPSB2YWx1ZSAvIDQ7XG5cbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlIHRoZSB1c2VyIHVzZXMuXG4gICAgICAgIGlmICh0aGlzLl90eXBlKSB0aGlzLl96b29tKC12YWx1ZSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICBfb25UaW1lb3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuICAgICAgICB0aGlzLl96b29tKC10aGlzLl9sYXN0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBfem9vbTogZnVuY3Rpb24gKGRlbHRhKSB7XG4gICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyhkZWx0YSAvIDEwMCkpKTtcbiAgICAgICAgaWYgKGRlbHRhIDwgMCAmJiBzY2FsZSAhPT0gMCkgc2NhbGUgPSAxIC8gc2NhbGU7XG5cbiAgICAgICAgdmFyIGZyb21TY2FsZSA9IG1hcC5lYXNlID8gbWFwLmVhc2UudG8gOiBtYXAudHJhbnNmb3JtLnNjYWxlLFxuICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKGZyb21TY2FsZSAqIHNjYWxlKTtcblxuICAgICAgICBtYXAuem9vbVRvKHRhcmdldFpvb20sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgYXJvdW5kOiBtYXAudW5wcm9qZWN0KHRoaXMuX3BvcylcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLypcbiAqIEFkZHMgcG9zaXRpb25hbCBjb29yZGluYXRlcyB0byBVUkwgaGFzaGVzLiBQYXNzZWQgYXMgYW4gb3B0aW9uIHRvIHRoZSBtYXAgb2JqZWN0XG4gKlxuICogQGNsYXNzIG1hcGJveGdsLkhhc2hcbiAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5mdW5jdGlvbiBIYXNoKCkge1xuICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICdfb25IYXNoQ2hhbmdlJyxcbiAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgIF0sIHRoaXMpO1xufVxuXG5IYXNoLnByb3RvdHlwZSA9IHtcbiAgICAvKiBNYXAgZWxlbWVudCB0byBsaXN0ZW4gZm9yIGNvb3JkaW5hdGUgY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcFxuICAgICAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbzogZnVuY3Rpb24obWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX29uSGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsb2MgPSBsb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1sxXSwgK2xvY1syXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiArKGxvY1szXSB8fCAwKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIF91cGRhdGVIYXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgYmVhcmluZyA9IHRoaXMuX21hcC5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBwcmVjaXNpb24gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoTWF0aC5sb2coem9vbSkgLyBNYXRoLkxOMikpLFxuXG4gICAgICAgICAgICBoYXNoID0gJyMnICsgKE1hdGgucm91bmQoem9vbSAqIDEwMCkgLyAxMDApICtcbiAgICAgICAgICAgICAgICAnLycgKyBjZW50ZXIubGF0LnRvRml4ZWQocHJlY2lzaW9uKSArXG4gICAgICAgICAgICAgICAgJy8nICsgY2VudGVyLmxuZy50b0ZpeGVkKHByZWNpc2lvbikgK1xuICAgICAgICAgICAgICAgIChiZWFyaW5nID8gJy8nICsgKE1hdGgucm91bmQoYmVhcmluZyAqIDEwKSAvIDEwKSA6ICcnKTtcblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoJycsICcnLCBoYXNoKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFuZGxlcnMgPSB7XG4gICAgc2Nyb2xsWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL3Njcm9sbF96b29tJyksXG4gICAgYm94Wm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2JveF96b29tJyksXG4gICAgZHJhZ1JvdGF0ZTogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcm90YXRlJyksXG4gICAgZHJhZ1BhbjogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcGFuJyksXG4gICAga2V5Ym9hcmQ6IHJlcXVpcmUoJy4vaGFuZGxlci9rZXlib2FyZCcpLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2RibGNsaWNrX3pvb20nKSxcbiAgICBwaW5jaDogcmVxdWlyZSgnLi9oYW5kbGVyL3BpbmNoJylcbn07XG5cbnZhciBET00gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpLFxuICAgIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmFjdGlvbjtcblxuLyoqXG4gKiBNb3VzZSBtb3ZlIGV2ZW50LlxuICpcbiAqIEBldmVudCBtb3VzZW1vdmVcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1BvaW50fSBwb2ludCB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge0xhdExuZ30gcG9pbnQgdGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb2YgdGhlIGV2ZW50XG4gKiBAcHJvcGVydHkge0V2ZW50fSBvcmlnaW5hbEV2ZW50IHRoZSBvcmlnaW5hbCBET00gZXZlbnRcbiAqL1xuXG4vKipcbiAqIENsaWNrIGV2ZW50LlxuICpcbiAqIEBldmVudCBjbGlja1xuICogQG1lbWJlcm9mIE1hcFxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IHRoZSBwaXhlbCBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7TGF0TG5nfSBwb2ludCB0aGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IG9yaWdpbmFsRXZlbnQgdGhlIG9yaWdpbmFsIERPTSBldmVudFxuICovXG5cbi8qKlxuICogRG91YmxlIGNsaWNrIGV2ZW50LlxuICpcbiAqIEBldmVudCBkYmxjbGlja1xuICogQG1lbWJlcm9mIE1hcFxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IHRoZSBwaXhlbCBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7TGF0TG5nfSBwb2ludCB0aGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvZiB0aGUgZXZlbnRcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IG9yaWdpbmFsRXZlbnQgdGhlIG9yaWdpbmFsIERPTSBldmVudFxuICovXG5cbmZ1bmN0aW9uIEludGVyYWN0aW9uKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbWFwW25hbWVdID0gbmV3IGhhbmRsZXJzW25hbWVdKG1hcCk7XG4gICAgfVxuXG4gICAgdXRpbC5iaW5kSGFuZGxlcnModGhpcyk7XG59XG5cbkludGVyYWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLl9tYXAub3B0aW9ucyxcbiAgICAgICAgICAgIGVsID0gdGhpcy5fZWw7XG5cbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbbmFtZV0pIHRoaXMuX21hcFtuYW1lXS5lbmFibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5fb25EYmxDbGljaywgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5fbWFwLm9wdGlvbnMsXG4gICAgICAgICAgICBlbCA9IHRoaXMuX2VsO1xuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zW25hbWVdKSB0aGlzLl9tYXBbbmFtZV0uZGlzYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24pO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Ub3VjaFN0YXJ0KTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMuX29uRGJsQ2xpY2spO1xuICAgIH0sXG5cbiAgICBfb25Nb3VzZURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICB9LFxuXG4gICAgX29uVG91Y2hTdGFydDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFlLnRvdWNoZXMgfHwgZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuX3RhcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5fdGFwcGVkID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDMwMCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90YXBwZWQpO1xuICAgICAgICAgICAgdGhpcy5fdGFwcGVkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZGJsY2xpY2snLCBlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25UaW1lb3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3RhcHBlZCA9IG51bGw7XG4gICAgfSxcblxuICAgIF9vbk1vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgIGVsID0gdGhpcy5fZWw7XG5cbiAgICAgICAgaWYgKG1hcC5kcmFnUGFuLmFjdGl2ZSB8fCBtYXAuZHJhZ1JvdGF0ZS5hY3RpdmUpIHJldHVybjtcblxuICAgICAgICB2YXIgdGFyZ2V0ID0gZS50b0VsZW1lbnQgfHwgZS50YXJnZXQ7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3VzZW1vdmUnLCBlKTtcbiAgICB9LFxuXG4gICAgX29uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmIChwb3MuZXF1YWxzKHRoaXMuX3N0YXJ0UG9zKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdjbGljaycsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9vbkRibENsaWNrOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RibGNsaWNrJywgZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX2ZpcmVFdmVudDogZnVuY3Rpb24gKHR5cGUsIGUpIHtcbiAgICAgICAgdmFyIHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG5cbiAgICAgICAgdGhpcy5fbWFwLmZpcmUodHlwZSwge1xuICAgICAgICAgICAgbGF0TG5nOiB0aGlzLl9tYXAudW5wcm9qZWN0KHBvcyksXG4gICAgICAgICAgICBwb2ludDogcG9zLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FudmFzID0gcmVxdWlyZSgnLi4vdXRpbC9jYW52YXMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xudmFyIEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbnZhciBET00gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xuXG52YXIgU3R5bGUgPSByZXF1aXJlKCcuLi9zdHlsZS9zdHlsZScpO1xudmFyIEFuaW1hdGlvbkxvb3AgPSByZXF1aXJlKCcuLi9zdHlsZS9hbmltYXRpb25fbG9vcCcpO1xudmFyIFBhaW50ZXIgPSByZXF1aXJlKCcuLi9yZW5kZXIvcGFpbnRlcicpO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vZ2VvL3RyYW5zZm9ybScpO1xudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKTtcblxudmFyIEludGVyYWN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcmFjdGlvbicpO1xuXG52YXIgQ2FtZXJhID0gcmVxdWlyZSgnLi9jYW1lcmEnKTtcbnZhciBMYXRMbmcgPSByZXF1aXJlKCcuLi9nZW8vbGF0X2xuZycpO1xudmFyIExhdExuZ0JvdW5kcyA9IHJlcXVpcmUoJy4uL2dlby9sYXRfbG5nX2JvdW5kcycpO1xudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbnZhciBBdHRyaWJ1dGlvbiA9IHJlcXVpcmUoJy4vY29udHJvbC9hdHRyaWJ1dGlvbicpO1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIE1hcCNhZGRDbGFzcywgTWFwI3JlbW92ZUNsYXNzLCBhbmQgTWFwI3NldENsYXNzZXMsIGNvbnRyb2xsaW5nXG4gKiB3aGV0aGVyIG9yIG5vdCB0byBzbW9vdGhseSB0cmFuc2l0aW9uIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IHRoZSBjbGFzcyBjaGFuZ2UuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gU3R5bGVPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRyYW5zaXRpb25cbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgaW5zdGFuY2UuXG4gKiBAY2xhc3MgTWFwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIEhUTUwgZWxlbWVudCB0byBpbml0aWFsaXplIHRoZSBtYXAgaW4gKG9yIGVsZW1lbnQgaWQgYXMgc3RyaW5nKVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblpvb209MF0gTWluaW11bSB6b29tIG9mIHRoZSBtYXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tPTIwXSBNYXhpbXVtIHpvb20gb2YgdGhlIG1hcFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuc3R5bGUgTWFwIHN0eWxlIGFuZCBkYXRhIHNvdXJjZSBkZWZpbml0aW9uIChlaXRoZXIgYSBKU09OIG9iamVjdCBvciBhIEpTT04gVVJMKSwgZGVzY3JpYmVkIGluIHRoZSBbc3R5bGUgcmVmZXJlbmNlXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNoPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAgd2lsbCB0cmFjayBhbmQgdXBkYXRlIHRoZSBwYWdlIFVSTCBhY2NvcmRpbmcgdG8gbWFwIHBvc2l0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVyYWN0aXZlPXRydWVdIElmIGBmYWxzZWAsIG5vIG1vdXNlLCB0b3VjaCwgb3Iga2V5Ym9hcmQgbGlzdGVuZXJzIGFyZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGlucHV0XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXA9N10gU25hcCB0byBub3J0aCB0aHJlc2hvbGQgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IG9wdGlvbnMuY2xhc3NlcyBTdHlsZSBjbGFzcyBuYW1lcyB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIG1hcFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgdGhhdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGNyZWF0ZWQgV2ViR0wgY29udGV4dCB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgbG93ZXIgdGhhbiBleHBlY3RlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIFRoZSBtYXBzIGNhbnZhcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBQTkcgdXNpbmcgYG1hcC5nZXRDYW52YXMoKS50b0RhdGFVUkwoKTtgLiBUaGlzIGlzIGZhbHNlIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICogICBjb250YWluZXI6ICdtYXAnLFxuICogICBjZW50ZXI6IFszNy43NzI1MzcsIC0xMjIuNDIwNjc5XSxcbiAqICAgem9vbTogMTMsXG4gKiAgIHN0eWxlOiBzdHlsZV9vYmplY3QsXG4gKiAgIGhhc2g6IHRydWVcbiAqIH0pO1xuICovXG52YXIgTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5pbmhlcml0KHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmFuaW1hdGlvbkxvb3AgPSBuZXcgQW5pbWF0aW9uTG9vcCgpO1xuICAgIHRoaXMudHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSk7XG5cbiAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgdmFyIGIgPSBMYXRMbmdCb3VuZHMuY29udmVydChvcHRpb25zLm1heEJvdW5kcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlID0gW2IuZ2V0U291dGgoKSwgYi5nZXROb3J0aCgpXTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgPSBbYi5nZXRXZXN0KCksIGIuZ2V0RWFzdCgpXTtcbiAgICB9XG5cbiAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAnX2ZvcndhcmRTdHlsZUV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkU291cmNlRXZlbnQnLFxuICAgICAgICAnX2ZvcndhcmRMYXllckV2ZW50JyxcbiAgICAgICAgJ19mb3J3YXJkVGlsZUV2ZW50JyxcbiAgICAgICAgJ19vblN0eWxlTG9hZCcsXG4gICAgICAgICdfb25TdHlsZUNoYW5nZScsXG4gICAgICAgICdfb25Tb3VyY2VBZGQnLFxuICAgICAgICAnX29uU291cmNlUmVtb3ZlJyxcbiAgICAgICAgJ19vblNvdXJjZVVwZGF0ZScsXG4gICAgICAgICd1cGRhdGUnLFxuICAgICAgICAncmVuZGVyJ1xuICAgIF0sIHRoaXMpO1xuXG4gICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcblxuICAgIHRoaXMub24oJ21vdmUnLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5vbignem9vbScsIHRoaXMudXBkYXRlLmJpbmQodGhpcywgdHJ1ZSkpO1xuICAgIHRoaXMub24oJ21vdmVlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApOyAvLyB0ZXh0IGZhZGluZ1xuICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpLnJlc2l6ZSgpLnVwZGF0ZSgpO1xuICAgICAgICB9LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyYWN0aW9uID0gbmV3IEludGVyYWN0aW9uKHRoaXMpO1xuXG4gICAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbi5lbmFibGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9oYXNoID0gb3B0aW9ucy5oYXNoICYmIChuZXcgSGFzaCgpKS5hZGRUbyh0aGlzKTtcbiAgICAvLyBkb24ndCBzZXQgcG9zaXRpb24gZnJvbSBvcHRpb25zIGlmIHNldCB0aHJvdWdoIGhhc2hcbiAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuc291cmNlcyA9IHt9O1xuICAgIHRoaXMuc3RhY2tzID0ge307XG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9O1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIGlmIChvcHRpb25zLmNsYXNzZXMpIHRoaXMuc2V0Q2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpO1xuICAgIGlmIChvcHRpb25zLnN0eWxlKSB0aGlzLnNldFN0eWxlKG9wdGlvbnMuc3R5bGUpO1xuICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCkgdGhpcy5hZGRDb250cm9sKG5ldyBBdHRyaWJ1dGlvbigpKTtcbn07XG5cbnV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUsIEV2ZW50ZWQpO1xudXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSwgQ2FtZXJhLnByb3RvdHlwZSk7XG51dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLCAvKiogQGxlbmRzIE1hcC5wcm90b3R5cGUgKi97XG5cbiAgICBvcHRpb25zOiB7XG4gICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICB6b29tOiAwLFxuICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICBwaXRjaDogMCxcblxuICAgICAgICBtaW5ab29tOiAwLFxuICAgICAgICBtYXhab29tOiAyMCxcblxuICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcblxuICAgICAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgICAgICBib3hab29tOiB0cnVlLFxuICAgICAgICBkcmFnUm90YXRlOiB0cnVlLFxuICAgICAgICBkcmFnUGFuOiB0cnVlLFxuICAgICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgICAgZG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgICAgICBwaW5jaDogdHJ1ZSxcblxuICAgICAgICBiZWFyaW5nU25hcDogNyxcblxuICAgICAgICBoYXNoOiBmYWxzZSxcblxuICAgICAgICBhdHRyaWJ1dGlvbkNvbnRyb2w6IHRydWUsXG5cbiAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2VcbiAgICB9LFxuXG4gICAgYWRkQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCkge1xuICAgICAgICBjb250cm9sLmFkZFRvKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHN0eWxlIGNsYXNzIHRvIGEgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2xhc3MgbmFtZSBvZiBzdHlsZSBjbGFzc1xuICAgICAqIEBwYXJhbSB7U3R5bGVPcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgY2hhbmdlXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKGtsYXNzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGFzc2VzW2tsYXNzXSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9jbGFzc2VzW2tsYXNzXSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc3R5bGUgY2xhc3MgZnJvbSBhIG1hcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIG5hbWUgb2Ygc3R5bGUgY2xhc3NcbiAgICAgKiBAcGFyYW0ge1N0eWxlT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQGZpcmVzIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihrbGFzcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2NsYXNzZXNba2xhc3NdKSByZXR1cm47XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2tsYXNzXTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIG1vcmUgdGhhbiBvbmUgY2xhc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzcyBuYW1lc1xuICAgICAqIEBwYXJhbSB7U3R5bGVPcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAZmlyZXMgY2hhbmdlXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0Q2xhc3NlczogZnVuY3Rpb24oa2xhc3Nlcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9jbGFzc2VzID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fY2xhc3Nlc1trbGFzc2VzW2ldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgYSBzdHlsZSBjbGFzcyBpcyBhY3RpdmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrbGFzcyBOYW1lIG9mIHN0eWxlIGNsYXNzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzQ2xhc3M6IGZ1bmN0aW9uKGtsYXNzKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2NsYXNzZXNba2xhc3NdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgYWN0aXZlIHN0eWxlIGNsYXNzZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldENsYXNzZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY2xhc3Nlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERldGVjdCB0aGUgbWFwJ3MgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJlc2l6ZSBpdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB3aWR0aCA9IDAsIGhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGggfHwgNDAwO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCB8fCAzMDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYW52YXMucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uX2NvbnN0cmFpbigpO1xuXG4gICAgICAgIHRoaXMucGFpbnRlci5yZXNpemUod2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5maXJlKCdtb3Zlc3RhcnQnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnKVxuICAgICAgICAgICAgLmZpcmUoJ3Jlc2l6ZScpXG4gICAgICAgICAgICAuZmlyZSgnbW92ZWVuZCcpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMYXRMbmdCb3VuZHN9XG4gICAgICovXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXRMbmdCb3VuZHMoXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSksXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMudHJhbnNmb3JtLnNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHBpeGVsIGNvb3JkaW5hdGVzIChyZWxhdGl2ZSB0byBtYXAgY29udGFpbmVyKSBnaXZlbiBhIGdlb2dyYXBoaWNhbCBsb2NhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZ1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzXG4gICAgICovXG4gICAgcHJvamVjdDogZnVuY3Rpb24obGF0bG5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExhdExuZy5jb252ZXJ0KGxhdGxuZykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIGdpdmVuIHBpeGVsIGNvb3JkaW5hdGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHBvaW50IFt4LCB5XSBwaXhlbCBjb29yZGluYXRlc1xuICAgICAqIEByZXR1cm5zIHtMYXRMbmd9XG4gICAgICovXG4gICAgdW5wcm9qZWN0OiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgZmVhdHVyZXMgYXQgYSBwb2ludCAoW3gsIHldKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBwb2ludCBbeCwgeV0gcGl4ZWwgY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMucmFkaXVzPTBdIE9wdGlvbmFsLiBSYWRpdXMgaW4gcGl4ZWxzIHRvIHNlYXJjaCBpblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubGF5ZXIgT3B0aW9uYWwuIE9ubHkgcmV0dXJuIGZlYXR1cmVzIGZyb20gYSBnaXZlbiBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudHlwZSBPcHRpb25hbC4gRWl0aGVyIGByYXN0ZXJgIG9yIGB2ZWN0b3JgXG4gICAgICogQHBhcmFtIHtmZWF0dXJlc0F0Q2FsbGJhY2t9IGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2VcbiAgICAgKlxuICAgICAqIEBjYWxsYmFjayBmZWF0dXJlc0F0Q2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBlcnIgRXJyb3IgX0lmIGFueV9cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBmZWF0dXJlcyBEaXNwbGF5cyBhIEpTT04gYXJyYXkgb2YgZmVhdHVyZXMgZ2l2ZW4gdGhlIHBhc3NlZCBwYXJhbWV0ZXJzIG9mIGBmZWF0dXJlc0F0YFxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5mZWF0dXJlc0F0KFsxMCwgMjBdLCB7IHJhZGl1czogMTAgfSwgZnVuY3Rpb24oZXJyLCBmZWF0dXJlcykge1xuICAgICAqICAgY29uc29sZS5sb2coZmVhdHVyZXMpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZlYXR1cmVzQXQ6IGZ1bmN0aW9uKHBvaW50LCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb29yZCA9IHRoaXMudHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZShQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgICAgIHRoaXMuc3R5bGUuZmVhdHVyZXNBdChjb29yZCwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBtdWx0aXBsZSBzdHlsZSBtdXRhdGlvbnMgaW4gYSBiYXRjaFxuICAgICAqXG4gICAgICogbWFwLmJhdGNoKGZ1bmN0aW9uIChiYXRjaCkge1xuICAgICAqICAgICBiYXRjaC5hZGRMYXllcihsYXllcjEpO1xuICAgICAqICAgICBiYXRjaC5hZGRMYXllcihsYXllcjIpO1xuICAgICAqICAgICAuLi5cbiAgICAgKiAgICAgYmF0Y2guYWRkTGF5ZXIobGF5ZXJOKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHdvcmsgRnVuY3Rpb24gd2hpY2ggYWNjZXB0cyB0aGUgU3R5bGVCYXRjaCBpbnRlcmZhY2VcbiAgICAgKi9cbiAgICBiYXRjaDogZnVuY3Rpb24od29yaykge1xuICAgICAgICB0aGlzLnN0eWxlLmJhdGNoKHdvcmspO1xuXG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcyk7XG4gICAgICAgIHRoaXMudXBkYXRlKHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgQSBzdHlsZSBvYmplY3QgZm9ybWF0dGVkIGFzIEpTT05cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRTdHlsZTogZnVuY3Rpb24oc3R5bGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVcbiAgICAgICAgICAgICAgICAub2ZmKCdsb2FkJywgdGhpcy5fb25TdHlsZUxvYWQpXG4gICAgICAgICAgICAgICAgLm9mZignZXJyb3InLCB0aGlzLl9mb3J3YXJkU3R5bGVFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCdjaGFuZ2UnLCB0aGlzLl9vblN0eWxlQ2hhbmdlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ3NvdXJjZS5hZGQnLCB0aGlzLl9vblNvdXJjZUFkZClcbiAgICAgICAgICAgICAgICAub2ZmKCdzb3VyY2UucmVtb3ZlJywgdGhpcy5fb25Tb3VyY2VSZW1vdmUpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLmxvYWQnLCB0aGlzLl9vblNvdXJjZVVwZGF0ZSlcbiAgICAgICAgICAgICAgICAub2ZmKCdzb3VyY2UuZXJyb3InLCB0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZignc291cmNlLmNoYW5nZScsIHRoaXMuX29uU291cmNlVXBkYXRlKVxuICAgICAgICAgICAgICAgIC5vZmYoJ2xheWVyLmFkZCcsIHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ2xheWVyLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KVxuICAgICAgICAgICAgICAgIC5vZmYoJ3RpbGUuYWRkJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgICAgICAub2ZmKCd0aWxlLnJlbW92ZScsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLm9mZigndGlsZS5sb2FkJywgdGhpcy51cGRhdGUpXG4gICAgICAgICAgICAgICAgLm9mZigndGlsZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpXG4gICAgICAgICAgICAgICAgLl9yZW1vdmUoKTtcblxuICAgICAgICAgICAgdGhpcy5vZmYoJ3JvdGF0ZScsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5vZmYoJ3BpdGNoJywgdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKHN0eWxlIGluc3RhbmNlb2YgU3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUoc3R5bGUsIHRoaXMuYW5pbWF0aW9uTG9vcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0eWxlXG4gICAgICAgICAgICAub24oJ2xvYWQnLCB0aGlzLl9vblN0eWxlTG9hZClcbiAgICAgICAgICAgIC5vbignZXJyb3InLCB0aGlzLl9mb3J3YXJkU3R5bGVFdmVudClcbiAgICAgICAgICAgIC5vbignY2hhbmdlJywgdGhpcy5fb25TdHlsZUNoYW5nZSlcbiAgICAgICAgICAgIC5vbignc291cmNlLmFkZCcsIHRoaXMuX29uU291cmNlQWRkKVxuICAgICAgICAgICAgLm9uKCdzb3VyY2UucmVtb3ZlJywgdGhpcy5fb25Tb3VyY2VSZW1vdmUpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5sb2FkJywgdGhpcy5fb25Tb3VyY2VVcGRhdGUpXG4gICAgICAgICAgICAub24oJ3NvdXJjZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudClcbiAgICAgICAgICAgIC5vbignc291cmNlLmNoYW5nZScsIHRoaXMuX29uU291cmNlVXBkYXRlKVxuICAgICAgICAgICAgLm9uKCdsYXllci5hZGQnLCB0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudClcbiAgICAgICAgICAgIC5vbignbGF5ZXIucmVtb3ZlJywgdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpXG4gICAgICAgICAgICAub24oJ3RpbGUuYWRkJywgdGhpcy5fZm9yd2FyZFRpbGVFdmVudClcbiAgICAgICAgICAgIC5vbigndGlsZS5yZW1vdmUnLCB0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KVxuICAgICAgICAgICAgLm9uKCd0aWxlLmxvYWQnLCB0aGlzLnVwZGF0ZSlcbiAgICAgICAgICAgIC5vbigndGlsZS5lcnJvcicsIHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpO1xuXG4gICAgICAgIHRoaXMub24oJ3JvdGF0ZScsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICB0aGlzLm9uKCdwaXRjaCcsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzb3VyY2UgdG8gdGhlIG1hcCBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBvZiB0aGUgc291cmNlLiBNdXN0IG5vdCBiZSB1c2VkIGJ5IGFueSBleGlzdGluZyBzb3VyY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBzb3VyY2Ugc3BlY2lmaWNhdGlvbiwgZm9sbG93aW5nIHRoZVxuICAgICAqIFtNYXBib3ggR0wgU3R5bGUgUmVmZXJlbmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKVxuICAgICAqIEBmaXJlcyBzb3VyY2UuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkU291cmNlOiBmdW5jdGlvbihpZCwgc291cmNlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkU291cmNlKGlkLCBzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIHNvdXJjZSBmcm9tIHRoZSBtYXAgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgb2YgdGhlIHNvdXJjZSB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgc291cmNlLnJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdHlsZSBzb3VyY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBpZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgc291cmNlIElEXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRTb3VyY2U6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFNvdXJjZShpZCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U3R5bGVMYXllcnxPYmplY3R9IGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBiZWZvcmUgIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKiBAZmlyZXMgbGF5ZXIuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkTGF5ZXI6IGZ1bmN0aW9uKGxheWVyLCBiZWZvcmUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRMYXllcihsYXllciwgYmVmb3JlKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBmcm9tIHRoZSBtYXAuIEFueSBsYXllcnMgd2hpY2ggcmVmZXIgdG8gdGhlXG4gICAgICogc3BlY2lmaWVkIGxheWVyIHZpYSBhIGByZWZgIHByb3BlcnR5IGFyZSBhbHNvIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgbGF5ZXIgaWRcbiAgICAgKiBAZmlyZXMgbGF5ZXIucmVtb3ZlXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHJlbW92ZUxheWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZmlsdGVyIGZvciBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXIgZmlsdGVyIHNwZWNpZmljYXRpb24sIGFzIGRlZmluZWQgaW4gdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNmaWx0ZXIpXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbihsYXllciwgZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmlsdGVyKGxheWVyLCBmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB6b29tIGV4dGVudCBmb3IgYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluem9vbSBtaW5pbXVtIHpvb20gZXh0ZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heHpvb20gbWF4aW11bSB6b29tIGV4dGVudFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlOiBmdW5jdGlvbihsYXllcklkLCBtaW56b29tLCBtYXh6b29tKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpbHRlciBmb3IgYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHJldHVybnMge0FycmF5fSBmaWx0ZXIgc3BlY2lmaWNhdGlvbiwgYXMgZGVmaW5lZCBpbiB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2ZpbHRlcilcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiBhIGdpdmVuIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIElEIG9mIGEgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIGEgcGFpbnQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIGZvciB0aGUgcGFpbnQgcHJvcGVyeTsgbXVzdCBoYXZlIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHkgYXMgZGVmaW5lZCBpbiB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0ga2xhc3Mgb3B0aW9uYWwgY2xhc3Mgc3BlY2lmaWVyIGZvciB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwgdmFsdWUsIGtsYXNzKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllciwgbmFtZSwgdmFsdWUsIGtsYXNzKTtcbiAgICAgICAgdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKTtcbiAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgcGFpbnQgcHJvcGVydHkgaW4gYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBhIHBhaW50IHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBrbGFzcyBvcHRpb25hbCBjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB2YWx1ZSBmb3IgdGhlIHBhaW50IHByb3BlcnlcbiAgICAgKi9cbiAgICBnZXRQYWludFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSwga2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0UGFpbnRQcm9wZXJ0eShsYXllciwgbmFtZSwga2xhc3MpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIGEgZ2l2ZW4gc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgSUQgb2YgYSBsYXllclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgYSBsYXlvdXQgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIGZvciB0aGUgbGF5b3V0IHByb3Blcnk7IG11c3QgaGF2ZSB0aGUgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLylcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogZnVuY3Rpb24obGF5ZXIsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBsYXlvdXQgcHJvcGVydHkgaW4gYSBnaXZlbiBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBJRCBvZiBhIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBhIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0ga2xhc3Mgb3B0aW9uYWwgY2xhc3Mgc3BlY2lmaWVyIGZvciB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyB7Kn0gdmFsdWUgZm9yIHRoZSBsYXlvdXQgcHJvcGVyeVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5OiBmdW5jdGlvbihsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgTWFwJ3MgY29udGFpbmVyIGFzIGFuIEhUTUwgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb250YWluZXIgZm9yIHRoZSBtYXAgYGNhbnZhc2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGFkZCBub24tR0wgb3ZlcmxheXMgdG8gdGhlIG1hcCwgeW91IHNob3VsZCBhcHBlbmQgdGhlbSB0byB0aGlzIGVsZW1lbnQuIFRoaXNcbiAgICAgKiBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgc3VjaCBhcyBwYW5uaW5nIGFuZCB6b29taW5nIGFyZVxuICAgICAqIGF0dGFjaGVkLiBJdCB3aWxsIHJlY2VpdmUgYnViYmxlZCBldmVudHMgZm9yIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYXMgdGhlIGBjYW52YXNgLCBidXQgbm90IGZvclxuICAgICAqIG1hcCBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q2FudmFzQ29udGFpbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBNYXAncyBjYW52YXMgYXMgYW4gSFRNTCBjYW52YXNcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGNhbnZhc1xuICAgICAqL1xuICAgIGdldENhbnZhczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXMuZ2V0RWxlbWVudCgpO1xuICAgIH0sXG5cbiAgICBfc2V0dXBDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIgPSB0eXBlb2YgaWQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIDogaWQ7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXAnKTtcblxuICAgICAgICB2YXIgY2FudmFzQ29udGFpbmVyID0gdGhpcy5fY2FudmFzQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbnZhcy1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtaW50ZXJhY3RpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYW52YXMgPSBuZXcgQ2FudmFzKHRoaXMsIGNhbnZhc0NvbnRhaW5lcik7XG5cbiAgICAgICAgdmFyIGNvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICB2YXIgY29ybmVycyA9IHRoaXMuX2NvbnRyb2xDb3JuZXJzID0ge307XG4gICAgICAgIFsndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddLmZvckVhY2goZnVuY3Rpb24gKHBvcykge1xuICAgICAgICAgICAgY29ybmVyc1twb3NdID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwtJyArIHBvcywgY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfc2V0dXBQYWludGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5fY2FudmFzLmdldFdlYkdMQ29udGV4dCh7XG4gICAgICAgICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiB0aGlzLm9wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5vcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWludGVyID0gbmV3IFBhaW50ZXIoZ2wsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9LFxuXG4gICAgX2NvbnRleHRMb3N0OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgYnJvd3Nlci5jYW5jZWxGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfY29udGV4dFJlc3RvcmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIHRoaXMgbWFwIGZ1bGx5IGxvYWRlZD8gSWYgdGhlIHN0eWxlIGlzbid0IGxvYWRlZFxuICAgICAqIG9yIGl0IGhhcyBhIGNoYW5nZSB0byB0aGUgc291cmNlcyBvciBzdHlsZSB0aGF0IGlzbid0XG4gICAgICogcHJvcGFnYXRlZCB0byBpdHMgc3R5bGUsIHJldHVybiBmYWxzZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBtYXAgaXMgbG9hZGVkXG4gICAgICovXG4gICAgbG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fc291cmNlc0RpcnR5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5zdHlsZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIG1hcCdzIHN0eWxlIGFuZCByZS1yZW5kZXIgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVTdHlsZSBuZXcgc3R5bGVcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbih1cGRhdGVTdHlsZSkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0aGlzLl9zdHlsZURpcnR5IHx8IHVwZGF0ZVN0eWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3JlcmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGwgd2hlbiBhIChyZS0pcmVuZGVyIG9mIHRoZSBtYXAgaXMgcmVxdWlyZWQsIGUuZy4gd2hlbiB0aGVcbiAgICAgKiB1c2VyIHBhbm5lZCBvciB6b29tZWQsZiBvciBuZXcgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3N0eWxlRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlY2FsY3VsYXRlKHRoaXMudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5ICYmICF0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eVRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCA1MCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgICAgICB2ZXJ0aWNlczogdGhpcy52ZXJ0aWNlcyxcbiAgICAgICAgICAgIHJvdGF0aW5nOiB0aGlzLnJvdGF0aW5nLFxuICAgICAgICAgICAgem9vbWluZzogdGhpcy56b29taW5nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlyZSgncmVuZGVyJyk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9hZGVkKCkgJiYgIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGlvbkxvb3Auc3RvcHBlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VzRGlydHkgfHwgdGhpcy5fcmVwYWludCB8fCAhdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVyZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgbWFwJ3MgdW5kZXJseWluZyByZXNvdXJjZXMsIGluY2x1ZGluZyB3ZWIgd29ya2Vycy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2gpIHRoaXMuX2hhc2gucmVtb3ZlKCk7XG4gICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yZXJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gYnJvd3Nlci5mcmFtZSh0aGlzLnJlbmRlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTdHlsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnc3R5bGUuJyArIGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRTb3VyY2VFdmVudDogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLmZpcmUoZS50eXBlLCB1dGlsLmV4dGVuZCh7c3R5bGU6IGUudGFyZ2V0fSwgZSkpO1xuICAgIH0sXG5cbiAgICBfZm9yd2FyZExheWVyRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX2ZvcndhcmRUaWxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy5maXJlKGUudHlwZSwgdXRpbC5leHRlbmQoe3N0eWxlOiBlLnRhcmdldH0sIGUpKTtcbiAgICB9LFxuXG4gICAgX29uU3R5bGVMb2FkOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3Nlcywge3RyYW5zaXRpb246IGZhbHNlfSk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KGUpO1xuICAgIH0sXG5cbiAgICBfb25TdHlsZUNoYW5nZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQoZSk7XG4gICAgfSxcblxuICAgIF9vblNvdXJjZUFkZDogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgc291cmNlID0gZS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2Uub25BZGQpXG4gICAgICAgICAgICBzb3VyY2Uub25BZGQodGhpcyk7XG4gICAgICAgIHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudChlKTtcbiAgICB9LFxuXG4gICAgX29uU291cmNlUmVtb3ZlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBlLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZS5vblJlbW92ZSlcbiAgICAgICAgICAgIHNvdXJjZS5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KGUpO1xuICAgIH0sXG5cbiAgICBfb25Tb3VyY2VVcGRhdGU6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KGUpO1xuICAgIH1cbn0pO1xuXG51dGlsLmV4dGVuZEFsbChNYXAucHJvdG90eXBlLCAvKiogQGxlbmRzIE1hcC5wcm90b3R5cGUgKi97XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgZGVidWdnaW5nIG1vZGVcbiAgICAgKlxuICAgICAqIEBuYW1lIGRlYnVnXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgX2RlYnVnOiBmYWxzZSxcbiAgICBnZXQgZGVidWcoKSB7IHJldHVybiB0aGlzLl9kZWJ1ZzsgfSxcbiAgICBzZXQgZGVidWcodmFsdWUpIHsgdGhpcy5fZGVidWcgPSB2YWx1ZTsgdGhpcy51cGRhdGUoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFNob3cgY29sbGlzaW9uIGJveGVzOiB1c2VmdWwgZm9yIGRlYnVnZ2luZyBsYWJlbCBwbGFjZW1lbnRcbiAgICAgKiBpbiBzdHlsZXMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb2xsaXNpb25EZWJ1Z1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIF9jb2xsaXNpb25EZWJ1ZzogZmFsc2UsXG4gICAgZ2V0IGNvbGxpc2lvbkRlYnVnKCkgeyByZXR1cm4gdGhpcy5fY29sbGlzaW9uRGVidWc7IH0sXG4gICAgc2V0IGNvbGxpc2lvbkRlYnVnKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbGxpc2lvbkRlYnVnID0gdmFsdWU7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5zdHlsZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNvdXJjZXNbaV0ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnRpbnVvdXMgcmVwYWludCB0byBhbmFseXplIHBlcmZvcm1hbmNlXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXBhaW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgX3JlcGFpbnQ6IGZhbHNlLFxuICAgIGdldCByZXBhaW50KCkgeyByZXR1cm4gdGhpcy5fcmVwYWludDsgfSxcbiAgICBzZXQgcmVwYWludCh2YWx1ZSkgeyB0aGlzLl9yZXBhaW50ID0gdmFsdWU7IHRoaXMudXBkYXRlKCk7IH0sXG5cbiAgICAvLyBzaG93IHZlcnRpY2VzXG4gICAgX3ZlcnRpY2VzOiBmYWxzZSxcbiAgICBnZXQgdmVydGljZXMoKSB7IHJldHVybiB0aGlzLl92ZXJ0aWNlczsgfSxcbiAgICBzZXQgdmVydGljZXModmFsdWUpIHsgdGhpcy5fdmVydGljZXMgPSB2YWx1ZTsgdGhpcy51cGRhdGUoKTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9wdXA7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG52YXIgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xudmFyIERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG52YXIgTGF0TG5nID0gcmVxdWlyZSgnLi4vZ2VvL2xhdF9sbmcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcG9wdXAgY29tcG9uZW50XG4gKiBAY2xhc3MgUG9wdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2xvc2VCdXR0b25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5jbG9zZU9uQ2xpY2tcbiAqIEBleGFtcGxlXG4gKiB2YXIgdG9vbHRpcCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gKiAgIC5zZXRMYXRMbmcobWFwLnVucHJvamVjdChlLnBvaW50KSlcbiAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgLmFkZFRvKG1hcCk7XG4gKi9cbmZ1bmN0aW9uIFBvcHVwKG9wdGlvbnMpIHtcbiAgICB1dGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgJ191cGRhdGVQb3NpdGlvbicsXG4gICAgICAgICdfb25DbGlja0Nsb3NlJ10sXG4gICAgICAgIHRoaXMpO1xufVxuXG5Qb3B1cC5wcm90b3R5cGUgPSB1dGlsLmluaGVyaXQoRXZlbnRlZCwgLyoqIEBsZW5kcyBQb3B1cC5wcm90b3R5cGUgKi97XG4gICAgb3B0aW9uczoge1xuICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkNsaWNrOiB0cnVlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBwb3B1cCB0byBhIG1hcFxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXBcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvOiBmdW5jdGlvbihtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGVQb3NpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHBvcHVwIGZyb20gdGhlIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCkuYWRkVG8obWFwKTtcbiAgICAgKiBwb3B1cC5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29vcmRpbmF0ZXMgb2YgcG9wdXAgZWxlbWVudCByZWxhdGl2ZSB0byBtYXBcbiAgICAgKiBAcmV0dXJucyB7TGF0TG5nfVxuICAgICAqL1xuICAgIGdldExhdExuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRMbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb3B1cCBlbGVtZW50IHRvIGEgbWFwXG4gICAgICogQHBhcmFtIHtMYXRMbmd9IGxhdGxuZ1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TGF0TG5nOiBmdW5jdGlvbihsYXRsbmcpIHtcbiAgICAgICAgdGhpcy5fbGF0TG5nID0gTGF0TG5nLmNvbnZlcnQobGF0bG5nKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIHRleHQgb25seSBjb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWxsIGEgcG9wdXAgZWxlbWVudCB3aXRoIEhUTUwgY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRIVE1MOiBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5JyksIGNoaWxkO1xuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHRlbXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cCcsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpcCAgICAgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtdGlwJywgICAgIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgdGhpcy5fd3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29udGVudCB8fCAhdGhpcy5fY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5fd3JhcHBlcjtcblxuICAgICAgICB3aGlsZSAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVBvc2l0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRMbmcgfHwgIXRoaXMuX2NvbnRhaW5lcikgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbGF0TG5nKS5yb3VuZCgpLFxuICAgICAgICAgICAgYW5jaG9yID0gdGhpcy5vcHRpb25zLmFuY2hvcjtcblxuICAgICAgICBpZiAoIWFuY2hvcikge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChwb3MueSA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFsndG9wJ107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcy55ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQgLSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBbJ2JvdHRvbSddO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcy54IDwgd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnB1c2goJ2xlZnQnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zLnggPiB0aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbmNob3IubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvci5qb2luKCctJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbmNob3IgPSBhbmNob3I7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYW5jaG9yVHJhbnNsYXRlID0ge1xuICAgICAgICAgICAgJ3RvcCc6ICd0cmFuc2xhdGUoLTUwJSwwKScsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiAndHJhbnNsYXRlKDAsMCknLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsMCknLFxuICAgICAgICAgICAgJ2JvdHRvbSc6ICd0cmFuc2xhdGUoLTUwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogJ3RyYW5zbGF0ZSgwLC0xMDAlKScsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2xlZnQnOiAndHJhbnNsYXRlKDAsLTUwJSknLFxuICAgICAgICAgICAgJ3JpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtNTAlKSdcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY2xhc3NMaXN0ID0gdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGFuY2hvclRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtcG9wdXAtYW5jaG9yLScgKyBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXBvcHVwLWFuY2hvci0nICsgYW5jaG9yKTtcblxuICAgICAgICBET00uc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lciwgYW5jaG9yVHJhbnNsYXRlW2FuY2hvcl0gKyAnIHRyYW5zbGF0ZSgnICsgcG9zLnggKyAncHgsJyArIHBvcy55ICsgJ3B4KScpO1xuICAgIH0sXG5cbiAgICBfb25DbGlja0Nsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBBY3RvcjtcblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FjdG9yIGRlc2lnbiBwYXR0ZXJuXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FjdG9yX21vZGVsKVxuICogdGhhdCBtYWludGFpbnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFzeW5jaHJvbm91cyB0YXNrcyBhbmQgdGhlIG9iamVjdHNcbiAqIHRoYXQgc3BpbiB0aGVtIG9mZiAtIGluIHRoaXMgY2FzZSwgdGFza3MgbGlrZSBwYXJzaW5nIHBhcnRzIG9mIHN0eWxlcyxcbiAqIG93bmVkIGJ5IHRoZSBzdHlsZXNcbiAqXG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gdGFyZ2V0XG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gcGFyZW50XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBBY3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge307XG4gICAgdGhpcy5jYWxsYmFja0lEID0gMDtcbiAgICB0aGlzLnJlY2VpdmUgPSB0aGlzLnJlY2VpdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG59XG5cbkFjdG9yLnByb3RvdHlwZS5yZWNlaXZlID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICAgIHZhciBkYXRhID0gbWVzc2FnZS5kYXRhLFxuICAgICAgICBjYWxsYmFjaztcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICc8cmVzcG9uc2U+Jykge1xuICAgICAgICBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZGF0YS5pZF07XG4gICAgICAgIGNhbGxiYWNrKGRhdGEuZXJyb3IgfHwgbnVsbCwgZGF0YS5kYXRhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgaWQgPSBkYXRhLmlkO1xuICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuZGF0YSwgZnVuY3Rpb24oZXJyLCBkYXRhLCBidWZmZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnPHJlc3BvbnNlPicsXG4gICAgICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA/IFN0cmluZyhlcnIpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICB9LCBidWZmZXJzKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuZGF0YSk7XG4gICAgfVxufTtcblxuQWN0b3IucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbih0eXBlLCBkYXRhLCBjYWxsYmFjaywgYnVmZmVycykge1xuICAgIHZhciBpZCA9IG51bGw7XG4gICAgaWYgKGNhbGxiYWNrKSB0aGlzLmNhbGxiYWNrc1tpZCA9IHRoaXMuY2FsbGJhY2tJRCsrXSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoeyB0eXBlOiB0eXBlLCBpZDogU3RyaW5nKGlkKSwgZGF0YTogZGF0YSB9LCBidWZmZXJzKTtcbn07XG5cbi8qKlxuICogV3JhcHBlZCBwb3N0TWVzc2FnZSBBUEkgdGhhdCBhYnN0cmFjdHMgYXJvdW5kIElFJ3MgbGFjayBvZlxuICogYHRyYW5zZmVyTGlzdGAgc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZmVyTGlzdFxuICogQHByaXZhdGVcbiAqL1xuQWN0b3IucHJvdG90eXBlLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSwgdHJhbnNmZXJMaXN0KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJMaXN0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpOyAvLyBObyBzdXBwb3J0IGZvciB0cmFuc2Zlckxpc3Qgb24gSUVcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmdldEpTT04gPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICBjYWxsYmFjayhlKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgJiYgeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgICByZXR1cm4geGhyO1xufTtcblxuZXhwb3J0cy5nZXRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH07XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCAmJiB4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHhoci5yZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgICByZXR1cm4geGhyO1xufTtcblxuZnVuY3Rpb24gc2FtZU9yaWdpbih1cmwpIHtcbiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGEucHJvdG9jb2wgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbn1cblxuZXhwb3J0cy5nZXRJbWFnZSA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaWYgKCFzYW1lT3JpZ2luKHVybCkpIHtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgfVxuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgaW1nKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSB1cmw7XG4gICAgaW1nLmdldERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KS5kYXRhO1xuICAgIH07XG4gICAgcmV0dXJuIGltZztcbn07XG5cbmV4cG9ydHMuZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzLCBjYWxsYmFjaykge1xuICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ub25sb2Fkc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdmlkZW8pO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICB2aWRlby5nZXREYXRhID0gZnVuY3Rpb24oKSB7IHJldHVybiB2aWRlbzsgfTtcbiAgICByZXR1cm4gdmlkZW87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FudmFzID0gcmVxdWlyZSgnLi9jYW52YXMnKTtcblxudmFyIGZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5leHBvcnRzLmZyYW1lID0gZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gZnJhbWUoZm4pO1xufTtcblxudmFyIGNhbmNlbCA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc0NhbmNlbEFuaW1hdGlvbkZyYW1lO1xuXG5leHBvcnRzLmNhbmNlbEZyYW1lID0gZnVuY3Rpb24oaWQpIHtcbiAgICBjYW5jZWwoaWQpO1xufTtcblxuZXhwb3J0cy50aW1lZCA9IGZ1bmN0aW9uIChmbiwgZHVyLCBjdHgpIHtcbiAgICBpZiAoIWR1cikge1xuICAgICAgICBmbi5jYWxsKGN0eCwgMSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBhYm9ydCA9IGZhbHNlLFxuICAgICAgICBzdGFydCA9IHdpbmRvdy5wZXJmb3JtYW5jZSA/IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSA6IERhdGUubm93KCk7XG5cbiAgICBmdW5jdGlvbiB0aWNrKG5vdykge1xuICAgICAgICBpZiAoYWJvcnQpIHJldHVybjtcbiAgICAgICAgaWYgKCF3aW5kb3cucGVyZm9ybWFuY2UpIG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgaWYgKG5vdyA+PSBzdGFydCArIGR1cikge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIChub3cgLSBzdGFydCkgLyBkdXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5mcmFtZSh0aWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4cG9ydHMuZnJhbWUodGljayk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IGFib3J0ID0gdHJ1ZTsgfTtcbn07XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBiYXNpYyBKYXZhU2NyaXB0IGFuZCBET00gZmVhdHVyZXMgcmVxdWlyZWQgZm9yIE1hcGJveCBHTCBhcmUgcHJlc2VudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIElmIGB0cnVlYCwgbWFwIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZGV0ZXJtaW5lcyB0aGF0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY3JlYXRlZCBXZWJHTCBjb250ZXh0IHdvdWxkIGJlIGRyYW1hdGljYWxseSBsb3dlciB0aGFuIGV4cGVjdGVkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIE1hcGJveCBHTCBzaG91bGQgYmUgZXhwZWN0ZWQgdG8gd29yaywgYW5kIGZhbHNlIGlmIG5vdC5cbiAqIEBtZW1iZXJvZiBtYXBib3hnbFxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLnN1cHBvcnRlZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblxuICAgIHZhciBzdXBwb3J0cyA9IFtcblxuICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnOyB9LFxuXG4gICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJzsgfSxcblxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gISEoQXJyYXkucHJvdG90eXBlICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUubWFwICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gISEoRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSAmJlxuICAgICAgICAgICAgICAgICEhKE9iamVjdC5rZXlzICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5jcmVhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5pc1NlYWxlZCAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuaXNGcm96ZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2VhbCAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTT04nIGluIHdpbmRvdyAmJiAncGFyc2UnIGluIEpTT04gJiYgJ3N0cmluZ2lmeScgaW4gSlNPTjtcbiAgICAgICAgfSxcblxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FudmFzKCkuc3VwcG9ydHNXZWJHTENvbnRleHQoKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB8fCBmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiAnV29ya2VyJyBpbiB3aW5kb3c7IH1cbiAgICBdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXN1cHBvcnRzW2ldKCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3kgPSBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA4O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2RldmljZVBpeGVsUmF0aW8nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzO1xuXG5mdW5jdGlvbiBDYW52YXMocGFyZW50LCBjb250YWluZXIpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgaWYgKHBhcmVudCAmJiBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmNhbnZhcy5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jYW52YXMnKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0bG9zdCcsIHBhcmVudC5fY29udGV4dExvc3QuYmluZChwYXJlbnQpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgcGFyZW50Ll9jb250ZXh0UmVzdG9yZWQuYmluZChwYXJlbnQpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcbiAgICB9XG59XG5cbkNhbnZhcy5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgIC8vIFJlcXVlc3QgdGhlIHJlcXVpcmVkIGNhbnZhcyBzaXplIHRha2luZyB0aGUgcGl4ZWxyYXRpbyBpbnRvIGFjY291bnQuXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBwaXhlbFJhdGlvICogd2lkdGg7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gcGl4ZWxSYXRpbyAqIGhlaWdodDtcblxuICAgIC8vIE1haW50YWluIHRoZSBzYW1lIGNhbnZhcyBzaXplLCBwb3RlbnRpYWxseSBkb3duc2NhbGluZyBpdCBmb3IgSGlEUEkgZGlzcGxheXNcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xufTtcblxudmFyIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiBmYWxzZVxufTtcblxuQ2FudmFzLnByb3RvdHlwZS5nZXRXZWJHTENvbnRleHQgPSBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG4gICAgYXR0cmlidXRlcyA9IHV0aWwuZXh0ZW5kKHt9LCBhdHRyaWJ1dGVzLCByZXF1aXJlZENvbnRleHRBdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgIHRoaXMuY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xufTtcblxuQ2FudmFzLnByb3RvdHlwZS5zdXBwb3J0c1dlYkdMQ29udGV4dCA9IGZ1bmN0aW9uKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdFxuICAgIH0sIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKCdwcm9iYWJseVN1cHBvcnRzQ29udGV4dCcgaW4gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmICgnc3VwcG9ydHNDb250ZXh0JyBpbiB0aGlzLmNhbnZhcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMuc3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiAhIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiYgISF0aGlzLmdldFdlYkdMQ29udGV4dChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KTtcbn07XG5cbkNhbnZhcy5wcm90b3R5cGUuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBY3RvciA9IHJlcXVpcmUoJy4uL2FjdG9yJyk7XG52YXIgV2ViV29ya2lmeSA9IHJlcXVpcmUoJ3dlYndvcmtpZnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyO1xuXG5mdW5jdGlvbiBEaXNwYXRjaGVyKGxlbmd0aCwgcGFyZW50KSB7XG4gICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRBY3RvciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdlYldvcmtpZnkocmVxdWlyZSgnLi4vLi4vc291cmNlL3dvcmtlcicpKTtcbiAgICAgICAgdmFyIGFjdG9yID0gbmV3IEFjdG9yKHdvcmtlciwgcGFyZW50KTtcbiAgICAgICAgYWN0b3IubmFtZSA9IFwiV29ya2VyIFwiICsgaTtcbiAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgfVxufVxuXG5EaXNwYXRjaGVyLnByb3RvdHlwZSA9IHtcbiAgICBicm9hZGNhc3Q6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hY3RvcnNbaV0uc2VuZCh0eXBlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBjYWxsYmFjaywgdGFyZ2V0SUQsIGJ1ZmZlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJRCAhPT0gJ251bWJlcicgfHwgaXNOYU4odGFyZ2V0SUQpKSB7XG4gICAgICAgICAgICAvLyBVc2Ugcm91bmQgcm9iaW4gdG8gc2VuZCByZXF1ZXN0cyB0byB3ZWIgd29ya2Vycy5cbiAgICAgICAgICAgIHRhcmdldElEID0gdGhpcy5jdXJyZW50QWN0b3IgPSAodGhpcy5jdXJyZW50QWN0b3IgKyAxKSAlIHRoaXMuYWN0b3JzLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0b3JzW3RhcmdldElEXS5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBidWZmZXJzKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldElEO1xuICAgIH0sXG5cbiAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFjdG9yc1tpXS50YXJnZXQudGVybWluYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBjbGFzc05hbWUsIGNvbnRhaW5lcikge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgaWYgKGNsYXNzTmFtZSkgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgcmV0dXJuIGVsO1xufTtcblxudmFyIGRvY1N0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG5mdW5jdGlvbiB0ZXN0UHJvcChwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHByb3BzW2ldIGluIGRvY1N0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbaV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzZWxlY3RQcm9wID0gdGVzdFByb3AoWyd1c2VyU2VsZWN0JywgJ01velVzZXJTZWxlY3QnLCAnV2Via2l0VXNlclNlbGVjdCcsICdtc1VzZXJTZWxlY3QnXSksXG4gICAgdXNlclNlbGVjdDtcbmV4cG9ydHMuZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdFByb3ApIHtcbiAgICAgICAgdXNlclNlbGVjdCA9IGRvY1N0eWxlW3NlbGVjdFByb3BdO1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9ICdub25lJztcbiAgICB9XG59O1xuZXhwb3J0cy5lbmFibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3RQcm9wKSB7XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gdXNlclNlbGVjdDtcbiAgICB9XG59O1xuXG52YXIgdHJhbnNmb3JtUHJvcCA9IHRlc3RQcm9wKFsndHJhbnNmb3JtJywgJ1dlYmtpdFRyYW5zZm9ybSddKTtcbmV4cG9ydHMuc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgZWwuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSB2YWx1ZTtcbn07XG5cbi8vIFN1cHByZXNzIHRoZSBuZXh0IGNsaWNrLCBidXQgb25seSBpZiBpdCdzIGltbWVkaWF0ZS5cbmZ1bmN0aW9uIHN1cHByZXNzQ2xpY2soZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xufVxuZXhwb3J0cy5zdXBwcmVzc0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIH0sIDApO1xufTtcblxuZXhwb3J0cy5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlbCwgZSkge1xuICAgIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZSA9IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG4gICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gZWwuY2xpZW50TGVmdCxcbiAgICAgICAgZS5jbGllbnRZIC0gcmVjdC50b3AgLSBlbC5jbGllbnRUb3ApO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgSFRUUF9VUkw6ICdodHRwOi8vYS50aWxlcy5tYXBib3guY29tJyxcbiAgICBIVFRQU19VUkw6ICdodHRwczovL2EudGlsZXMubWFwYm94LmNvbScsXG4gICAgRk9SQ0VfSFRUUFM6IHRydWUsXG4gICAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IHRydWVcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogTWV0aG9kcyBtaXhlZCBpbiB0byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKiBAbWl4aW4gRXZlbnRlZFxuICovXG52YXIgRXZlbnRlZCA9IHtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBhIHNwZWNpZmllZCBldmVudCB3aXRoIGEgbGlzdGVuZXIgZnVuY3Rpb24gdGhlIGxhdHRlciBnZXRzIHRoZSBkYXRhIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gYGZpcmVgIGFuZCBhZGRpdGlvbmFsbHkgYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKHR5cGUsIGZuKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gdGhpcy5fZXZlbnRzW3R5cGVdIHx8IFtdO1xuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChmbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGV2ZW50IGxpc3RlbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGVdIEV2ZW50IHR5cGUuIElmIG5vbmUgaXMgc3BlY2lmaWVkLCByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtsaXN0ZW5lcl0gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLiBJZiBub25lIGlzIHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGFyZSByZW1vdmVkXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbih0eXBlLCBmbikge1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBsaXN0ZW5lcnMgaWYgbm8gYXJndW1lbnRzIHNwZWNpZmllZFxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbnModHlwZSkpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5pbmRleE9mKGZuKTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBmdW5jdGlvbiBvbmNlIHdoZW4gYW4gZXZlbnQgaGFzIGZpcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24odHlwZSwgZm4pIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9mZih0eXBlLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbih0eXBlLCB3cmFwcGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpcmUgZXZlbnQgb2YgYSBnaXZlbiBzdHJpbmcgdHlwZSB3aXRoIHRoZSBnaXZlbiBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gT3B0aW9uYWwgZGF0YSBwYXNzZWQgZG93biB0byB0aGUgZXZlbnQgb2JqZWN0XG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgZmlyZTogZnVuY3Rpb24odHlwZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVucyh0eXBlKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgICAgdXRpbC5leHRlbmQoZGF0YSwge3R5cGU6IHR5cGUsIHRhcmdldDogdGhpc30pO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcvcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgaW5maW5pdGUgbG9vcFxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGV2ZW50IGlzIHJlZ2lzdGVyZWQgdG8gYSB0eXBlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIGV2ZW50cyBvZiB0eXBlIGB0eXBlYFxuICAgICAqL1xuICAgIGxpc3RlbnM6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbdHlwZV0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRlZDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaHM7XG5cbmZ1bmN0aW9uIEdseXBocyhwYmYsIGVuZCkge1xuICAgIHRoaXMuc3RhY2tzID0gcGJmLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsIFtdLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrcyh0YWcsIHN0YWNrcywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkge1xuICAgICAgICB2YXIgZm9udHN0YWNrID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIHtnbHlwaHM6IHt9fSk7XG4gICAgICAgIHN0YWNrcy5wdXNoKGZvbnRzdGFjayk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZywgZm9udHN0YWNrLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSBmb250c3RhY2submFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBmb250c3RhY2sucmFuZ2UgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgZ2x5cGggPSBwYmYucmVhZE1lc3NhZ2UocmVhZEdseXBoLCB7fSk7XG4gICAgICAgIGZvbnRzdGFjay5nbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnLCBnbHlwaCwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkgZ2x5cGguaWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgZ2x5cGguYml0bWFwID0gcGJmLnJlYWRCeXRlcygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgZ2x5cGgud2lkdGggPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgZ2x5cGguaGVpZ2h0ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGdseXBoLmxlZnQgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDYpIGdseXBoLnRvcCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNykgZ2x5cGguYWR2YW5jZSA9IHBiZi5yZWFkVmFyaW50KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJwb2xhdGU7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKGEsIGIsIHQpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmludGVycG9sYXRlLm51bWJlciA9IGludGVycG9sYXRlO1xuXG5pbnRlcnBvbGF0ZS52ZWMyID0gZnVuY3Rpb24oZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzBdLCB0b1swXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMV0sIHRvWzFdLCB0KVxuICAgIF07XG59O1xuXG4vKlxuICogSW50ZXJwb2xhdGUgYmV0d2VlbiB0d28gY29sb3JzIGdpdmVuIGFzIDQtZWxlbWVudCBhcnJheXMuXG4gKlxuICogQHBhcmFtIHtDb2xvcn0gZnJvbVxuICogQHBhcmFtIHtDb2xvcn0gdG9cbiAqIEBwYXJhbSB7bnVtYmVyfSB0IGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gMCBhbmQgMVxuICogQHJldHVybnMge0NvbG9yfSBpbnRlcnBvbGF0ZWQgY29sb3JcbiAqL1xuaW50ZXJwb2xhdGUuY29sb3IgPSBmdW5jdGlvbihmcm9tLCB0bywgdCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMF0sIHRvWzBdLCB0KSxcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVsxXSwgdG9bMV0sIHQpLFxuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzJdLCB0b1syXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bM10sIHRvWzNdLCB0KVxuICAgIF07XG59O1xuXG5pbnRlcnBvbGF0ZS5hcnJheSA9IGZ1bmN0aW9uKGZyb20sIHRvLCB0KSB7XG4gICAgcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGQsIHRvW2ldLCB0KTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xudmFyIGJyb3dzZXIgPSByZXF1aXJlKCcuL2Jyb3dzZXInKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplVVJMKHVybCwgcGF0aFByZWZpeCwgYWNjZXNzVG9rZW4pIHtcbiAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuICYmIGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBHTC4gJyArXG4gICAgICAgICAgICAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnMnKTtcbiAgICB9XG5cbiAgICB2YXIgaHR0cHMgPSBjb25maWcuRk9SQ0VfSFRUUFMgfHxcbiAgICAgICAgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonKTtcblxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9ebWFwYm94OlxcL1xcLy8sIChodHRwcyA/IGNvbmZpZy5IVFRQU19VUkwgOiBjb25maWcuSFRUUF9VUkwpICsgcGF0aFByZWZpeCk7XG4gICAgdXJsICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gJyZhY2Nlc3NfdG9rZW49JyA6ICc/YWNjZXNzX3Rva2VuPSc7XG5cbiAgICBpZiAoY29uZmlnLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL3d3dy5tYXBib3guY29tL2RldmVsb3BlcnMvYXBpLyNhY2Nlc3MtdG9rZW5zJyk7XG4gICAgICAgIH1cblxuICAgICAgICB1cmwgKz0gYWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbn1cblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkwgPSBmdW5jdGlvbih1cmwsIGFjY2Vzc1Rva2VuKSB7XG4gICAgdmFyIHVzZXIgPSB1cmwubWF0Y2goL15tYXBib3g6XFwvXFwvKFteLl0rKS8pO1xuICAgIGlmICghdXNlcilcbiAgICAgICAgcmV0dXJuIHVybDtcblxuICAgIHJldHVybiBub3JtYWxpemVVUkwodXJsLCAnL3N0eWxlcy92MS8nICsgdXNlclsxXSArICcvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgdXJsID0gbm9ybWFsaXplVVJMKHVybCArICcuanNvbicsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xuXG4gICAgLy8gVGlsZUpTT04gcmVxdWVzdHMgbmVlZCBhIHNlY3VyZSBmbGFnIGFwcGVuZGVkIHRvIHRoZWlyIFVSTHMgc29cbiAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICBpZiAodXJsLmluZGV4T2YoJ2h0dHBzJykgPT09IDApXG4gICAgICAgIHVybCArPSAnJnNlY3VyZSc7XG5cbiAgICByZXR1cm4gdXJsO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplR2x5cGhzVVJMID0gZnVuY3Rpb24odXJsLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmICghdXJsLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKVxuICAgICAgICByZXR1cm4gdXJsO1xuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVSTCh1cmwsICcvdjQvJywgYWNjZXNzVG9rZW4pO1xufTtcblxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTCA9IGZ1bmN0aW9uKHVybCwgc291cmNlVXJsKSB7XG4gICAgaWYgKCFzb3VyY2VVcmwgfHwgIXNvdXJjZVVybC5tYXRjaCgvXm1hcGJveDpcXC9cXC8vKSlcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1xcLigoPzpwbmd8anBnKVxcZCopKD89JHxcXD8pLywgYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID49IDIgPyAnQDJ4LiQxJyA6ICcuJDEnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBbbW9zdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlbW92ZSBjYWxsYmFjayBjYWxsZWQgd2l0aCBpdGVtcyB3aGVuIHRoZXkgZXhwaXJlXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IE1SVUNhY2hlO1xuZnVuY3Rpb24gTVJVQ2FjaGUobWF4LCBvblJlbW92ZSkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIGNhY2hlXG4gKlxuICogQHJldHVybnMge01SVUNhY2hlfSB0aGlzIGNhY2hlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgIHRoaXMub25SZW1vdmUodGhpcy5saXN0W2tleV0pO1xuICAgIH1cblxuICAgIHRoaXMubGlzdCA9IHt9O1xuICAgIHRoaXMub3JkZXIgPSBbXTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYSBrZXksIHZhbHVlIGNvbWJpbmF0aW9uIHRvIHRoZSBjYWNoZSwgdHJpbW1pbmcgaXRzIHNpemUgaWYgdGhpcyBwdXNoZXNcbiAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gKiBAcGFyYW0geyp9IGRhdGEgYW55IHZhbHVlXG4gKlxuICogQHJldHVybnMge01SVUNhY2hlfSB0aGlzIGNhY2hlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XG4gICAgdGhpcy5saXN0W2tleV0gPSBkYXRhO1xuICAgIHRoaXMub3JkZXIucHVzaChrZXkpO1xuXG4gICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgdmFyIHJlbW92ZWREYXRhID0gdGhpcy5nZXQodGhpcy5vcmRlclswXSk7XG4gICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBga2V5YCBpcyBwcmVzZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IHRvIGJlIGxvb2tlZC11cFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGNhY2hlIGhhcyB0aGlzIHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGtleSBpbiB0aGlzLmxpc3Q7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIGtleXMgaW4gdGhlIGNhY2hlXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGFuIGFycmF5IG9mIGtleXMgaW4gdGhpcyBjYWNoZS5cbiAqIEBwcml2YXRlXG4gKi9cbk1SVUNhY2hlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3JkZXI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLFxuICogcmV0dXJucyBgbnVsbGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdG8gbG9vayB1cFxuICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gKiBAcHJpdmF0ZVxuICovXG5NUlVDYWNoZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICB2YXIgZGF0YSA9IHRoaXMubGlzdFtrZXldO1xuXG4gICAgZGVsZXRlIHRoaXMubGlzdFtrZXldO1xuICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgIHJldHVybiBkYXRhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlVG9rZW5zO1xuXG4vKipcbiAqIFJlcGxhY2UgdG9rZW5zIGluIGEgc3RyaW5nIHRlbXBsYXRlIHdpdGggdmFsdWVzIGluIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIGEga2V5L3ZhbHVlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRva2VucyBhbmQgcmVwbGFjZW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0aGUgdGVtcGxhdGUgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdGVtcGxhdGUgd2l0aCB0b2tlbnMgcmVwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUb2tlbnMocHJvcGVydGllcywgdGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soW157fSgpXFxbXFxdPD4kPTo7LixeXSspfS9nLCBmdW5jdGlvbihtYXRjaCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gcHJvcGVydGllcyA/IHByb3BlcnRpZXNba2V5XSA6ICcnO1xuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVW5pdEJlemllciA9IHJlcXVpcmUoJ3VuaXRiZXppZXInKTtcblxuLyoqXG4gKiBHaXZlbiBhIHZhbHVlIGB0YCB0aGF0IHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEsIHJldHVyblxuICogYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB0aGF0IGVhc2VzIGJldHdlZW4gMCBhbmQgMSBpbiBhIHBsZWFzaW5nXG4gKiBjdWJpYyBpbi1vdXQgZmFzaGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdCBpbnB1dFxuICogQHJldHVybnMge251bWJlcn0gaW5wdXRcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBmdW5jdGlvbiAodCkge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIHZhciB0MiA9IHQgKiB0LFxuICAgICAgICB0MyA9IHQyICogdDtcbiAgICByZXR1cm4gNCAqICh0IDwgMC41ID8gdDMgOiAzICogKHQgLSB0MikgKyB0MyAtIDAuNzUpO1xufTtcblxuLyoqXG4gKiBHaXZlbiBnaXZlbiAoeCwgeSksICh4MSwgeTEpIGNvbnRyb2wgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSxcbiAqIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgaW50ZXJwb2xhdGVzIGFsb25nIHRoYXQgY3VydmUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHAxeCBjb250cm9sIHBvaW50IDEgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcDF5IGNvbnRyb2wgcG9pbnQgMSB5IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMnggY29udHJvbCBwb2ludCAyIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHAyeSBjb250cm9sIHBvaW50IDIgeSBjb29yZGluYXRlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGludGVycG9sYXRvcjogcmVjZWl2ZXMgbnVtYmVyIHZhbHVlLCByZXR1cm5zXG4gKiBudW1iZXIgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmJlemllciA9IGZ1bmN0aW9uKHAxeCwgcDF5LCBwMngsIHAyeSkge1xuICAgIHZhciBiZXppZXIgPSBuZXcgVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBiZXppZXIuc29sdmUodCk7XG4gICAgfTtcbn07XG5cbi8qKlxuICogQSBkZWZhdWx0IGJlemllci1jdXJ2ZSBwb3dlcmVkIGVhc2luZyBmdW5jdGlvbiB3aXRoXG4gKiBjb250cm9sIHBvaW50cyAoMC4yNSwgMC4xKSBhbmQgKDAuMjUsIDEpXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IG91dHB1dFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5lYXNlID0gZXhwb3J0cy5iZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKTtcblxuLyoqXG4gKiBHaXZlbiBhIGZvdXItZWxlbWVudCBhcnJheSBvZiBudW1iZXJzIHRoYXQgcmVwcmVzZW50cyBhIGNvbG9yIGluXG4gKiBSR0JBLCByZXR1cm4gYSB2ZXJzaW9uIGZvciB3aGljaCB0aGUgUkdCIGNvbXBvbmVudHMgYXJlIG11bHRpcGxpZWRcbiAqIGJ5IHRoZSBBIChhbHBoYSkgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjIGNvbG9yIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gcHJlbXVsdGlwbGllZCBjb2xvciBhcnJheVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5wcmVtdWx0aXBseSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgY1swXSAqPSBjWzNdO1xuICAgIGNbMV0gKj0gY1szXTtcbiAgICBjWzJdICo9IGNbM107XG4gICAgcmV0dXJuIGM7XG59O1xuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSB2aWEgbWluICsgbWF4XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG4gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjbGFtcGVkIHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNsYW1wID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBuKSk7XG59O1xuXG4vKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtb2R1bGFyIGFyaXRobWV0aWNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMud3JhcCA9IGZ1bmN0aW9uIChuLCBtaW4sIG1heCkge1xuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHJldHVybiBuID09PSBtYXggPyBuIDogKChuIC0gbWluKSAlIGQgKyBkKSAlIGQgKyBtaW47XG59O1xuXG4vKlxuICogcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCBhbmQgbm9uLXVuZGVmaW5lZCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uLlxuICogQHJldHVybnMgeyp9IGFyZ3VtZW50XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNvYWxlc2NlID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaWYgKGFyZyAhPT0gbnVsbCAmJiBhcmcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxufTtcblxuLypcbiAqIENhbGwgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGFyZ3VtZW50cyxcbiAqIGNhbGxpbmcgYGNhbGxiYWNrYCBvbmNlIGFsbCBjYWxscyBjb21wbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PCo+fSBhcnJheSBpbnB1dCB0byBlYWNoIGNhbGwgb2YgdGhlIGFzeW5jIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gYW4gYXN5bmMgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgKGRhdGEsIGNhbGxiYWNrKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50c1xuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYXN5bmNFYWNoID0gZnVuY3Rpb24gKGFycmF5LCBmbiwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVtYWluaW5nID0gYXJyYXkubGVuZ3RoO1xuICAgIGlmIChyZW1haW5pbmcgPT09IDApIHJldHVybiBjYWxsYmFjaygpO1xuICAgIGZ1bmN0aW9uIGNoZWNrKCkgeyBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKCk7IH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSBmbihhcnJheVtpXSwgY2hlY2spO1xufTtcblxuLypcbiAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUga2V5cyBpbiBvbmUgb2JqZWN0IGFuZCB0aGUga2V5c1xuICogaW4gYW5vdGhlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0ga2V5cyBkaWZmZXJlbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmtleXNEaWZmZXJlbmNlID0gZnVuY3Rpb24gKG9iaiwgb3RoZXIpIHtcbiAgICB2YXIgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghKGkgaW4gb3RoZXIpKSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZmZlcmVuY2U7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZGVzdGluYXRpb24gb2JqZWN0IGFuZCBvcHRpb25hbGx5IG1hbnkgc291cmNlIG9iamVjdHMsXG4gKiBjb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBvYmplY3RzIGludG8gdGhlIGRlc3RpbmF0aW9uLlxuICogVGhlIGxhc3Qgc291cmNlIG9iamVjdCBnaXZlbiBvdmVycmlkZXMgcHJvcGVydGllcyBmcm9tIHByZXZpb3VzXG4gKiBzb3VyY2Ugb2JqZWN0cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IGRlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgc291cmNlcyBmcm9tIHdoaWNoIHByb3BlcnRpZXMgYXJlIHB1bGxlZFxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbiAoZGVzdCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzcmMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGsgaW4gc3JjKSB7XG4gICAgICAgICAgICBkZXN0W2tdID0gc3JjW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBFeHRlbmQgYSBkZXN0aW5hdGlvbiBvYmplY3Qgd2l0aCBhbGwgcHJvcGVydGllcyBvZiB0aGUgc3JjIG9iamVjdCxcbiAqIHVzaW5nIGRlZmluZVByb3BlcnR5IGluc3RlYWQgb2Ygc2ltcGxlIGFzc2lnbm1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5leHRlbmRBbGwgPSBmdW5jdGlvbiAoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIGksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBFeHRlbmQgYSBwYXJlbnQncyBwcm90b3R5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBpbiBhIHByb3BlcnRpZXNcbiAqIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmluaGVyaXQgPSBmdW5jdGlvbiAocGFyZW50LCBwcm9wcykge1xuICAgIHZhciBwYXJlbnRQcm90byA9IHR5cGVvZiBwYXJlbnQgPT09ICdmdW5jdGlvbicgPyBwYXJlbnQucHJvdG90eXBlIDogcGFyZW50LFxuICAgICAgICBwcm90byA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdG8pO1xuICAgIGV4cG9ydHMuZXh0ZW5kQWxsKHByb3RvLCBwcm9wcyk7XG4gICAgcmV0dXJuIHByb3RvO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwcm9wZXJ0aWVzIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGNob3NlblxuICogdG8gYXBwZWFyIG9uIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggbGltaXRlZCBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBmb28gPSB7IG5hbWU6ICdDaGFybGllJywgYWdlOiAxMCB9O1xuICogdmFyIGp1c3ROYW1lID0gcGljayhmb28sIFsnbmFtZSddKTtcbiAqIC8vIGp1c3ROYW1lID0geyBuYW1lOiAnQ2hhcmxpZScgfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5waWNrID0gZnVuY3Rpb24gKHNyYywgcHJvcGVydGllcykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGlkID0gMTtcblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlxdWUgbnVtZXJpYyBpZCwgc3RhcnRpbmcgYXQgMSBhbmQgaW5jcmVtZW50aW5nIHdpdGhcbiAqIGVhY2ggY2FsbC5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWUgbnVtZXJpYyBpZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMudW5pcXVlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkKys7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHZlcnNpb24gb2YgYGZuYCB0aGF0IG9ubHkgZmlyZXMgb25jZSBldmVyeSBgdGltZWAgbWlsbHNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgbWlsbHNlY29uZHMgcmVxdWlyZWQgYmV0d2VlbiBmdW5jdGlvbiBjYWxsc1xuICogQHBhcmFtIHsqfSBjb250ZXh0IHRoZSB2YWx1ZSBvZiBgdGhpc2Agd2l0aCB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy50aHJvdHRsZSA9IGZ1bmN0aW9uIChmbiwgdGltZSwgY29udGV4dCkge1xuICAgIHZhciBsb2NrLCBhcmdzLCB3cmFwcGVyRm4sIGxhdGVyO1xuXG4gICAgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHJlc2V0IGxvY2sgYW5kIGNhbGwgaWYgcXVldWVkXG4gICAgICAgIGxvY2sgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAgIHdyYXBwZXJGbi5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIGFyZ3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB3cmFwcGVyRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICAvLyBjYWxsZWQgdG9vIHNvb24sIHF1ZXVlIHRvIGNhbGwgbGF0ZXJcbiAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhbGwgYW5kIGxvY2sgdW50aWwgbGF0ZXJcbiAgICAgICAgICAgIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIGxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyRm47XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHZlcnNpb24gb2YgYGZuYCB0aGF0IGlzIG9ubHkgY2FsbGVkIGB0aW1lYCBtaWxsaXNlY29uZHNcbiAqIGFmdGVyIGl0cyBsYXN0IGludm9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gYmUgZGVib3VuY2VkXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSBtaWxsc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZuLCB0aW1lKSB7XG4gICAgdmFyIHRpbWVyLCBhcmdzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICB9LCB0aW1lKTtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMgYXMgc3RyaW5ncywgcmVwbGFjZSBhbGwgb2YgdGhlbVxuICogd2l0aCBib3VuZCB2ZXJzaW9ucyB0aGF0IHdpbGwgYWx3YXlzIHJlZmVyIHRvIGBjb250ZXh0YCBhcyBgdGhpc2AuIFRoaXNcbiAqIGlzIHVzZWZ1bCBmb3IgY2xhc3NlcyB3aGVyZSBvdGhlcndpc2UgZXZlbnQgYmluZGluZ3Mgd291bGQgcmVhc3NpZ25cbiAqIGB0aGlzYCB0byB0aGUgZXZlbnRlZCBvYmplY3Qgb3Igc29tZSBvdGhlciB2YWx1ZTogdGhpcyBsZXRzIHlvdSBlbnN1cmVcbiAqIHRoZSBgdGhpc2AgdmFsdWUgYWx3YXlzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZm5zIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IGNoYW5nZXMgZnVuY3Rpb25zIGluLXBsYWNlXG4gKiBAZXhhbXBsZVxuICogZnVuY3Rpb24gTXlDbGFzcygpIHtcbiAqICAgYmluZEFsbChbJ29udGltZXInXSwgdGhpcyk7XG4gKiAgIHRoaXMubmFtZSA9ICdUb20nO1xuICogfVxuICogTXlDbGFzcy5wcm90b3R5cGUub250aW1lciA9IGZ1bmN0aW9uKCkge1xuICogICBhbGVydCh0aGlzLm5hbWUpO1xuICogfTtcbiAqIHZhciBteUNsYXNzID0gbmV3IE15Q2xhc3MoKTtcbiAqIHNldFRpbWVvdXQobXlDbGFzcy5vbnRpbWVyLCAxMDApO1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5iaW5kQWxsID0gZnVuY3Rpb24oZm5zLCBjb250ZXh0KSB7XG4gICAgZm5zLmZvckVhY2goZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgY29udGV4dFtmbl0gPSBjb250ZXh0W2ZuXS5iaW5kKGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0cy5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGV4dFtpXSA9PT0gJ2Z1bmN0aW9uJyAmJiBpLmluZGV4T2YoJ19vbicpID09PSAwKSB7XG4gICAgICAgICAgICBjb250ZXh0W2ldID0gY29udGV4dFtpXS5iaW5kKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgdGhlICdvcHRpb25zJyBwcm9wZXJ0eSBvbiBgb2JqYCB3aXRoIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIGBvcHRpb25zYCBhcmd1bWVudC4gUHJvcGVydGllcyBpbiB0aGUgYG9wdGlvbnNgXG4gKiBvYmplY3Qgd2lsbCBvdmVycmlkZSBleGlzdGluZyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgb2Ygb3ZlcnJpZGUgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gZGVyaXZlZCBvcHRpb25zIG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgb3B0aW9ucykge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcbiAgICAgICAgb2JqLm9wdGlvbnMgPSBvYmoub3B0aW9ucyA/IE9iamVjdC5jcmVhdGUob2JqLm9wdGlvbnMpIDoge307XG4gICAgfVxuICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgICAgICBvYmoub3B0aW9uc1tpXSA9IG9wdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBvYmoub3B0aW9ucztcbn07XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5mdW5jdGlvbiBpbmZpeChvcGVyYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiAndCcgKyBvcGVyYXRvciArIFZlY3RvclRpbGVGZWF0dXJlVHlwZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3BbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXScgKyBvcGVyYXRvciArIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHN0cmljdEluZml4KG9wZXJhdG9yKSB7XG4gICAgdmFyIG5vbnN0cmljdEluZml4ID0gaW5maXgob3BlcmF0b3IpO1xuICAgIHJldHVybiBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiBub25zdHJpY3RJbmZpeChfLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAndHlwZW9mKHBbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXSkgPT09IHR5cGVvZignICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJykgJiYgJyArXG4gICAgICAgICAgICAgICAgbm9uc3RyaWN0SW5maXgoXywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG52YXIgb3BlcmF0b3JzID0ge1xuICAgICc9PSc6IGluZml4KCc9PT0nKSxcbiAgICAnIT0nOiBpbmZpeCgnIT09JyksXG4gICAgJz4nOiBzdHJpY3RJbmZpeCgnPicpLFxuICAgICc8Jzogc3RyaWN0SW5maXgoJzwnKSxcbiAgICAnPD0nOiBzdHJpY3RJbmZpeCgnPD0nKSxcbiAgICAnPj0nOiBzdHJpY3RJbmZpeCgnPj0nKSxcbiAgICAnaW4nOiBmdW5jdGlvbihfLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJygnICsgb3BlcmF0b3JzWyc9PSddKF8sIGtleSwgdmFsdWUpICsgJyknO1xuICAgICAgICB9KS5qb2luKCd8fCcpIHx8ICdmYWxzZSc7XG4gICAgfSxcbiAgICAnIWluJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnISgnICsgb3BlcmF0b3JzLmluLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyAnKSc7XG4gICAgfSxcbiAgICAnYW55JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLm1hcChmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnKCcgKyBjb21waWxlKGZpbHRlcikgKyAnKSc7XG4gICAgICAgIH0pLmpvaW4oJ3x8JykgfHwgJ2ZhbHNlJztcbiAgICB9LFxuICAgICdhbGwnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkubWFwKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuICcoJyArIGNvbXBpbGUoZmlsdGVyKSArICcpJztcbiAgICAgICAgfSkuam9pbignJiYnKSB8fCAndHJ1ZSc7XG4gICAgfSxcbiAgICAnbm9uZSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJyEoJyArIG9wZXJhdG9ycy5hbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICcpJztcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBjb21waWxlKGZpbHRlcikge1xuICAgIHJldHVybiBvcGVyYXRvcnNbZmlsdGVyWzBdXS5hcHBseShmaWx0ZXIsIGZpbHRlcik7XG59XG5cbmZ1bmN0aW9uIHRydXRoKCkge1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyIG1hcGJveCBnbCBmaWx0ZXJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gZmlsdGVyLWV2YWx1YXRpbmcgZnVuY3Rpb25cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnV0aDtcbiAgICB2YXIgZmlsdGVyU3RyID0gJ3ZhciBwID0gZi5wcm9wZXJ0aWVzIHx8IGYudGFncyB8fCB7fSwgdCA9IGYudHlwZTsgcmV0dXJuICcgKyBjb21waWxlKGZpbHRlcikgKyAnOyc7XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdmJywgZmlsdGVyU3RyKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBidWZmZXIgPSBvcHRpb25zLmJ1ZmZlcjtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgeiA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgIHggPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICB5ID0gc3RhY2suc2hpZnQoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF0sXG4gICAgICAgICAgICB0aWxlVG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5tYXhab29tID8gMCA6IG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB6LCB4LCB5LCB0aWxlLm51bUZlYXR1cmVzLCB0aWxlLm51bVBvaW50cywgdGlsZS5udW1TaW1wbGlmaWVkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCdjcmVhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3onICsgejtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRzW2tleV0gPSAodGhpcy5zdGF0c1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBnZW9tZXRyeSBpbiB0aWxlIHNvIHRoYXQgd2UgY2FuIGRyaWxsIGRvd24gbGF0ZXIgaWYgd2Ugc3RvcCBub3dcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBmZWF0dXJlcztcblxuICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB0aGUgdGlsZSBpcyBkZWdlbmVyYXRlXG4gICAgICAgIGlmIChpc0NsaXBwZWRTcXVhcmUodGlsZS5mZWF0dXJlcywgZXh0ZW50LCBidWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSAmJiB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogYnVmZmVyIC8gZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBpZiAodGwpIHN0YWNrLnB1c2godGwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgaWYgKGJsKSBzdGFjay5wdXNoKGJsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBpZiAodHIpIHN0YWNrLnB1c2godHIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgaWYgKGJyKSBzdGFjay5wdXNoKGJyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAocGFyZW50LnNvdXJjZSkge1xuICAgICAgICBpZiAoaXNDbGlwcGVkU3F1YXJlKHBhcmVudC5mZWF0dXJlcywgb3B0aW9ucy5leHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUocGFyZW50LCBleHRlbnQpO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgICAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICghdGlsZSB8fCB0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIGdlb21bal0gPSB0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gZ2VvbVtqXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykgcmluZ1trXSA9IHRyYW5zZm9ybVBvaW50KHJpbmdba10sIGV4dGVudCwgejIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUoZmVhdHVyZXMsIGV4dGVudCwgYnVmZmVyKSB7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gZmVhdHVyZS5nZW9tZXRyeVswXVtpXTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goc2ltcGxpZmllZFJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ld0dlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyxcbiAgICAgICAgICAgIG1pbjogW2ZlYXR1cmUubWluWzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1pblsxXV0sXG4gICAgICAgICAgICBtYXg6IFtmZWF0dXJlLm1heFswXSArIG9mZnNldCwgZmVhdHVyZS5tYXhbMV1dXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLmFyZWEgPSBwb2ludHMuYXJlYTtcbiAgICBuZXdQb2ludHMuZGlzdCA9IHBvaW50cy5kaXN0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2goW3BvaW50c1tpXVswXSArIG9mZnNldCwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaV1bMl1dKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBnbC1tYXRyaXggLSBIaWdoIHBlcmZvcm1hbmNlIG1hdHJpeCBhbmQgdmVjdG9yIG9wZXJhdGlvbnNcbiAqIEBhdXRob3IgQnJhbmRvbiBKb25lc1xuICogQGF1dGhvciBDb2xpbiBNYWNLZW56aWUgSVZcbiAqIEB2ZXJzaW9uIDIuMy4wXG4gKi9cblxuLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cbi8vIEVORCBIRUFERVJcblxuZXhwb3J0cy5nbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIik7XG5leHBvcnRzLm1hdDIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0Mi5qc1wiKTtcbmV4cG9ydHMubWF0MmQgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIik7XG5leHBvcnRzLm1hdDMgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKTtcbmV4cG9ydHMubWF0NCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQ0LmpzXCIpO1xuZXhwb3J0cy5xdWF0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3F1YXQuanNcIik7XG5leHBvcnRzLnZlYzIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKTtcbmV4cG9ydHMudmVjMyA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWMzLmpzXCIpO1xuZXhwb3J0cy52ZWM0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIik7IiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQ29tbW9uIHV0aWxpdGllc1xuICogQG5hbWUgZ2xNYXRyaXhcbiAqL1xudmFyIGdsTWF0cml4ID0ge307XG5cbi8vIENvbnN0YW50c1xuZ2xNYXRyaXguRVBTSUxPTiA9IDAuMDAwMDAxO1xuZ2xNYXRyaXguQVJSQVlfVFlQRSA9ICh0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmdsTWF0cml4LlJBTkRPTSA9IE1hdGgucmFuZG9tO1xuXG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7VHlwZX0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgR0xNQVRfQVJSQVlfVFlQRSA9IHR5cGU7XG59XG5cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuXG4vKipcbiogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4qXG4qIEBwYXJhbSB7TnVtYmVyfSBBbmdsZSBpbiBEZWdyZWVzXG4qL1xuZ2xNYXRyaXgudG9SYWRpYW4gPSBmdW5jdGlvbihhKXtcbiAgICAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xNYXRyaXg7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xudmFyIG1hdDIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5tYXQyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGExID0gYVsxXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYTE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVsyXTtcbiAgICAgICAgb3V0WzJdID0gYVsxXTtcbiAgICAgICAgb3V0WzNdID0gYVszXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuXG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcbiAgICBcbiAgICBvdXRbMF0gPSAgYTMgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWExICogZGV0O1xuICAgIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgICBvdXRbM10gPSAgYTAgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgICB2YXIgYTAgPSBhWzBdO1xuICAgIG91dFswXSA9ICBhWzNdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9ICBhMDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0Mi5tdWwgPSBtYXQyLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbm1hdDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGM7XG4gICAgb3V0WzFdID0gcztcbiAgICBvdXRbMl0gPSAtcztcbiAgICBvdXRbM10gPSBjO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5mcm9tU2NhbGluZyA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IHZbMF07XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IHZbMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDIuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQyLmZyb2IgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikpKVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IEwgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXggXG4gKiBAcGFyYW0ge21hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBpbnB1dCBtYXRyaXggdG8gZmFjdG9yaXplXG4gKi9cblxubWF0Mi5MRFUgPSBmdW5jdGlvbiAoTCwgRCwgVSwgYSkgeyBcbiAgICBMWzJdID0gYVsyXS9hWzBdOyBcbiAgICBVWzBdID0gYVswXTsgXG4gICAgVVsxXSA9IGFbMV07IFxuICAgIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07IFxuICAgIHJldHVybiBbTCwgRCwgVV07ICAgICAgIFxufTsgXG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyAyeDMgTWF0cml4XG4gKiBAbmFtZSBtYXQyZFxuICogXG4gKiBAZGVzY3JpcHRpb24gXG4gKiBBIG1hdDJkIGNvbnRhaW5zIHNpeCBlbGVtZW50cyBkZWZpbmVkIGFzOlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eV1cbiAqIDwvcHJlPlxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxuICogPHByZT5cbiAqIFthLCBjLCB0eCxcbiAqICBiLCBkLCB0eSxcbiAqICAwLCAwLCAxXVxuICogPC9wcmU+XG4gKiBUaGUgbGFzdCByb3cgaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxuICovXG52YXIgbWF0MmQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXG4gKlxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cbm1hdDJkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGFhID0gYVswXSwgYWIgPSBhWzFdLCBhYyA9IGFbMl0sIGFkID0gYVszXSxcbiAgICAgICAgYXR4ID0gYVs0XSwgYXR5ID0gYVs1XTtcblxuICAgIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcbiAgICBpZighZGV0KXtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IGFkICogZGV0O1xuICAgIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gICAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICAgIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyZC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICAgIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5tdWwgPSBtYXQyZC5tdWx0aXBseTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBhMCAqICBjICsgYTIgKiBzO1xuICAgIG91dFsxXSA9IGExICogIGMgKyBhMyAqIHM7XG4gICAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xubWF0MmQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTAgKiB2MDtcbiAgICBvdXRbMV0gPSBhMSAqIHYwO1xuICAgIG91dFsyXSA9IGEyICogdjE7XG4gICAgb3V0WzNdID0gYTMgKiB2MTtcbiAgICBvdXRbNF0gPSBhNDtcbiAgICBvdXRbNV0gPSBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xubWF0MmQudHJhbnNsYXRlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sXG4gICAgICAgIHYwID0gdlswXSwgdjEgPSB2WzFdO1xuICAgIG91dFswXSA9IGEwO1xuICAgIG91dFsxXSA9IGExO1xuICAgIG91dFsyXSA9IGEyO1xuICAgIG91dFszXSA9IGEzO1xuICAgIG91dFs0XSA9IGEwICogdjAgKyBhMiAqIHYxICsgYTQ7XG4gICAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLCBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gLXM7XG4gICAgb3V0WzNdID0gYztcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21TY2FsaW5nID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gdlswXTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gdlsxXTtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyZC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmZyb21UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gdlswXTtcbiAgICBvdXRbNV0gPSB2WzFdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQyZC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MmQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0MmQuZnJvYiA9IGZ1bmN0aW9uIChhKSB7IFxuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgMSkpXG59OyBcblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyZDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgM3gzIE1hdHJpeFxuICogQG5hbWUgbWF0M1xuICovXG52YXIgbWF0MyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyAzeDMgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbNF07XG4gICAgb3V0WzRdID0gYVs1XTtcbiAgICBvdXRbNV0gPSBhWzZdO1xuICAgIG91dFs2XSA9IGFbOF07XG4gICAgb3V0WzddID0gYVs5XTtcbiAgICBvdXRbOF0gPSBhWzEwXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5tYXQzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQzIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMTIgPSBhWzVdO1xuICAgICAgICBvdXRbMV0gPSBhWzNdO1xuICAgICAgICBvdXRbMl0gPSBhWzZdO1xuICAgICAgICBvdXRbM10gPSBhMDE7XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGEwMjtcbiAgICAgICAgb3V0WzddID0gYTEyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGFbMV07XG4gICAgICAgIG91dFs0XSA9IGFbNF07XG4gICAgICAgIG91dFs1XSA9IGFbN107XG4gICAgICAgIG91dFs2XSA9IGFbMl07XG4gICAgICAgIG91dFs3XSA9IGFbNV07XG4gICAgICAgIG91dFs4XSA9IGFbOF07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMSxcbiAgICAgICAgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMCxcbiAgICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gICAgaWYgKCFkZXQpIHsgXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYjAxICogZGV0O1xuICAgIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICAgIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIG91dFswXSA9IChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpO1xuICAgIG91dFsxXSA9IChhMDIgKiBhMjEgLSBhMDEgKiBhMjIpO1xuICAgIG91dFsyXSA9IChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICAgIG91dFszXSA9IChhMTIgKiBhMjAgLSBhMTAgKiBhMjIpO1xuICAgIG91dFs0XSA9IChhMDAgKiBhMjIgLSBhMDIgKiBhMjApO1xuICAgIG91dFs1XSA9IChhMDIgKiBhMTAgLSBhMDAgKiBhMTIpO1xuICAgIG91dFs2XSA9IChhMTAgKiBhMjEgLSBhMTEgKiBhMjApO1xuICAgIG91dFs3XSA9IChhMDEgKiBhMjAgLSBhMDAgKiBhMjEpO1xuICAgIG91dFs4XSA9IChhMDAgKiBhMTEgLSBhMDEgKiBhMTApO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQzLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XTtcblxuICAgIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgYjAwID0gYlswXSwgYjAxID0gYlsxXSwgYjAyID0gYlsyXSxcbiAgICAgICAgYjEwID0gYlszXSwgYjExID0gYls0XSwgYjEyID0gYls1XSxcbiAgICAgICAgYjIwID0gYls2XSwgYjIxID0gYls3XSwgYjIyID0gYls4XTtcblxuICAgIG91dFswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcbiAgICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gICAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyO1xuXG4gICAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICAgIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG5cbiAgICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7XG4gICAgb3V0WzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxO1xuICAgIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0My5tdWwgPSBtYXQzLm11bHRpcGx5O1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDMgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNsYXRlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG4gICAgICAgIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuXG4gICAgb3V0WzNdID0gYTEwO1xuICAgIG91dFs0XSA9IGExMTtcbiAgICBvdXRbNV0gPSBhMTI7XG5cbiAgICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDtcbiAgICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MyBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICAgIG91dFsxXSA9IGMgKiBhMDEgKyBzICogYTExO1xuICAgIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuXG4gICAgb3V0WzNdID0gYyAqIGExMCAtIHMgKiBhMDA7XG4gICAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gICAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG5cbiAgICBvdXRbNl0gPSBhMjA7XG4gICAgb3V0WzddID0gYTIxO1xuICAgIG91dFs4XSA9IGEyMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICoqL1xubWF0My5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV07XG5cbiAgICBvdXRbMF0gPSB4ICogYVswXTtcbiAgICBvdXRbMV0gPSB4ICogYVsxXTtcbiAgICBvdXRbMl0gPSB4ICogYVsyXTtcblxuICAgIG91dFszXSA9IHkgKiBhWzNdO1xuICAgIG91dFs0XSA9IHkgKiBhWzRdO1xuICAgIG91dFs1XSA9IHkgKiBhWzVdO1xuXG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tVHJhbnNsYXRpb24gPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSB2WzBdO1xuICAgIG91dFs3XSA9IHZbMV07XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYztcbiAgICBvdXRbMV0gPSBzO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSAtcztcbiAgICBvdXRbNF0gPSBjO1xuICAgIG91dFs1XSA9IDA7XG5cbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcblxuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gdlsxXTtcbiAgICBvdXRbNV0gPSAwO1xuXG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cbm1hdDMuZnJvbU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSBhWzJdO1xuICAgIG91dFs0XSA9IGFbM107XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IGFbNF07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7cXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFszXSA9IHl4IC0gd3o7XG4gICAgb3V0WzZdID0genggKyB3eTtcblxuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gICAgb3V0WzddID0genkgLSB3eDtcblxuICAgIG91dFsyXSA9IHp4IC0gd3k7XG4gICAgb3V0WzVdID0genkgKyB3eDtcbiAgICBvdXRbOF0gPSAxIC0geHggLSB5eTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5tYXQzLm5vcm1hbEZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkgeyBcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcblxuICAgIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICAgIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICAgIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuXG4gICAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBcbiAgICAgICAgICAgICAgICAgICAgYVs2XSArICcsICcgKyBhWzddICsgJywgJyArIGFbOF0gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQzLmZyb2IgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgTWF0aC5wb3coYVs2XSwgMikgKyBNYXRoLnBvdyhhWzddLCAyKSArIE1hdGgucG93KGFbOF0sIDIpKSlcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQzO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0eDQgTWF0cml4XG4gKiBAbmFtZSBtYXQ0XG4gKi9cbnZhciBtYXQ0ID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XG4gKlxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xubWF0NC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xubWF0NC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgICAgICBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGEwMTtcbiAgICAgICAgb3V0WzZdID0gYVs5XTtcbiAgICAgICAgb3V0WzddID0gYVsxM107XG4gICAgICAgIG91dFs4XSA9IGEwMjtcbiAgICAgICAgb3V0WzldID0gYTEyO1xuICAgICAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgICAgIG91dFsxMl0gPSBhMDM7XG4gICAgICAgIG91dFsxM10gPSBhMTM7XG4gICAgICAgIG91dFsxNF0gPSBhMjM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGFbMV07XG4gICAgICAgIG91dFs1XSA9IGFbNV07XG4gICAgICAgIG91dFs2XSA9IGFbOV07XG4gICAgICAgIG91dFs3XSA9IGFbMTNdO1xuICAgICAgICBvdXRbOF0gPSBhWzJdO1xuICAgICAgICBvdXRbOV0gPSBhWzZdO1xuICAgICAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzEyXSA9IGFbM107XG4gICAgICAgIG91dFsxM10gPSBhWzddO1xuICAgICAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMixcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICAgIGlmICghZGV0KSB7IFxuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICAgIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICAgIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICAgIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICAgIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICAgIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICAgIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICAgIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIG91dFswXSAgPSAgKGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gICAgb3V0WzFdICA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgICBvdXRbMl0gID0gIChhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFszXSAgPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzRdICA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbNV0gID0gIChhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFs2XSAgPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzddICA9ICAoYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbOF0gID0gIChhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkpO1xuICAgIG91dFs5XSAgPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gICAgb3V0WzEwXSA9ICAoYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gICAgb3V0WzEzXSA9ICAoYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpKTtcbiAgICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICAgIG91dFsxNV0gPSAgKGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDQuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDQubXVsID0gbWF0NC5tdWx0aXBseTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xubWF0NC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgdmFyIHggPSBheGlzWzBdLCB5ID0gYXhpc1sxXSwgeiA9IGF4aXNbMl0sXG4gICAgICAgIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopLFxuICAgICAgICBzLCBjLCB0LFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzLFxuICAgICAgICBiMDAsIGIwMSwgYjAyLFxuICAgICAgICBiMTAsIGIxMSwgYjEyLFxuICAgICAgICBiMjAsIGIyMSwgYjIyO1xuXG4gICAgaWYgKE1hdGguYWJzKGxlbikgPCBnbE1hdHJpeC5FUFNJTE9OKSB7IHJldHVybiBudWxsOyB9XG4gICAgXG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4ICo9IGxlbjtcbiAgICB5ICo9IGxlbjtcbiAgICB6ICo9IGxlbjtcblxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcblxuICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcbiAgICBiMDAgPSB4ICogeCAqIHQgKyBjOyBiMDEgPSB5ICogeCAqIHQgKyB6ICogczsgYjAyID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7IGIxMSA9IHkgKiB5ICogdCArIGM7IGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIGIyMCA9IHggKiB6ICogdCArIHkgKiBzOyBiMjEgPSB5ICogeiAqIHQgLSB4ICogczsgYjIyID0geiAqIHogKiB0ICsgYztcblxuICAgIC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICAgIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gICAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICAgIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gICAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICAgIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gICAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICAgIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gICAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlWCA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sXG4gICAgICAgIGEyMSA9IGFbOV0sXG4gICAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgICBhMjMgPSBhWzExXTtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgICAgICBvdXRbMF0gID0gYVswXTtcbiAgICAgICAgb3V0WzFdICA9IGFbMV07XG4gICAgICAgIG91dFsyXSAgPSBhWzJdO1xuICAgICAgICBvdXRbM10gID0gYVszXTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gICAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5yb3RhdGVZID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTAwID0gYVswXSxcbiAgICAgICAgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTAzID0gYVszXSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICAgIG91dFs0XSAgPSBhWzRdO1xuICAgICAgICBvdXRbNV0gID0gYVs1XTtcbiAgICAgICAgb3V0WzZdICA9IGFbNl07XG4gICAgICAgIG91dFs3XSAgPSBhWzddO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICAgIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xuICAgIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICAgIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICAgIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xuICAgIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICAgIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLFxuICAgICAgICBhMTEgPSBhWzVdLFxuICAgICAgICBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgICAgICBvdXRbOF0gID0gYVs4XTtcbiAgICAgICAgb3V0WzldICA9IGFbOV07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTFdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xuICAgIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICAgIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICAgIG91dFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xuICAgIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gdlsxXTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSB2WzJdO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGUgYXJvdW5kIGEgZ2l2ZW4gYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkLCBheGlzKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdLFxuICAgICAgICBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KSxcbiAgICAgICAgcywgYywgdDtcbiAgICBcbiAgICBpZiAoTWF0aC5hYnMobGVuKSA8IGdsTWF0cml4LkVQU0lMT04pIHsgcmV0dXJuIG51bGw7IH1cbiAgICBcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHggKj0gbGVuO1xuICAgIHkgKj0gbGVuO1xuICAgIHogKj0gbGVuO1xuICAgIFxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcbiAgICBcbiAgICAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gICAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gICAgb3V0WzJdID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgICBvdXRbNV0gPSB5ICogeSAqIHQgKyBjO1xuICAgIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geCAqIHogKiB0ICsgeSAqIHM7XG4gICAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gICAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21YUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSAgPSAxO1xuICAgIG91dFsxXSAgPSAwO1xuICAgIG91dFsyXSAgPSAwO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gYztcbiAgICBvdXRbNl0gPSBzO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAtcztcbiAgICBvdXRbMTBdID0gYztcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVlSb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBcbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdICA9IGM7XG4gICAgb3V0WzFdICA9IDA7XG4gICAgb3V0WzJdICA9IC1zO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gcztcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSBjO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVaKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tWlJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIFxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gID0gYztcbiAgICBvdXRbMV0gID0gcztcbiAgICBvdXRbMl0gID0gMDtcbiAgICBvdXRbM10gID0gMDtcbiAgICBvdXRbNF0gPSAtcztcbiAgICBvdXRbNV0gPSBjO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIGFuZCB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgdmFyIHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uID0gZnVuY3Rpb24gKG91dCwgcSwgdikge1xuICAgIC8vIFF1YXRlcm5pb24gbWF0aFxuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeHkgPSB4ICogeTIsXG4gICAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgeXogPSB5ICogejIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgICBvdXRbMV0gPSB4eSArIHd6O1xuICAgIG91dFsyXSA9IHh6IC0gd3k7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4eSAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gICAgb3V0WzZdID0geXogKyB3eDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHh6ICsgd3k7XG4gICAgb3V0WzldID0geXogLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICB2YXIgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUgPSBmdW5jdGlvbiAob3V0LCBxLCB2LCBzKSB7XG4gICAgLy8gUXVhdGVybmlvbiBtYXRoXG4gICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdLFxuICAgICAgICB4MiA9IHggKyB4LFxuICAgICAgICB5MiA9IHkgKyB5LFxuICAgICAgICB6MiA9IHogKyB6LFxuXG4gICAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgICB4eSA9IHggKiB5MixcbiAgICAgICAgeHogPSB4ICogejIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB5eiA9IHkgKiB6MixcbiAgICAgICAgenogPSB6ICogejIsXG4gICAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgICB3eSA9IHcgKiB5MixcbiAgICAgICAgd3ogPSB3ICogejIsXG4gICAgICAgIHN4ID0gc1swXSxcbiAgICAgICAgc3kgPSBzWzFdLFxuICAgICAgICBzeiA9IHNbMl07XG5cbiAgICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgICBvdXRbMV0gPSAoeHkgKyB3eikgKiBzeDtcbiAgICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9ICh4eSAtIHd6KSAqIHN5O1xuICAgIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICAgIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gICAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gICAgb3V0WzEwXSA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSB2WzBdO1xuICAgIG91dFsxM10gPSB2WzFdO1xuICAgIG91dFsxNF0gPSB2WzJdO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlLCByb3RhdGluZyBhbmQgc2NhbGluZyBhcm91bmQgdGhlIGdpdmVuIG9yaWdpblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG5lZ2F0aXZlT3JpZ2luKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBvIFRoZSBvcmlnaW4gdmVjdG9yIGFyb3VuZCB3aGljaCB0byBzY2FsZSBhbmQgcm90YXRlXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbiA9IGZ1bmN0aW9uIChvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgIHgyID0geCArIHgsXG4gICAgICB5MiA9IHkgKyB5LFxuICAgICAgejIgPSB6ICsgeixcblxuICAgICAgeHggPSB4ICogeDIsXG4gICAgICB4eSA9IHggKiB5MixcbiAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgeXkgPSB5ICogeTIsXG4gICAgICB5eiA9IHkgKiB6MixcbiAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgd3ggPSB3ICogeDIsXG4gICAgICB3eSA9IHcgKiB5MixcbiAgICAgIHd6ID0gdyAqIHoyLFxuICAgICAgXG4gICAgICBzeCA9IHNbMF0sXG4gICAgICBzeSA9IHNbMV0sXG4gICAgICBzeiA9IHNbMl0sXG5cbiAgICAgIG94ID0gb1swXSxcbiAgICAgIG95ID0gb1sxXSxcbiAgICAgIG96ID0gb1syXTtcbiAgICAgIFxuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0WzBdICogb3ggKyBvdXRbNF0gKiBveSArIG91dFs4XSAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXRbMV0gKiBveCArIG91dFs1XSAqIG95ICsgb3V0WzldICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dFsyXSAqIG94ICsgb3V0WzZdICogb3kgKyBvdXRbMTBdICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgICAgICAgXG4gIHJldHVybiBvdXQ7XG59O1xuXG5tYXQ0LmZyb21RdWF0ID0gZnVuY3Rpb24gKG91dCwgcSkge1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeXggPSB5ICogeDIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB6eCA9IHogKiB4MixcbiAgICAgICAgenkgPSB6ICogeTIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gICAgb3V0WzFdID0geXggKyB3ejtcbiAgICBvdXRbMl0gPSB6eCAtIHd5O1xuICAgIG91dFszXSA9IDA7XG5cbiAgICBvdXRbNF0gPSB5eCAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSB4eCAtIHp6O1xuICAgIG91dFs2XSA9IHp5ICsgd3g7XG4gICAgb3V0WzddID0gMDtcblxuICAgIG91dFs4XSA9IHp4ICsgd3k7XG4gICAgb3V0WzldID0genkgLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtIHh4IC0geXk7XG4gICAgb3V0WzExXSA9IDA7XG5cbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZydXN0dW0gPSBmdW5jdGlvbiAob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSAobmVhciAqIDIpICogcmw7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAobmVhciAqIDIpICogdGI7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7XG4gICAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoZmFyICogbmVhciAqIDIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZSA9IGZ1bmN0aW9uIChvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBvZiB2aWV3LlxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyA9IGZ1bmN0aW9uIChvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gICAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkvMTgwLjApLFxuICAgICAgICBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJLzE4MC4wKSxcbiAgICAgICAgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pLFxuICAgICAgICB5U2NhbGUgPSAyLjAgLyAodXBUYW4gKyBkb3duVGFuKTtcblxuICAgIG91dFswXSA9IHhTY2FsZTtcbiAgICBvdXRbMV0gPSAwLjA7XG4gICAgb3V0WzJdID0gMC4wO1xuICAgIG91dFszXSA9IDAuMDtcbiAgICBvdXRbNF0gPSAwLjA7XG4gICAgb3V0WzVdID0geVNjYWxlO1xuICAgIG91dFs2XSA9IDAuMDtcbiAgICBvdXRbN10gPSAwLjA7XG4gICAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gICAgb3V0WzldID0gKCh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41KTtcbiAgICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMV0gPSAtMS4wO1xuICAgIG91dFsxMl0gPSAwLjA7XG4gICAgb3V0WzEzXSA9IDAuMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIpIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxNV0gPSAwLjA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm9ydGhvID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCksXG4gICAgICAgIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gLTIgKiBscjtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IC0yICogYnQ7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMiAqIG5mO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICAgIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICAgIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubG9va0F0ID0gZnVuY3Rpb24gKG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCBnbE1hdHJpeC5FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IGdsTWF0cml4LkVQU0lMT04gJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgICAgICByZXR1cm4gbWF0NC5pZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIGFbNl0gKyAnLCAnICsgYVs3XSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzhdICsgJywgJyArIGFbOV0gKyAnLCAnICsgYVsxMF0gKyAnLCAnICsgYVsxMV0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0NC5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSArIE1hdGgucG93KGFbOV0sIDIpICsgTWF0aC5wb3coYVsxMF0sIDIpICsgTWF0aC5wb3coYVsxMV0sIDIpICsgTWF0aC5wb3coYVsxMl0sIDIpICsgTWF0aC5wb3coYVsxM10sIDIpICsgTWF0aC5wb3coYVsxNF0sIDIpICsgTWF0aC5wb3coYVsxNV0sIDIpICkpXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWF0NDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcbnZhciBtYXQzID0gcmVxdWlyZShcIi4vbWF0My5qc1wiKTtcbnZhciB2ZWMzID0gcmVxdWlyZShcIi4vdmVjMy5qc1wiKTtcbnZhciB2ZWM0ID0gcmVxdWlyZShcIi4vdmVjNC5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgUXVhdGVybmlvblxuICogQG5hbWUgcXVhdFxuICovXG52YXIgcXVhdCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cbnF1YXQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRpb25UbyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLDAsMCk7XG4gICAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLDEsMCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcbiAgICAgICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgaWYgKHZlYzMubGVuZ3RoKHRtcHZlYzMpIDwgMC4wMDAwMDEpXG4gICAgICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICAgICAgICBxdWF0LnNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgb3V0WzBdID0gMDtcbiAgICAgICAgICAgIG91dFsxXSA9IDA7XG4gICAgICAgICAgICBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgb3V0WzNdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgICAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICAgICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNldEF4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICAgICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07XG5cbiAgICAgICAgbWF0clsxXSA9IHVwWzBdO1xuICAgICAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgICAgIG1hdHJbN10gPSB1cFsyXTtcblxuICAgICAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICAgICAgbWF0cls4XSA9IC12aWV3WzJdO1xuXG4gICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIHF1YXQuZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY2xvbmUgPSB2ZWM0LmNsb25lO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY29weSA9IHZlYzQuY29weTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zZXQgPSB2ZWM0LnNldDtcblxuLyoqXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqKi9cbnF1YXQuc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0LCBheGlzLCByYWQpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICAgIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICAgIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmFkZCA9IHZlYzQuYWRkO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm11bCA9IHF1YXQubXVsdGlwbHk7XG5cbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zY2FsZSA9IHZlYzQuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ4ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF6ICogYng7XG4gICAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ5ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF5ICogYnk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYno7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG5cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZG90ID0gdmVjNC5kb3Q7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVycCA9IHZlYzQubGVycDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zbGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICAvLyBiZW5jaG1hcmtzOlxuICAgIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICB2YXIgICAgICAgIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxO1xuXG4gICAgLy8gY2FsYyBjb3NpbmVcbiAgICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7XG4gICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG4gICAgaWYgKCBjb3NvbSA8IDAuMCApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICggKDEuMCAtIGNvc29tKSA+IDAuMDAwMDAxICkge1xuICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICAgICAgb21lZ2EgID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICAgICAgc2lub20gID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICAgICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIH0gZWxzZSB7ICAgICAgICBcbiAgICAgICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZSBcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgICAgICBzY2FsZTEgPSB0O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG4gICAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gICAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuc3FsZXJwID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlbXAxID0gcXVhdC5jcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gcXVhdC5jcmVhdGUoKTtcbiAgXG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgcXVhdC5zbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgcXVhdC5zbGVycCh0ZW1wMiwgYiwgYywgdCk7XG4gICAgcXVhdC5zbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICBcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpKTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICBkb3QgPSBhMCphMCArIGExKmExICsgYTIqYTIgKyBhMyphMyxcbiAgICAgICAgaW52RG90ID0gZG90ID8gMS4wL2RvdCA6IDA7XG4gICAgXG4gICAgLy8gVE9ETzogV291bGQgYmUgZmFzdGVyIHRvIHJldHVybiBbMCwwLDAsMF0gaW1tZWRpYXRlbHkgaWYgZG90ID09IDBcblxuICAgIG91dFswXSA9IC1hMCppbnZEb3Q7XG4gICAgb3V0WzFdID0gLWExKmludkRvdDtcbiAgICBvdXRbMl0gPSAtYTIqaW52RG90O1xuICAgIG91dFszXSA9IGEzKmludkRvdDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBxdWF0XG4gKiBJZiB0aGUgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5sZW5ndGggPSB2ZWM0Lmxlbmd0aDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVuID0gcXVhdC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNxdWFyZWRMZW5ndGggPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zcXJMZW4gPSBxdWF0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5ub3JtYWxpemUgPSB2ZWM0Lm5vcm1hbGl6ZTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge21hdDN9IG0gcm90YXRpb24gbWF0cml4XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5mcm9tTWF0MyA9IGZ1bmN0aW9uKG91dCwgbSkge1xuICAgIC8vIEFsZ29yaXRobSBpbiBLZW4gU2hvZW1ha2UncyBhcnRpY2xlIGluIDE5ODcgU0lHR1JBUEggY291cnNlIG5vdGVzXG4gICAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gICAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcbiAgICB2YXIgZlJvb3Q7XG5cbiAgICBpZiAoIGZUcmFjZSA+IDAuMCApIHtcbiAgICAgICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChmVHJhY2UgKyAxLjApOyAgLy8gMndcbiAgICAgICAgb3V0WzNdID0gMC41ICogZlJvb3Q7XG4gICAgICAgIGZSb290ID0gMC41L2ZSb290OyAgLy8gMS8oNHcpXG4gICAgICAgIG91dFswXSA9IChtWzVdLW1bN10pKmZSb290O1xuICAgICAgICBvdXRbMV0gPSAobVs2XS1tWzJdKSpmUm9vdDtcbiAgICAgICAgb3V0WzJdID0gKG1bMV0tbVszXSkqZlJvb3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gfHd8IDw9IDEvMlxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIGlmICggbVs0XSA+IG1bMF0gKVxuICAgICAgICAgIGkgPSAxO1xuICAgICAgICBpZiAoIG1bOF0gPiBtW2kqMytpXSApXG4gICAgICAgICAgaSA9IDI7XG4gICAgICAgIHZhciBqID0gKGkrMSklMztcbiAgICAgICAgdmFyIGsgPSAoaSsyKSUzO1xuICAgICAgICBcbiAgICAgICAgZlJvb3QgPSBNYXRoLnNxcnQobVtpKjMraV0tbVtqKjMral0tbVtrKjMra10gKyAxLjApO1xuICAgICAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDtcbiAgICAgICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICAgICAgb3V0WzNdID0gKG1baiozK2tdIC0gbVtrKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtqXSA9IChtW2oqMytpXSArIG1baSozK2pdKSAqIGZSb290O1xuICAgICAgICBvdXRba10gPSAobVtrKjMraV0gKyBtW2kqMytrXSkgKiBmUm9vdDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnF1YXQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3F1YXQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHF1YXQ7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMyXG4gKi9cbnZhciB2ZWMyID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxuICpcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xudmVjMi5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHkpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuc3ViID0gdmVjMi5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5tdWwgPSB2ZWMyLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGl2ID0gdmVjMi5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGlzdCA9IHZlYzIuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMyLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckRpc3QgPSB2ZWMyLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMyLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5sZW4gPSB2ZWMyLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMyLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zcXJMZW4gPSB2ZWMyLnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeTtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjMi5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzIuY3Jvc3MgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gICAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWMyLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzI7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDMgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMzXG4gKi9cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmhlcm1pdGUgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDEsXG4gICAgICBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQsXG4gICAgICBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKSxcbiAgICAgIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgXG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIFxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuYmV6aWVyID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0LFxuICAgICAgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3IsXG4gICAgICBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvLFxuICAgICAgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIFxuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICBcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gICAgdmFyIHogPSAoZ2xNYXRyaXguUkFORE9NKCkgKiAyLjApIC0gMS4wO1xuICAgIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wLXoqeikgKiBzY2FsZTtcblxuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICAgIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICAgIHcgPSB3IHx8IDEuMDtcbiAgICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gdGhlIDN4MyBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG4gICAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICAgIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIC8vIGJlbmNobWFya3M6IGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3RhdGVYID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBjKXtcbiAgIHZhciBwID0gW10sIHI9W107XG5cdCAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXHQgIHBbMF0gPSBhWzBdIC0gYlswXTtcblx0ICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuXG5cdCAgLy9wZXJmb3JtIHJvdGF0aW9uXG5cdCAgclswXSA9IHBbMF07XG5cdCAgclsxXSA9IHBbMV0qTWF0aC5jb3MoYykgLSBwWzJdKk1hdGguc2luKGMpO1xuXHQgIHJbMl0gPSBwWzFdKk1hdGguc2luKGMpICsgcFsyXSpNYXRoLmNvcyhjKTtcblxuXHQgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblx0ICBvdXRbMF0gPSByWzBdICsgYlswXTtcblx0ICBvdXRbMV0gPSByWzFdICsgYlsxXTtcblx0ICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFsyXSpNYXRoLnNpbihjKSArIHBbMF0qTWF0aC5jb3MoYyk7XG4gIFx0clsxXSA9IHBbMV07XG4gIFx0clsyXSA9IHBbMl0qTWF0aC5jb3MoYykgLSBwWzBdKk1hdGguc2luKGMpO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFswXSpNYXRoLmNvcyhjKSAtIHBbMV0qTWF0aC5zaW4oYyk7XG4gIFx0clsxXSA9IHBbMF0qTWF0aC5zaW4oYykgKyBwWzFdKk1hdGguY29zKGMpO1xuICBcdHJbMl0gPSBwWzJdO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07IGFbaSsyXSA9IHZlY1syXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbnZlYzMuYW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7XG4gICBcbiAgICB2YXIgdGVtcEEgPSB2ZWMzLmZyb21WYWx1ZXMoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgdmFyIHRlbXBCID0gdmVjMy5mcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuIFxuICAgIHZlYzMubm9ybWFsaXplKHRlbXBBLCB0ZW1wQSk7XG4gICAgdmVjMy5ub3JtYWxpemUodGVtcEIsIHRlbXBCKTtcbiBcbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9ICAgICBcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJyknO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWMzO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjNFxuICovXG52YXIgdmVjNCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cbnZlYzQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnN1YiA9IHZlYzQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubXVsID0gdmVjNC5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpdiA9IHZlYzQuZGl2aWRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzQuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeiArIHcqdyk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpc3QgPSB2ZWM0LmRpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjNC5zcXVhcmVkRGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdLFxuICAgICAgICB6ID0gYlsyXSAtIGFbMl0sXG4gICAgICAgIHcgPSBiWzNdIC0gYVszXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuc3FyRGlzdCA9IHZlYzQuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzQubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnogKyB3KncpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubGVuID0gdmVjNC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xudmVjNC5zcXVhcmVkTGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqeiArIHcqdztcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zcXJMZW4gPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSAtYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0geCAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0geSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0geiAqIGxlbjtcbiAgICAgICAgb3V0WzNdID0gdyAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWM0LmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5sZXJwID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgdCkge1xuICAgIHZhciBheCA9IGFbMF0sXG4gICAgICAgIGF5ID0gYVsxXSxcbiAgICAgICAgYXogPSBhWzJdLFxuICAgICAgICBhdyA9IGFbM107XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gICAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gICAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgLy9UT0RPOiBUaGlzIGlzIGEgcHJldHR5IGF3ZnVsIHdheSBvZiBkb2luZyB0aGlzLiBGaW5kIHNvbWV0aGluZyBiZXR0ZXIuXG4gICAgb3V0WzBdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzFdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzJdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgb3V0WzNdID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gICAgdmVjNC5ub3JtYWxpemUob3V0LCBvdXQpO1xuICAgIHZlYzQuc2NhbGUob3V0LCBvdXQsIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBtYXQ0LlxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sIHcgPSBhWzNdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gICAgb3V0WzJdID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdICogdztcbiAgICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3F1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnRyYW5zZm9ybVF1YXQgPSBmdW5jdGlvbihvdXQsIGEsIHEpIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWM0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWM0LiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjNHMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjNC5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdOyB2ZWNbM10gPSBhW2krM107XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTsgYVtpKzJdID0gdmVjWzJdOyBhW2krM10gPSB2ZWNbM107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWM0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWM0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWM0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIoYSwgYiwgdCkge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVBcnJheShhLCBiLCB0KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBpbnRlcnBvbGF0ZU51bWJlcihhW2ldLCBiW2ldLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0c1snaW50ZXJwb2xhdGVkJ10gPSBmdW5jdGlvbihmKSB7XG4gICAgaWYgKCFmLnN0b3BzKSB7XG4gICAgICAgIHJldHVybiBjb25zdGFudChmKTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcHMgPSBmLnN0b3BzLFxuICAgICAgICBiYXNlID0gZi5iYXNlIHx8IDEsXG4gICAgICAgIGludGVycG9sYXRlID0gQXJyYXkuaXNBcnJheShzdG9wc1swXVsxXSkgPyBpbnRlcnBvbGF0ZUFycmF5IDogaW50ZXJwb2xhdGVOdW1iZXI7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oeikge1xuICAgICAgICAvLyBmaW5kIHRoZSB0d28gc3RvcHMgd2hpY2ggdGhlIGN1cnJlbnQgeiBpcyBiZXR3ZWVuXG4gICAgICAgIHZhciBsb3csIGhpZ2g7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0b3AgPSBzdG9wc1tpXTtcblxuICAgICAgICAgICAgaWYgKHN0b3BbMF0gPD0geikge1xuICAgICAgICAgICAgICAgIGxvdyA9IHN0b3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wWzBdID4geikge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBzdG9wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvdyAmJiBoaWdoKSB7XG4gICAgICAgICAgICB2YXIgem9vbURpZmYgPSBoaWdoWzBdIC0gbG93WzBdLFxuICAgICAgICAgICAgICAgIHpvb21Qcm9ncmVzcyA9IHogLSBsb3dbMF0sXG5cbiAgICAgICAgICAgICAgICB0ID0gYmFzZSA9PT0gMSA/XG4gICAgICAgICAgICAgICAgem9vbVByb2dyZXNzIC8gem9vbURpZmYgOlxuICAgICAgICAgICAgICAgIChNYXRoLnBvdyhiYXNlLCB6b29tUHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgem9vbURpZmYpIC0gMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShsb3dbMV0sIGhpZ2hbMV0sIHQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobG93KSB7XG4gICAgICAgICAgICByZXR1cm4gbG93WzFdO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaGlnaCkge1xuICAgICAgICAgICAgcmV0dXJuIGhpZ2hbMV07XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuZXhwb3J0c1sncGllY2V3aXNlLWNvbnN0YW50J10gPSBmdW5jdGlvbihmKSB7XG4gICAgaWYgKCFmLnN0b3BzKSB7XG4gICAgICAgIHJldHVybiBjb25zdGFudChmKTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcHMgPSBmLnN0b3BzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHopIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHN0b3BzW2ldWzBdID4geikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG9wc1tpID09PSAwID8gMCA6IGkgLSAxXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVsxXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmZXJlbmNlID0gcmVxdWlyZSgnLi4vLi4vcmVmZXJlbmNlL2xhdGVzdC5qcycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9wYXJzZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHlsZSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShzdHlsZSwgcmVmZXJlbmNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoJ3V0aWwnKS5mb3JtYXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3R5bGUsIHJlZmVyZW5jZSkge1xuXG4gICAgdmFyIGNvbnN0YW50cyA9IHN0eWxlLmNvbnN0YW50cyB8fCB7fSxcbiAgICAgICAgbGF5ZXJzID0ge30sXG4gICAgICAgIGVycm9ycyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gZXJyb3Ioa2V5LCB2YWwgLyosIG1lc3NhZ2UsIC4uLiovKSB7XG4gICAgICAgIHZhciBlcnIgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiAoa2V5ID8ga2V5ICsgJzogJyA6ICcnKSArXG4gICAgICAgICAgICBmb3JtYXQuYXBwbHkoZm9ybWF0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsLl9fbGluZV9fKSB7XG4gICAgICAgICAgICBlcnIubGluZSA9IHZhbC5fX2xpbmVfXztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgfVxuXG4gICAgLy8gTWFpbiByZWN1cnNpdmUgdmFsaWRhdGlvbiBmdW5jdGlvbi4gVHJhY2tzOlxuICAgIC8vXG4gICAgLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbiAgICAvLyAgIGZvciBtb3JlIGluZm9ybWF0aXZlIGVycm9yIHJlcG9ydGluZy5cbiAgICAvLyAtIHZhbDogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuICAgIC8vICAgaGlnaCBsZXZlbCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBkZXNjZW5kZWQgaW50byBkZWVwZXIgb3IgYSBzaW1wbGVcbiAgICAvLyAgIHNjYWxhciB2YWx1ZS5cbiAgICAvLyAtIHNwZWM6IGN1cnJlbnQgc3BlYyBiZWluZyBldmFsdWF0ZWQuIFRyYWNrcyB2YWwuXG4gICAgLy9cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShrZXksIHZhbCwgc3BlYykge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcblxuICAgICAgICAvLyBDb25zdGFudHNcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbFswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICBpZiAoISh2YWwgaW4gY29uc3RhbnRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ2NvbnN0YW50IFwiJXNcIiBub3QgZm91bmQnLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsID0gY29uc3RhbnRzW3ZhbF07XG4gICAgICAgICAgICB0eXBlID0gdHlwZW9mXyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRnVuY3Rpb25zXG4gICAgICAgIGlmIChzcGVjLmZ1bmN0aW9uICYmIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGUuZnVuY3Rpb24oa2V5LCB2YWwsIHNwZWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwZWMudHlwZSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9IHZhbGlkYXRlW3NwZWMudHlwZV07XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvcihrZXksIHZhbCwgc3BlYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGVjID0gcmVmZXJlbmNlW3NwZWMudHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHNwZWMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlLmNvbnN0YW50cyA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mXyh2YWwpO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ29iamVjdCBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGsgaW4gdmFsKSB7XG4gICAgICAgICAgICBpZiAoa1swXSAhPT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJy4nICsgaywgdmFsW2tdLCAnY29uc3RhbnRzIG11c3Qgc3RhcnQgd2l0aCBcIkBcIicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLnNvdXJjZSA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmICghdmFsLnR5cGUpIHtcbiAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlID0gdW5idW5kbGUodmFsLnR5cGUpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgICAgICAgICBjYXNlICdyYXN0ZXInOlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLm9iamVjdChrZXksIHZhbCwgcmVmZXJlbmNlLnNvdXJjZV90aWxlKTtcblxuICAgICAgICAgICAgICAgIGlmICgndXJsJyBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbJ3R5cGUnLCAndXJsJywgJ3RpbGVTaXplJ10uaW5kZXhPZihwcm9wKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXkgKyAnLicgKyBwcm9wLCB2YWxbcHJvcF0sICdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICAgICAgICAgICAgdmFsaWRhdGUub2JqZWN0KGtleSwgdmFsLCByZWZlcmVuY2Uuc291cmNlX2dlb2pzb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLm9iamVjdChrZXksIHZhbCwgcmVmZXJlbmNlLnNvdXJjZV92aWRlbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJy50eXBlJywgdmFsLnR5cGUsIHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdnZW9qc29uJywgJ3ZpZGVvJ119KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YWxpZGF0ZS5sYXllciA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmICghdmFsLnR5cGUgJiYgIXZhbC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlID0gdW5idW5kbGUodmFsLnR5cGUpLFxuICAgICAgICAgICAgcmVmID0gdW5idW5kbGUodmFsLnJlZik7XG5cbiAgICAgICAgaWYgKHZhbC5pZCkge1xuICAgICAgICAgICAgaWYgKGxheWVyc1t2YWwuaWRdKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwuaWQsICdkdXBsaWNhdGUgbGF5ZXIgaWQgXCIlc1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAlZCcsIHZhbC5pZCwgbGF5ZXJzW3ZhbC5pZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXllcnNbdmFsLmlkXSA9IHZhbC5pZC5fX2xpbmVfXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncmVmJyBpbiB2YWwpIHtcbiAgICAgICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHAgaW4gdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsW3BdLCAnXCIlc1wiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnMnLCBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHBhcmVudDtcblxuICAgICAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24obGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuaWQgPT0gcmVmKSBwYXJlbnQgPSBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnJlZiwgJ3JlZiBsYXllciBcIiVzXCIgbm90IGZvdW5kJywgcmVmKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnJlZikge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnJlZiwgJ3JlZiBjYW5ub3QgcmVmZXJlbmNlIGFub3RoZXIgcmVmIGxheWVyJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBwYXJlbnQudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgICAgIGlmICghdmFsLnNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzW3ZhbC5zb3VyY2VdO1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnNvdXJjZSwgJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJywgdmFsLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UudHlwZSA9PSAndmVjdG9yJyAmJiB0eXBlID09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLnNvdXJjZSwgJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnLCB2YWwuaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT0gJ3Jhc3RlcicgJiYgdHlwZSAhPSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbC5zb3VyY2UsICdsYXllciBcIiVzXCIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlJywgdmFsLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHJlZmVyZW5jZS5sYXllciwge1xuICAgICAgICAgICAgZmlsdGVyOiB2YWxpZGF0ZS5maWx0ZXIsXG4gICAgICAgICAgICBsYXlvdXQ6IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwZWMgPSByZWZlcmVuY2VbJ2xheW91dF8nICsgdHlwZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgJiYgc3BlYyAmJiB2YWxpZGF0ZShrZXksIHZhbCwgc3BlYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQ6IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwZWMgPSByZWZlcmVuY2VbJ3BhaW50XycgKyB0eXBlXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSAmJiBzcGVjICYmIHZhbGlkYXRlKGtleSwgdmFsLCBzcGVjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLm9iamVjdCA9IGZ1bmN0aW9uIChrZXksIHZhbCwgc3BlYywgdmFsaWRhdG9ycykge1xuICAgICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycyB8fCB7fTtcblxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3Ioa2V5LCB2YWwsICdvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrIGluIHZhbCkge1xuICAgICAgICAgICAgdmFyIHNwZWNrZXkgPSBrLnNwbGl0KCcuJylbMF07IC8vIHRyZWF0ICdwYWludC4qJyBhcyAncGFpbnQnXG4gICAgICAgICAgICB2YXIgZGVmID0gc3BlY1tzcGVja2V5XSB8fCBzcGVjWycqJ107XG4gICAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IHNwZWNrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgICAgICAodmFsaWRhdG9yc1tzcGVja2V5XSB8fCB2YWxpZGF0ZSkoKGtleSA/IGtleSArICcuJyA6IGtleSkgKyBrLCB2YWxba10sIGRlZik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb24gJiYgc3BlY1t0cmFuc2l0aW9uWzFdXSAmJiBzcGVjW3RyYW5zaXRpb25bMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZSgoa2V5ID8ga2V5ICsgJy4nIDoga2V5KSArIGssIHZhbFtrXSwgcmVmZXJlbmNlLnRyYW5zaXRpb24pO1xuICAgICAgICAgICAgLy8gdG9sZXJhdGUgcm9vdC1sZXZlbCBleHRyYSBrZXlzICYgYXJiaXRyYXJ5IGxheWVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnJyAmJiBrZXkuc3BsaXQoJy4nKS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbFtrXSwgJ3Vua25vd24gcHJvcGVydHkgXCIlc1wiJywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBsIGluIHNwZWMpIHtcbiAgICAgICAgICAgIGlmIChzcGVjW2xdLnJlcXVpcmVkICYmIHNwZWNbbF1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIHZhbFtsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiJXNcIicsIGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmFycmF5ID0gZnVuY3Rpb24gKGtleSwgdmFsLCBzcGVjLCB2YWxpZGF0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZl8odmFsKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZW9mXyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzcGVjLmxlbmd0aCAmJiB2YWwubGVuZ3RoICE9PSBzcGVjLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmQnLCBzcGVjLmxlbmd0aCwgdmFsLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsdWUgPSB7XG4gICAgICAgICAgICBcInR5cGVcIjogc3BlYy52YWx1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdHlsZS52ZXJzaW9uIDwgNykge1xuICAgICAgICAgICAgdmFsdWUuZnVuY3Rpb24gPSBzcGVjLmZ1bmN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZl8oc3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHNwZWMudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgKHZhbGlkYXRvciB8fCB2YWxpZGF0ZSkoa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuZmlsdGVyID0gZnVuY3Rpb24oa2V5LCB2YWwpIHtcbiAgICAgICAgdmFyIHR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZl8odmFsKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZW9mXyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yKGtleSwgdmFsLCAnZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJ1swXScsIHZhbFswXSwgcmVmZXJlbmNlLmZpbHRlcl9vcGVyYXRvcik7XG5cbiAgICAgICAgc3dpdGNoICh1bmJ1bmRsZSh2YWxbMF0pKSB7XG4gICAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID49IDIgJiYgdmFsWzFdID09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJXNcIicsIHZhbFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnPT0nOlxuICAgICAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoICE9IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsIHZhbFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgY2FzZSAnIWluJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2ZfKHZhbFsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1sxXScsIHZhbFsxXSwgJ3N0cmluZyBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxbMV1bMF0gPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1sxXScsIHZhbFsxXSwgJ2ZpbHRlciBrZXkgY2Fubm90IGJlIGEgY29uc3RhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZW9mXyh2YWxbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsWzFdID09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLmVudW0oa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCByZWZlcmVuY2UuZ2VvbWV0cnlfdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsW2ldWzBdID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSArICdbJyArIGkgKyAnXScsIHZhbFtpXSwgJ2ZpbHRlciB2YWx1ZSBjYW5ub3QgYmUgYSBjb25zdGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldLCAnc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2FueSc6XG4gICAgICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZS5maWx0ZXIoa2V5ICsgJ1snICsgaSArICddJywgdmFsW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuZnVuY3Rpb24gPSBmdW5jdGlvbihrZXksIHZhbCwgc3BlYykge1xuICAgICAgICB2YWxpZGF0ZS5vYmplY3Qoa2V5LCB2YWwsIHJlZmVyZW5jZS5mdW5jdGlvbiwge1xuICAgICAgICAgICAgc3RvcHM6IGZ1bmN0aW9uIChrZXksIHZhbCwgYXJyYXlTcGVjKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RTdG9wID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlLmFycmF5KGtleSwgdmFsLCBhcnJheVNwZWMsIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcChrZXksIHZhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mXyh2YWwpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3Ioa2V5LCB2YWwsICdhcnJheSBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlb2ZfKHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcihrZXksIHZhbCwgJ2FycmF5IGxlbmd0aCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kJywgMiwgdmFsLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZShrZXkgKyAnWzBdJywgdmFsWzBdLCB7dHlwZTogJ251bWJlcid9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUoa2V5ICsgJ1sxXScsIHZhbFsxXSwgc3BlYyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZl8odmFsWzBdKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjLmZ1bmN0aW9uID09PSAncGllY2V3aXNlLWNvbnN0YW50JyAmJiB2YWxbMF0gJSAxICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Ioa2V5ICsgJ1swXScsIHZhbFswXSwgJ3pvb20gbGV2ZWwgZm9yIHBpZWNld2lzZS1jb25zdGFudCBmdW5jdGlvbnMgbXVzdCBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxbMF0gPCBsYXN0U3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKGtleSArICdbMF0nLCB2YWxbMF0sICdhcnJheSBzdG9wcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFN0b3AgPSB2YWxbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2ZfKHZhbCkgPT09ICdhcnJheScgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmVudW0gPSBmdW5jdGlvbiAoa2V5LCB2YWwsIHNwZWMpIHtcbiAgICAgICAgaWYgKHNwZWMudmFsdWVzLmluZGV4T2YodW5idW5kbGUodmFsKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2V4cGVjdGVkIG9uZSBvZiBbJXNdLCAlcyBmb3VuZCcsIHNwZWMudmFsdWVzLmpvaW4oJywgJyksIHZhbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29sb3IgPSBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvcihrZXksIHZhbCwgJ2NvbG9yIGV4cGVjdGVkLCAlcyBmb3VuZCcsIHR5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlQ1NTQ29sb3IodmFsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICdjb2xvciBleHBlY3RlZCwgXCIlc1wiIGZvdW5kJywgdmFsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0eXBlVmFsaWRhdG9yKGV4cGVjdGVkKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbCwgc3BlYykge1xuICAgICAgICAgICAgdmFyIGFjdHVhbCA9IHR5cGVvZl8odmFsKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICclcyBleHBlY3RlZCwgJXMgZm91bmQnLCBleHBlY3RlZCwgYWN0dWFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCdtaW5pbXVtJyBpbiBzcGVjICYmIHZhbCA8IHNwZWMubWluaW11bSkge1xuICAgICAgICAgICAgICAgIGVycm9yKGtleSwgdmFsLCAnJXMgaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICVzJywgdmFsLCBzcGVjLm1pbmltdW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJ21heGltdW0nIGluIHNwZWMgJiYgdmFsID4gc3BlYy5tYXhpbXVtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Ioa2V5LCB2YWwsICclcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJXMnLCB2YWwsIHNwZWMubWF4aW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFsaWRhdGUubnVtYmVyID0gdHlwZVZhbGlkYXRvcignbnVtYmVyJyk7XG4gICAgdmFsaWRhdGUuc3RyaW5nID0gdHlwZVZhbGlkYXRvcignc3RyaW5nJyk7XG4gICAgdmFsaWRhdGUuYm9vbGVhbiA9IHR5cGVWYWxpZGF0b3IoJ2Jvb2xlYW4nKTtcblxuICAgIHZhbGlkYXRlWycqJ10gPSBmdW5jdGlvbigpIHt9O1xuXG4gICAgdmFsaWRhdGUoJycsIHN0eWxlLCByZWZlcmVuY2UuJHJvb3QpO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbn07XG5cbmZ1bmN0aW9uIHR5cGVvZl8odmFsKSB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcilcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbilcbiAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgICAgICByZXR1cm4gJ2FycmF5JztcbiAgICBpZiAodmFsID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIHJldHVybiB0eXBlb2YgdmFsO1xufVxuXG5mdW5jdGlvbiB1bmJ1bmRsZShfKSB7XG4gICAgaWYgKF8gaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgXyBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBfIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gXy52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF87XG4gICAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3Y3Lmpzb24nKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCIkdmVyc2lvblwiOiA3LFxuICBcIiRyb290XCI6IHtcbiAgICBcInZlcnNpb25cIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICA3XG4gICAgICBdLFxuICAgICAgXCJkb2NcIjogXCJTdHlsZXNoZWV0IHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIDcuXCJcbiAgICB9LFxuICAgIFwibmFtZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiQSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgc3R5bGUuXCJcbiAgICB9LFxuICAgIFwiY29uc3RhbnRzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbnN0YW50c1wiLFxuICAgICAgXCJkb2NcIjogXCJBbiBvYmplY3Qgb2YgY29uc3RhbnRzIHRvIGJlIHJlZmVyZW5jZWQgaW4gbGF5ZXJzLlwiXG4gICAgfSxcbiAgICBcInNvdXJjZXNcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwic291cmNlc1wiLFxuICAgICAgXCJkb2NcIjogXCJEYXRhIHNvdXJjZSBzcGVjaWZpY2F0aW9ucy5cIlxuICAgIH0sXG4gICAgXCJzcHJpdGVcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkEgYmFzZSBVUkwgZm9yIHJldHJpZXZpbmcgdGhlIHNwcml0ZSBpbWFnZSBhbmQgbWV0YWRhdGEuIFRoZSBleHRlbnNpb25zIGAucG5nYCwgYC5qc29uYCBhbmQgc2NhbGUgZmFjdG9yIGBAMngucG5nYCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuXCJcbiAgICB9LFxuICAgIFwiZ2x5cGhzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJkb2NcIjogXCJBIFVSTCB0ZW1wbGF0ZSBmb3IgbG9hZGluZyBzaWduZWQtZGlzdGFuY2UtZmllbGQgZ2x5cGggc2V0cyBpbiBQQkYgZm9ybWF0LiBWYWxpZCB0b2tlbnMgYXJlIHtmb250c3RhY2t9IGFuZCB7cmFuZ2V9LlwiXG4gICAgfSxcbiAgICBcInRyYW5zaXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwidHJhbnNpdGlvblwiLFxuICAgICAgXCJkb2NcIjogXCJBIGdsb2JhbCB0cmFuc2l0aW9uIGRlZmluaXRpb24gdG8gdXNlIGFzIGEgZGVmYXVsdCBhY3Jvc3MgcHJvcGVydGllcy5cIlxuICAgIH0sXG4gICAgXCJsYXllcnNcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcbiAgICAgIFwidmFsdWVcIjogXCJsYXllclwiLFxuICAgICAgXCJkb2NcIjogXCJMYXllcnMgd2lsbCBiZSBkcmF3biBpbiB0aGUgb3JkZXIgb2YgdGhpcyBhcnJheS5cIlxuICAgIH1cbiAgfSxcbiAgXCJjb25zdGFudHNcIjoge1xuICAgIFwiKlwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCIsXG4gICAgICBcImRvY1wiOiBcIkEgY29uc3RhbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIHZlcmJhdGltIGluIHRoZSByZWZlcmVuY2luZyBwbGFjZS4gVGhpcyBjYW4gYmUgYW55dGhpbmcsIGluY2x1ZGluZyBvYmplY3RzIGFuZCBhcnJheXMuIEFsbCB2YXJpYWJsZSBuYW1lcyBtdXN0IGJlIHByZWZpeGVkIHdpdGggYW4gYEBgIHN5bWJvbC5cIlxuICAgIH1cbiAgfSxcbiAgXCJzb3VyY2VzXCI6IHtcbiAgICBcIipcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic291cmNlXCIsXG4gICAgICBcImRvY1wiOiBcIlNwZWNpZmljYXRpb24gb2YgYSBkYXRhIHNvdXJjZS4gRm9yIHZlY3RvciBhbmQgcmFzdGVyIHNvdXJjZXMsIGVpdGhlciBUaWxlSlNPTiBvciBhIFVSTCB0byBhIFRpbGVKU09OIG11c3QgYmUgcHJvdmlkZWQuIEZvciBHZW9KU09OIGFuZCB2aWRlbyBzb3VyY2VzLCBhIFVSTCBtdXN0IGJlIHByb3ZpZGVkLlwiXG4gICAgfVxuICB9LFxuICBcInNvdXJjZVwiOiBbXG4gICAgXCJzb3VyY2VfdGlsZVwiLFxuICAgIFwic291cmNlX2dlb2pzb25cIixcbiAgICBcInNvdXJjZV92aWRlb1wiXG4gIF0sXG4gIFwic291cmNlX3RpbGVcIjoge1xuICAgIFwidHlwZVwiOiB7XG4gICAgICBcInJlcXVpcmVkXCI6IHRydWUsXG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmVjdG9yXCIsXG4gICAgICAgIFwicmFzdGVyXCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIHNvdXJjZS5cIlxuICAgIH0sXG4gICAgXCJ1cmxcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkEgVVJMIHRvIGEgVGlsZUpTT04gcmVzb3VyY2UuIFN1cHBvcnRlZCBwcm90b2NvbHMgYXJlIGBodHRwOmAsIGBodHRwczpgLCBhbmQgYG1hcGJveDovLzxtYXBpZD5gLlwiXG4gICAgfSxcbiAgICBcInRpbGVzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIkFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHRpbGUgc291cmNlIFVSTHMsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwiXG4gICAgfSxcbiAgICBcIm1pbnpvb21cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwiZG9jXCI6IFwiTWluaW11bSB6b29tIGxldmVsIGZvciB3aGljaCB0aWxlcyBhcmUgYXZhaWxhYmxlLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy5cIlxuICAgIH0sXG4gICAgXCJtYXh6b29tXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDIyLFxuICAgICAgXCJkb2NcIjogXCJNYXhpbXVtIHpvb20gbGV2ZWwgZm9yIHdoaWNoIHRpbGVzIGFyZSBhdmFpbGFibGUsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLiBEYXRhIGZyb20gdGlsZXMgYXQgdGhlIG1heHpvb20gYXJlIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZSBtYXAgYXQgaGlnaGVyIHpvb20gbGV2ZWxzLlwiXG4gICAgfSxcbiAgICBcInRpbGVTaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDUxMixcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1pbmltdW0gdmlzdWFsIHNpemUgdG8gZGlzcGxheSB0aWxlcyBmb3IgdGhpcyBsYXllci4gT25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBsYXllcnMuXCJcbiAgICB9LFxuICAgIFwiKlwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCIsXG4gICAgICBcImRvY1wiOiBcIk90aGVyIGtleXMgdG8gY29uZmlndXJlIHRoZSBkYXRhIHNvdXJjZS5cIlxuICAgIH1cbiAgfSxcbiAgXCJzb3VyY2VfZ2VvanNvblwiOiB7XG4gICAgXCJ0eXBlXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJnZW9qc29uXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiZGF0YVwiOiB7XG4gICAgICBcInR5cGVcIjogXCIqXCJcbiAgICB9XG4gIH0sXG4gIFwic291cmNlX3ZpZGVvXCI6IHtcbiAgICBcInR5cGVcIjoge1xuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpZGVvXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidXJsXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwic3RyaW5nXCIsXG4gICAgICBcImRvY1wiOiBcIlVSTHMgdG8gdmlkZW8gY29udGVudCBpbiBvcmRlciBvZiBwcmVmZXJyZWQgZm9ybWF0LlwiXG4gICAgfSxcbiAgICBcImNvb3JkaW5hdGVzXCI6IHtcbiAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcImxlbmd0aFwiOiA0LFxuICAgICAgXCJ2YWx1ZVwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICAgIFwibGVuZ3RoXCI6IDIsXG4gICAgICAgIFwidmFsdWVcIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgXCJsYXllclwiOiB7XG4gICAgXCJpZFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiVW5pcXVlIGxheWVyIG5hbWUuXCJcbiAgICB9LFxuICAgIFwidHlwZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwiZmlsbFwiLFxuICAgICAgICBcImxpbmVcIixcbiAgICAgICAgXCJzeW1ib2xcIixcbiAgICAgICAgXCJyYXN0ZXJcIixcbiAgICAgICAgXCJiYWNrZ3JvdW5kXCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIlJlbmRlcmluZyB0eXBlIG9mIHRoaXMgbGF5ZXIuXCJcbiAgICB9LFxuICAgIFwicmVmXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJkb2NcIjogXCJSZWZlcmVuY2VzIGFub3RoZXIgbGF5ZXIgdG8gY29weSBgdHlwZWAsIGBzb3VyY2VgLCBgc291cmNlLWxheWVyYCwgYG1pbnpvb21gLCBgbWF4em9vbWAsIGBmaWx0ZXJgLCBhbmQgYGxheW91dGAgcHJvcGVydGllcyBmcm9tLiBUaGlzIGFsbG93cyB0aGUgbGF5ZXJzIHRvIHNoYXJlIHByb2Nlc3NpbmcgYW5kIGJlIG1vcmUgZWZmaWNpZW50LlwiXG4gICAgfSxcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiTmFtZSBvZiBhIHNvdXJjZSBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGxheWVyLlwiXG4gICAgfSxcbiAgICBcInNvdXJjZS1sYXllclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZG9jXCI6IFwiTGF5ZXIgdG8gdXNlIGZyb20gYSB2ZWN0b3IgdGlsZSBzb3VyY2UuIFJlcXVpcmVkIGlmIHRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGlwbGUgbGF5ZXJzLlwiXG4gICAgfSxcbiAgICBcIm1pbnpvb21cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAyMixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvbiB3aGljaCB0aGUgbGF5ZXIgZ2V0cyBwYXJzZWQgYW5kIGFwcGVhcnMgb24uXCJcbiAgICB9LFxuICAgIFwibWF4em9vbVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJtYXhpbXVtXCI6IDIyLFxuICAgICAgXCJkb2NcIjogXCJUaGUgbWF4aW11bSB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsYXllciBnZXRzIHBhcnNlZCBhbmQgYXBwZWFycyBvbi5cIlxuICAgIH0sXG4gICAgXCJpbnRlcmFjdGl2ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImRvY1wiOiBcIkVuYWJsZSBxdWVyeWluZyBvZiBmZWF0dXJlIGRhdGEgZnJvbSB0aGlzIGxheWVyIGZvciBpbnRlcmFjdGl2aXR5LlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlXG4gICAgfSxcbiAgICBcImZpbHRlclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJmaWx0ZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiQSBleHByZXNzaW9uIHNwZWNpZnlpbmcgY29uZGl0aW9ucyBvbiBzb3VyY2UgZmVhdHVyZXMuIE9ubHkgZmVhdHVyZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIGFyZSBkaXNwbGF5ZWQuXCJcbiAgICB9LFxuICAgIFwibGF5b3V0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImxheW91dFwiLFxuICAgICAgXCJkb2NcIjogXCJMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlwiXG4gICAgfSxcbiAgICBcInBhaW50XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInBhaW50XCIsXG4gICAgICBcImRvY1wiOiBcIkRlZmF1bHQgcGFpbnQgcHJvcGVydGllcyBmb3IgdGhpcyBsYXllci5cIlxuICAgIH0sXG4gICAgXCJwYWludC4qXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInBhaW50XCIsXG4gICAgICBcImRvY1wiOiBcIkNsYXNzLXNwZWNpZmljIHBhaW50IHByb3BlcnRpZXMgZm9yIHRoaXMgbGF5ZXIuIFRoZSBjbGFzcyBuYW1lIGlzIHRoZSBwYXJ0IGFmdGVyIHRoZSBmaXJzdCBkb3QuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0XCI6IFtcbiAgICBcImxheW91dF9maWxsXCIsXG4gICAgXCJsYXlvdXRfbGluZVwiLFxuICAgIFwibGF5b3V0X3N5bWJvbFwiLFxuICAgIFwibGF5b3V0X3Jhc3RlclwiLFxuICAgIFwibGF5b3V0X2JhY2tncm91bmRcIlxuICBdLFxuICBcImxheW91dF9iYWNrZ3JvdW5kXCI6IHtcbiAgICBcInZpc2liaWxpdHlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpc2libGVcIixcbiAgICAgICAgXCJub25lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aXNpYmxlXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwiXG4gICAgfVxuICB9LFxuICBcImxheW91dF9maWxsXCI6IHtcbiAgICBcInZpc2liaWxpdHlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcInZpc2libGVcIixcbiAgICAgICAgXCJub25lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aXNpYmxlXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwiXG4gICAgfVxuICB9LFxuICBcImxheW91dF9saW5lXCI6IHtcbiAgICBcImxpbmUtY2FwXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJidXR0XCIsXG4gICAgICAgIFwicm91bmRcIixcbiAgICAgICAgXCJzcXVhcmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcImJ1dHRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgbGluZSBlbmRpbmdzLlwiXG4gICAgfSxcbiAgICBcImxpbmUtam9pblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwiYmV2ZWxcIixcbiAgICAgICAgXCJyb3VuZFwiLFxuICAgICAgICBcIm1pdGVyXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJtaXRlclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZGlzcGxheSBvZiBsaW5lcyB3aGVuIGpvaW5pbmcuXCJcbiAgICB9LFxuICAgIFwibGluZS1taXRlci1saW1pdFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAyLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJVc2VkIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydCBtaXRlciBqb2lucyB0byBiZXZlbCBqb2lucyBmb3Igc2hhcnAgYW5nbGVzLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxpbmUtam9pblwiOiBcIm1pdGVyXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlVzZWQgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IHJvdW5kIGpvaW5zIHRvIG1pdGVyIGpvaW5zIGZvciBzaGFsbG93IGFuZ2xlcy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsaW5lLWpvaW5cIjogXCJyb3VuZFwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwidmlzaWJpbGl0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmlzaWJsZVwiLFxuICAgICAgICBcIm5vbmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcInZpc2libGVcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0X3N5bWJvbFwiOiB7XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgICBcInBvaW50XCIsXG4gICAgICAgICAgXCJsaW5lXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJwb2ludFwiLFxuICAgICAgXCJkb2NcIjogXCJMYWJlbCBwbGFjZW1lbnQgcmVsYXRpdmUgdG8gaXRzIGdlb21ldHJ5LiBgbGluZWAgY2FuIG9ubHkgYmUgdXNlZCBvbiBMaW5lU3RyaW5ncyBhbmQgUG9seWdvbnMuXCJcbiAgICB9LFxuICAgIFwic3ltYm9sLW1pbi1kaXN0YW5jZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAyNTAsXG4gICAgICBcIm1pbmltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiTWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzeW1ib2wgYW5jaG9ycy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFwibGluZVwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBmYWxzZSxcbiAgICAgIFwiZG9jXCI6IFwiSWYgdHJ1ZSwgdGhlIHN5bWJvbHMgd2lsbCBub3QgY3Jvc3MgdGlsZSBlZGdlcyB0byBhdm9pZCBtdXR1YWwgY29sbGlzaW9ucy4gUmVjb21tZW5kZWQgaW4gbGF5ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBlbm91Z2ggcGFkZGluZyBpbiB0aGUgdmVjdG9yIHRpbGUgdG8gcHJldmVudCBjb2xsaXNpb25zLCBvciBpZiBpdCBpcyBhIHBvaW50IHN5bWJvbCBsYXllciBwbGFjZWQgYWZ0ZXIgYSBsaW5lIHN5bWJvbCBsYXllci5cIlxuICAgIH0sXG4gICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgaWNvbiB3aWxsIGJlIHZpc2libGUgZXZlbiBpZiBpdCBjb2xsaWRlcyB3aXRoIG90aGVyIGljb25zIGFuZCB0ZXh0LlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBpY29uIHdvbid0IGFmZmVjdCBwbGFjZW1lbnQgb2Ygb3RoZXIgaWNvbnMgYW5kIHRleHQuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBzeW1ib2wgd2lsbCBhcHBlYXIgd2l0aG91dCBpdHMgaWNvbiwgaW4gc3BhY2VzIHdoZXJlIHRoZSBpY29uIHdvdWxkIG1ha2UgaXQgdG9vIGxhcmdlIHRvIGZpdC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aWV3cG9ydFwiLFxuICAgICAgXCJkb2NcIjogXCJPcmllbnRhdGlvbiBvZiBpY29uIHdoZW4gbWFwIGlzIHJvdGF0ZWQuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1tYXgtc2l6ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBtYXhpbXVtIGZhY3RvciB0byBzY2FsZSB0aGUgaWNvbi5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkb2NcIjogXCJBIHN0cmluZyB3aXRoIHt0b2tlbnN9IHJlcGxhY2VkLCByZWZlcmVuY2luZyB0aGUgZGF0YSBwcm9wZXJ0eSB0byBwdWxsIGZyb20uXCIsXG4gICAgICBcInRva2Vuc1wiOiB0cnVlXG4gICAgfSxcbiAgICBcImljb24tcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInVuaXRzXCI6IFwiZGVncmVlc1wiLFxuICAgICAgXCJkb2NcIjogXCJSb3RhdGVzIHRoZSBpY29uIGNsb2Nrd2lzZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLXBhZGRpbmdcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJQYWRkaW5nIHZhbHVlIGFyb3VuZCBpY29uIGJvdW5kaW5nIGJveCB0byBhdm9pZCBpY29uIGNvbGxpc2lvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgaWNvbiBtYXkgYmUgZmxpcHBlZCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVuZGVyZWQgdXBzaWRlLWRvd25cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAge1xuICAgICAgICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24tb2Zmc2V0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiSWNvbidzIG9mZnNldCBkaXN0YW5jZS4gVmFsdWVzIGFyZSBbeCwgeV0gd2hlcmUgbmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLCByZXNwZWN0aXZlbHkuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJ2aWV3cG9ydFwiLFxuICAgICAgXCJkb2NcIjogXCJPcmllbnRhdGlvbiBvZiBpY29uIG9yIHRleHQgd2hlbiBtYXAgaXMgcm90YXRlZC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiXCIsXG4gICAgICBcInRva2Vuc1wiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJWYWx1ZSB0byB1c2UgZm9yIGEgdGV4dCBsYWJlbC4gRmVhdHVyZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdG9rZW5zIGxpa2Uge2ZpZWxkX25hbWV9LlwiXG4gICAgfSxcbiAgICBcInRleHQtZm9udFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIk9wZW4gU2FucyBSZWd1bGFyLCBBcmlhbCBVbmljb2RlIE1TIFJlZ3VsYXJcIixcbiAgICAgIFwiZG9jXCI6IFwiRm9udCBzdGFjayB0byB1c2UgZm9yIGRpc3BsYXlpbmcgdGV4dC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW1heC1zaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDE2LFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBtYXhpbXVtIHNpemUgdGV4dCB3aWxsIGJlIGxhaWQgb3V0LCB0byBjYWxjdWxhdGUgY29sbGlzaW9ucyB3aXRoLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDE1LFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwiZW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG1heGltdW0gbGluZSB3aWR0aCBmb3IgdGV4dCB3cmFwcGluZy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEuMixcbiAgICAgIFwidW5pdHNcIjogXCJlbVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJUZXh0IGxlYWRpbmcgdmFsdWUgZm9yIG11bHRpLWxpbmUgdGV4dC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInVuaXRzXCI6IFwiZW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiVGV4dCBrZXJuaW5nIHZhbHVlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtanVzdGlmeVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibGVmdFwiLFxuICAgICAgICBcImNlbnRlclwiLFxuICAgICAgICBcInJpZ2h0XCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJjZW50ZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGV4dCBqdXN0aWZpY2F0aW9uIG9wdGlvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcImNlbnRlclwiLFxuICAgICAgICBcImxlZnRcIixcbiAgICAgICAgXCJyaWdodFwiLFxuICAgICAgICBcInRvcFwiLFxuICAgICAgICBcImJvdHRvbVwiLFxuICAgICAgICBcInRvcC1sZWZ0XCIsXG4gICAgICAgIFwidG9wLXJpZ2h0XCIsXG4gICAgICAgIFwiYm90dG9tLWxlZnRcIixcbiAgICAgICAgXCJib3R0b20tcmlnaHRcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcImNlbnRlclwiLFxuICAgICAgXCJkb2NcIjogXCJXaGljaCBwYXJ0IG9mIHRoZSB0ZXh0IHRvIHBsYWNlIGNsb3Nlc3QgdG8gdGhlIGFuY2hvci5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiA0NSxcbiAgICAgIFwidW5pdHNcIjogXCJkZWdyZWVzXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIk1heGltdW0gYW5nbGUgY2hhbmdlIGJldHdlZW4gYWRqYWNlbnQgY2hhcmFjdGVycy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAge1xuICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBcImxpbmVcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcInVuaXRzXCI6IFwiZGVncmVlc1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJSb3RhdGVzIHRoZSB0ZXh0IGNsb2Nrd2lzZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LXBhZGRpbmdcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJkb2NcIjogXCJQYWRkaW5nIHZhbHVlIGFyb3VuZCB0ZXh0IGJvdW5kaW5nIGJveCB0byBhdm9pZCBsYWJlbCBjb2xsaXNpb25zLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgdGV4dCBtYXkgYmUgZmxpcHBlZCB2ZXJ0aWNhbGx5IHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZW5kZXJlZCB1cHNpZGUtZG93bi5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAge1xuICAgICAgICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogXCJtYXBcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJub25lXCIsXG4gICAgICAgIFwidXBwZXJjYXNlXCIsXG4gICAgICAgIFwibG93ZXJjYXNlXCJcbiAgICAgIF0sXG4gICAgICBcImRlZmF1bHRcIjogXCJub25lXCIsXG4gICAgICBcImRvY1wiOiBcIlNwZWNpZmllcyBob3cgdG8gY2FwaXRhbGl6ZSB0ZXh0LCBzaW1pbGFyIHRvIHRoZSBDU1MgYHRleHQtdHJhbnNmb3JtYCBwcm9wZXJ0eS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LW9mZnNldFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJkb2NcIjogXCJTcGVjaWZpZXMgdGhlIGRpc3RhbmNlIHRoYXQgdGV4dCBpcyBvZmZzZXQgZnJvbSBpdHMgYW5jaG9yIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS5cIixcbiAgICAgIFwidmFsdWVcIjogXCJudW1iZXJcIixcbiAgICAgIFwidW5pdHNcIjogXCJlbXNcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwibGVuZ3RoXCI6IDIsXG4gICAgICBcImRlZmF1bHRcIjogW1xuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICBdLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgdmlzaWJsZSBldmVuIGlmIGl0IGNvbGxpZGVzIHdpdGggb3RoZXIgaWNvbnMgYW5kIGxhYmVscy5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgXCJkb2NcIjogXCJJZiB0cnVlLCB0aGUgdGV4dCB3b24ndCBhZmZlY3QgcGxhY2VtZW50IG9mIG90aGVyIGljb25zIGFuZCBsYWJlbHMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogZmFsc2UsXG4gICAgICBcImRvY1wiOiBcIklmIHRydWUsIHRoZSBzeW1ib2wgd2lsbCBhcHBlYXIgd2l0aG91dCBpdHMgdGV4dCwgaW4gc3BhY2VzIHdoZXJlIHRoZSB0ZXh0IHdvdWxkIG1ha2UgaXQgdG9vIGxhcmdlIHRvIGZpdC5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcInRleHQtZmllbGRcIixcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidmlzaWJpbGl0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwidmlzaWJsZVwiLFxuICAgICAgICBcIm5vbmVcIlxuICAgICAgXSxcbiAgICAgIFwiZGVmYXVsdFwiOiBcInZpc2libGVcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJcbiAgICB9XG4gIH0sXG4gIFwibGF5b3V0X3Jhc3RlclwiOiB7XG4gICAgXCJ2aXNpYmlsaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImVudW1cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJwaWVjZXdpc2UtY29uc3RhbnRcIixcbiAgICAgIFwidmFsdWVzXCI6IFtcbiAgICAgICAgXCJ2aXNpYmxlXCIsXG4gICAgICAgIFwibm9uZVwiXG4gICAgICBdLFxuICAgICAgXCJkZWZhdWx0XCI6IFwidmlzaWJsZVwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZGlzcGxheSBvZiB0aGlzIGxheWVyLiBgbm9uZWAgaGlkZXMgdGhpcyBsYXllci5cIlxuICAgIH1cbiAgfSxcbiAgXCJmaWx0ZXJcIjoge1xuICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgXCJ2YWx1ZVwiOiBcIipcIlxuICB9LFxuICBcImZpbHRlcl9vcGVyYXRvclwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgIFwidmFsdWVzXCI6IFtcbiAgICAgIFwiPT1cIixcbiAgICAgIFwiIT1cIixcbiAgICAgIFwiPlwiLFxuICAgICAgXCI+PVwiLFxuICAgICAgXCI8XCIsXG4gICAgICBcIjw9XCIsXG4gICAgICBcImluXCIsXG4gICAgICBcIiFpblwiLFxuICAgICAgXCJhbGxcIixcbiAgICAgIFwiYW55XCIsXG4gICAgICBcIm5vbmVcIlxuICAgIF1cbiAgfSxcbiAgXCJnZW9tZXRyeV90eXBlXCI6IHtcbiAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgXCJQb2ludFwiLFxuICAgICAgXCJMaW5lU3RyaW5nXCIsXG4gICAgICBcIlBvbHlnb25cIlxuICAgIF1cbiAgfSxcbiAgXCJmdW5jdGlvblwiOiB7XG4gICAgXCJzdG9wc1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgXCJkb2NcIjogXCJBbiBhcnJheSBvZiBzdG9wcy5cIixcbiAgICAgIFwidmFsdWVcIjogXCJmdW5jdGlvbl9zdG9wXCJcbiAgICB9LFxuICAgIFwiYmFzZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImRvY1wiOiBcIlRoZSBleHBvbmVudGlhbCBiYXNlIG9mIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnZlLiBJdCBjb250cm9scyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgcmVzdWx0IGluY3JlYXNlcy4gSGlnaGVyIHZhbHVlcyBtYWtlIHRoZSByZXN1bHQgaW5jcmVhc2UgbW9yZSB0b3dhcmRzIHRoZSBoaWdoIGVuZCBvZiB0aGUgcmFuZ2UuIFdpdGggYDFgIHRoZSBzdG9wcyBhcmUgaW50ZXJwb2xhdGVkIGxpbmVhcmx5LlwiXG4gICAgfVxuICB9LFxuICBcImZ1bmN0aW9uX3N0b3BcIjoge1xuICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgXCJtYXhpbXVtXCI6IDIyLFxuICAgIFwidmFsdWVcIjogW1xuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiY29sb3JcIlxuICAgIF0sXG4gICAgXCJsZW5ndGhcIjogMixcbiAgICBcImRvY1wiOiBcIlpvb20gbGV2ZWwgYW5kIHZhbHVlIHBhaXIuXCJcbiAgfSxcbiAgXCJwYWludFwiOiBbXG4gICAgXCJwYWludF9maWxsXCIsXG4gICAgXCJwYWludF9saW5lXCIsXG4gICAgXCJwYWludF9zeW1ib2xcIixcbiAgICBcInBhaW50X3Jhc3RlclwiLFxuICAgIFwicGFpbnRfYmFja2dyb3VuZFwiXG4gIF0sXG4gIFwicGFpbnRfZmlsbFwiOiB7XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcImRlZmF1bHRcIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiV2hldGhlciBvciBub3QgdGhlIGZpbGwgc2hvdWxkIGJlIGFudGlhbGlhc2VkLlwiXG4gICAgfSxcbiAgICBcImZpbGwtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgZ2l2ZW4gdG8gdGhlIGZpbGwgY29sb3IuXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJmaWxsLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCIjMDAwMDAwXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBjb2xvciBvZiB0aGUgZmlsbC5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJmaWxsLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG91dGxpbmUgY29sb3Igb2YgdGhlIGZpbGwuIE1hdGNoZXMgdGhlIHZhbHVlIG9mIGBmaWxsLWNvbG9yYCBpZiB1bnNwZWNpZmllZC5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJmaWxsLWltYWdlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiZmlsbC1hbnRpYWxpYXNcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcImZpbGwtdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwiXG4gICAgfSxcbiAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibWFwXCIsXG4gICAgICAgIFwidmlld3BvcnRcIlxuICAgICAgXSxcbiAgICAgIFwiZG9jXCI6IFwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbilcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIm1hcFwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiZmlsbC10cmFuc2xhdGVcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJmaWxsLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBmaWxscy5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9saW5lXCI6IHtcbiAgICBcImxpbmUtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGxpbmUgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlXG4gICAgfSxcbiAgICBcImxpbmUtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIHdpdGggd2hpY2ggdGhlIGxpbmUgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIiMwMDAwMDBcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJsaW5lLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJsZW5ndGhcIjogMixcbiAgICAgIFwiZGVmYXVsdFwiOiBbXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIF0sXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGdlb21ldHJ5J3Mgb2Zmc2V0LiBWYWx1ZXMgYXJlIFt4LCB5XSB3aGVyZSBuZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAsIHJlc3BlY3RpdmVseS5cIlxuICAgIH0sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJtYXBcIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImxpbmUtdHJhbnNsYXRlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwibGluZS13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiU3Ryb2tlIHRoaWNrbmVzcy5cIlxuICAgIH0sXG4gICAgXCJsaW5lLWdhcC13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImRvY1wiOiBcIkRyYXdzIGEgbGluZSBjYXNpbmcgb3V0c2lkZSBvZiBhIGxpbmUncyBhY3R1YWwgcGF0aC4gVmFsdWUgaW5kaWNhdGVzIHRoZSB3aWR0aCBvZiB0aGUgaW5uZXIgZ2FwLlwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCJcbiAgICB9LFxuICAgIFwibGluZS1ibHVyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJCbHVyIGFwcGxpZWQgdG8gdGhlIGxpbmUsIGluIHBpeGVscy5cIlxuICAgIH0sXG4gICAgXCJsaW5lLWRhc2hhcnJheVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJTcGVjaWZpZXMgdGhlIGxlbmd0aHMgb2YgdGhlIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgZ2FwcyB0aGF0IGZvcm0gdGhlIGRhc2ggcGF0dGVybi4gVGhlIGxlbmd0aHMgYXJlIGxhdGVyIHNjYWxlZCBieSB0aGUgbGluZSB3aWR0aC4gVG8gY29udmVydCBhIGRhc2ggbGVuZ3RoIHRvIHBpeGVscywgbXVsdGlwbHkgdGhlIGxlbmd0aCBieSB0aGUgY3VycmVudCBsaW5lIHdpZHRoLlwiLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJsaW5lIHdpZHRoc1wiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJsaW5lLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJsaW5lLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBsaW5lcy5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9zeW1ib2xcIjoge1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IHtcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGljb24gd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1zaXplXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiU2NhbGUgZmFjdG9yIGZvciBpY29uLiAxIGlzIG9yaWdpbmFsIHNpemUsIDMgdHJpcGxlcyB0aGUgc2l6ZS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCIjMDAwMDAwXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSBpY29uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJpY29uLWltYWdlXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSBpY29uJ3MgaGFsby4gSWNvbiBoYWxvcyBjYW4gb25seSBiZSB1c2VkIHdpdGggc2RmIGljb25zLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taGFsby13aWR0aFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJwaXhlbHNcIixcbiAgICAgIFwiZG9jXCI6IFwiRGlzdGFuY2Ugb2YgaGFsbyB0byB0aGUgaWNvbiBvdXRsaW5lLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24taGFsby1ibHVyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJGYWRlIG91dCB0aGUgaGFsbyB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJBbiBpY29uJ3Mgb2Zmc2V0IGRpc3RhbmNlLiBWYWx1ZXMgYXJlIFt4LCB5XSB3aGVyZSBuZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAsIHJlc3BlY3RpdmVseS5cIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIlxuICAgICAgXVxuICAgIH0sXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiZW51bVwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ2YWx1ZXNcIjogW1xuICAgICAgICBcIm1hcFwiLFxuICAgICAgICBcInZpZXdwb3J0XCJcbiAgICAgIF0sXG4gICAgICBcImRvY1wiOiBcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJtYXBcIixcbiAgICAgIFwicmVxdWlyZXNcIjogW1xuICAgICAgICBcImljb24taW1hZ2VcIixcbiAgICAgICAgXCJpY29uLXRyYW5zbGF0ZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtb3BhY2l0eVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIHRleHQgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtc2l6ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxNixcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImRvY1wiOiBcIkZvbnQgc2l6ZS4gSWYgdW5zcGVjaWZpZWQsIHRoZSB0ZXh0IHdpbGwgYmUgYXMgYmlnIGFzIGFsbG93ZWQgYnkgdGhlIGxheWVyIGRlZmluaXRpb24uXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1jb2xvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJjb2xvclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgY29sb3Igd2l0aCB3aGljaCB0aGUgdGV4dCB3aWxsIGJlIGRyYXduLlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiIzAwMDAwMFwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImNvbG9yXCIsXG4gICAgICBcImRlZmF1bHRcIjogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIG9mIHRoZSB0ZXh0J3MgaGFsbywgd2hpY2ggaGVscHMgaXQgc3RhbmQgb3V0IGZyb20gYmFja2dyb3VuZHMuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLXdpZHRoXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJEaXN0YW5jZSBvZiBoYWxvIHRvIHRoZSBmb250IG91dGxpbmUuIE1heCB0ZXh0IGhhbG8gd2lkdGggaXMgMS80IG9mIHRoZSBmb250LXNpemUuXCIsXG4gICAgICBcInJlcXVpcmVzXCI6IFtcbiAgICAgICAgXCJ0ZXh0LWZpZWxkXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcInVuaXRzXCI6IFwicGl4ZWxzXCIsXG4gICAgICBcImRvY1wiOiBcIlRoZSBoYWxvJ3MgZmFkZW91dCBkaXN0YW5jZSB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG4gICAgICBcInZhbHVlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImxlbmd0aFwiOiAyLFxuICAgICAgXCJkZWZhdWx0XCI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgXSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcInBpeGVsc1wiLFxuICAgICAgXCJkb2NcIjogXCJMYWJlbCBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICBcInR5cGVcIjogXCJlbnVtXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwicGllY2V3aXNlLWNvbnN0YW50XCIsXG4gICAgICBcInZhbHVlc1wiOiBbXG4gICAgICAgIFwibWFwXCIsXG4gICAgICAgIFwidmlld3BvcnRcIlxuICAgICAgXSxcbiAgICAgIFwiZG9jXCI6IFwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbilcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIm1hcFwiLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIFwidGV4dC1maWVsZFwiLFxuICAgICAgICBcInRleHQtdHJhbnNsYXRlXCJcbiAgICAgIF1cbiAgICB9XG4gIH0sXG4gIFwicGFpbnRfcmFzdGVyXCI6IHtcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgaW1hZ2Ugd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAxLFxuICAgICAgXCJtaW5pbXVtXCI6IDAsXG4gICAgICBcIm1heGltdW1cIjogMSxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlXG4gICAgfSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDAsXG4gICAgICBcInBlcmlvZFwiOiAzNjAsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZSxcbiAgICAgIFwidW5pdHNcIjogXCJkZWdyZWVzXCIsXG4gICAgICBcImRvY1wiOiBcIlJvdGF0ZXMgaHVlcyBhcm91bmQgdGhlIGNvbG9yIHdoZWVsLlwiXG4gICAgfSxcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwiZG9jXCI6IFwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtaW5pbXVtIGJyaWdodG5lc3MuXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJtYXhpbXVtXCI6IDEsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcImRvY1wiOiBcIkluY3JlYXNlIG9yIHJlZHVjZSB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgaW1hZ2UuIFRoZSB2YWx1ZSBpcyB0aGUgbWF4aW11bSBicmlnaHRuZXNzLlwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9LFxuICAgIFwicmFzdGVyLXNhdHVyYXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRvY1wiOiBcIkluY3JlYXNlIG9yIHJlZHVjZSB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgaW1hZ2UuXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAtMSxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9LFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkb2NcIjogXCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS5cIixcbiAgICAgIFwiZGVmYXVsdFwiOiAwLFxuICAgICAgXCJtaW5pbXVtXCI6IC0xLFxuICAgICAgXCJtYXhpbXVtXCI6IDEsXG4gICAgICBcImZ1bmN0aW9uXCI6IFwiaW50ZXJwb2xhdGVkXCIsXG4gICAgICBcInRyYW5zaXRpb25cIjogdHJ1ZVxuICAgIH0sXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAzMDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJ1bml0c1wiOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgXCJkb2NcIjogXCJGYWRlIGR1cmF0aW9uIHdoZW4gYSBuZXcgdGlsZSBpcyBhZGRlZC5cIlxuICAgIH1cbiAgfSxcbiAgXCJwYWludF9iYWNrZ3JvdW5kXCI6IHtcbiAgICBcImJhY2tncm91bmQtY29sb3JcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiY29sb3JcIixcbiAgICAgIFwiZGVmYXVsdFwiOiBcIiMwMDAwMDBcIixcbiAgICAgIFwiZG9jXCI6IFwiVGhlIGNvbG9yIHdpdGggd2hpY2ggdGhlIGJhY2tncm91bmQgd2lsbCBiZSBkcmF3bi5cIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJpbnRlcnBvbGF0ZWRcIixcbiAgICAgIFwidHJhbnNpdGlvblwiOiB0cnVlLFxuICAgICAgXCJyZXF1aXJlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIiFcIjogXCJiYWNrZ3JvdW5kLWltYWdlXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXCJiYWNrZ3JvdW5kLWltYWdlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcInBpZWNld2lzZS1jb25zdGFudFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWUsXG4gICAgICBcImRvY1wiOiBcIk9wdGlvbmFsbHkgYW4gaW1hZ2Ugd2hpY2ggaXMgZHJhd24gYXMgdGhlIGJhY2tncm91bmQuXCJcbiAgICB9LFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm51bWJlclwiLFxuICAgICAgXCJkZWZhdWx0XCI6IDEsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwibWF4aW11bVwiOiAxLFxuICAgICAgXCJkb2NcIjogXCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIGRyYXduLlwiLFxuICAgICAgXCJmdW5jdGlvblwiOiBcImludGVycG9sYXRlZFwiLFxuICAgICAgXCJ0cmFuc2l0aW9uXCI6IHRydWVcbiAgICB9XG4gIH0sXG4gIFwidHJhbnNpdGlvblwiOiB7XG4gICAgXCJkdXJhdGlvblwiOiB7XG4gICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgIFwiZGVmYXVsdFwiOiAzMDAsXG4gICAgICBcIm1pbmltdW1cIjogMCxcbiAgICAgIFwidW5pdHNcIjogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIFwiZG9jXCI6IFwiVGltZSBhbGxvdHRlZCBmb3IgdHJhbnNpdGlvbnMgdG8gY29tcGxldGUuXCJcbiAgICB9LFxuICAgIFwiZGVsYXlcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibnVtYmVyXCIsXG4gICAgICBcImRlZmF1bHRcIjogMCxcbiAgICAgIFwibWluaW11bVwiOiAwLFxuICAgICAgXCJ1bml0c1wiOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgXCJkb2NcIjogXCJMZW5ndGggb2YgdGltZSBiZWZvcmUgYSB0cmFuc2l0aW9uIGJlZ2lucy5cIlxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgICAgIH0sXG4gICAgc3ViOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIocCk7ICAgICB9LFxuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgICAgfSxcbiAgICBkaXY6ICAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdihrKTsgICAgIH0sXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7ICB9LFxuICAgIG1hdE11bHQ6IGZ1bmN0aW9uKG0pIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdChtKTsgfSxcbiAgICB1bml0OiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpOyB9LFxuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICBtYWc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgfSxcblxuICAgIGVxdWFsczogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBwLnggJiZcbiAgICAgICAgICAgICAgIHRoaXMueSA9PT0gcC55O1xuICAgIH0sXG5cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICBhbmdsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoYi54LCBiLnkpO1xuICAgIH0sXG5cbiAgICAvLyBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RzIFBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5XG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvKlxuIChjKSAyMDEzLCBWbGFkaW1pciBBZ2Fmb25raW5cbiBSQnVzaCwgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2gtcGVyZm9ybWFuY2UgMkQgc3BhdGlhbCBpbmRleGluZyBvZiBwb2ludHMgYW5kIHJlY3RhbmdsZXMuXG4gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcmJ1c2hcbiovXG5cbihmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gcmJ1c2gobWF4RW50cmllcywgZm9ybWF0KSB7XG5cbiAgICAvLyBqc2hpbnQgbmV3Y2FwOiBmYWxzZSwgdmFsaWR0aGlzOiB0cnVlXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHJidXNoKSkgcmV0dXJuIG5ldyByYnVzaChtYXhFbnRyaWVzLCBmb3JtYXQpO1xuXG4gICAgLy8gbWF4IGVudHJpZXMgaW4gYSBub2RlIGlzIDkgYnkgZGVmYXVsdDsgbWluIG5vZGUgZmlsbCBpcyA0MCUgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGlzLl9tYXhFbnRyaWVzID0gTWF0aC5tYXgoNCwgbWF4RW50cmllcyB8fCA5KTtcbiAgICB0aGlzLl9taW5FbnRyaWVzID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKHRoaXMuX21heEVudHJpZXMgKiAwLjQpKTtcblxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdGhpcy5faW5pdEZvcm1hdChmb3JtYXQpO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcbn1cblxucmJ1c2gucHJvdG90eXBlID0ge1xuXG4gICAgYWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLCBbXSk7XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKGJib3gpIHtcblxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgICAgdG9CQm94ID0gdGhpcy50b0JCb3g7XG5cbiAgICAgICAgaWYgKCFpbnRlcnNlY3RzKGJib3gsIG5vZGUuYmJveCkpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5vZGVzVG9TZWFyY2ggPSBbXSxcbiAgICAgICAgICAgIGksIGxlbiwgY2hpbGQsIGNoaWxkQkJveDtcblxuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGNoaWxkQkJveCA9IG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94O1xuXG4gICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdHMoYmJveCwgY2hpbGRCQm94KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWFmKSByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRhaW5zKGJib3gsIGNoaWxkQkJveCkpIHRoaXMuX2FsbChjaGlsZCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBub2Rlc1RvU2VhcmNoLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBub2Rlc1RvU2VhcmNoLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgY29sbGlkZXM6IGZ1bmN0aW9uIChiYm94KSB7XG5cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB0b0JCb3ggPSB0aGlzLnRvQkJveDtcblxuICAgICAgICBpZiAoIWludGVyc2VjdHMoYmJveCwgbm9kZS5iYm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW10sXG4gICAgICAgICAgICBpLCBsZW4sIGNoaWxkLCBjaGlsZEJCb3g7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBjaGlsZEJCb3ggPSBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQuYmJveDtcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3RzKGJib3gsIGNoaWxkQkJveCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVhZiB8fCBjb250YWlucyhiYm94LCBjaGlsZEJCb3gpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1NlYXJjaC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZXNUb1NlYXJjaC5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCEoZGF0YSAmJiBkYXRhLmxlbmd0aCkpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IHRoaXMuX21pbkVudHJpZXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoZGF0YVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGJ1aWxkIHRoZSB0cmVlIHdpdGggdGhlIGdpdmVuIGRhdGEgZnJvbSBzdHJhdGNoIHVzaW5nIE9NVCBhbGdvcml0aG1cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9idWlsZChkYXRhLnNsaWNlKCksIDAsIGRhdGEubGVuZ3RoIC0gMSwgMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBzYXZlIGFzIGlzIGlmIHRyZWUgaXMgZW1wdHlcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5vZGU7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuaGVpZ2h0ID09PSBub2RlLmhlaWdodCkge1xuICAgICAgICAgICAgLy8gc3BsaXQgcm9vdCBpZiB0cmVlcyBoYXZlIHRoZSBzYW1lIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSwgbm9kZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaGVpZ2h0IDwgbm9kZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAvLyBzd2FwIHRyZWVzIGlmIGluc2VydGVkIG9uZSBpcyBiaWdnZXJcbiAgICAgICAgICAgICAgICB2YXIgdG1wTm9kZSA9IHRoaXMuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0bXBOb2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnNlcnQgdGhlIHNtYWxsIHRyZWUgaW50byB0aGUgbGFyZ2UgdHJlZSBhdCBhcHByb3ByaWF0ZSBsZXZlbFxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0KG5vZGUsIHRoaXMuZGF0YS5oZWlnaHQgLSBub2RlLmhlaWdodCAtIDEsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGluc2VydDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuX2luc2VydChpdGVtLCB0aGlzLmRhdGEuaGVpZ2h0IC0gMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgICAgICBiYm94OiBlbXB0eSgpLFxuICAgICAgICAgICAgbGVhZjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgYmJveCA9IHRoaXMudG9CQm94KGl0ZW0pLFxuICAgICAgICAgICAgcGF0aCA9IFtdLFxuICAgICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgaSwgcGFyZW50LCBpbmRleCwgZ29pbmdVcDtcblxuICAgICAgICAvLyBkZXB0aC1maXJzdCBpdGVyYXRpdmUgdHJlZSB0cmF2ZXJzYWxcbiAgICAgICAgd2hpbGUgKG5vZGUgfHwgcGF0aC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgaWYgKCFub2RlKSB7IC8vIGdvIHVwXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhdGgucG9wKCk7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGkgPSBpbmRleGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGdvaW5nVXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmKSB7IC8vIGNoZWNrIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgICAgIGluZGV4ID0gbm9kZS5jaGlsZHJlbi5pbmRleE9mKGl0ZW0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIGZvdW5kLCByZW1vdmUgdGhlIGl0ZW0gYW5kIGNvbmRlbnNlIHRyZWUgdXB3YXJkc1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZGVuc2UocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFnb2luZ1VwICYmICFub2RlLmxlYWYgJiYgY29udGFpbnMobm9kZS5iYm94LCBiYm94KSkgeyAvLyBnbyBkb3duXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzBdO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCkgeyAvLyBnbyByaWdodFxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50LmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGdvaW5nVXAgPSBmYWxzZTtcblxuICAgICAgICAgICAgfSBlbHNlIG5vZGUgPSBudWxsOyAvLyBub3RoaW5nIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgdG9CQm94OiBmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbTsgfSxcblxuICAgIGNvbXBhcmVNaW5YOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF07IH0sXG4gICAgY29tcGFyZU1pblk6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhWzFdIC0gYlsxXTsgfSxcblxuICAgIHRvSlNPTjogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kYXRhOyB9LFxuXG4gICAgZnJvbUpTT046IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWxsOiBmdW5jdGlvbiAobm9kZSwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW107XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmKSByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZWxzZSBub2Rlc1RvU2VhcmNoLnB1c2guYXBwbHkobm9kZXNUb1NlYXJjaCwgbm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2Rlc1RvU2VhcmNoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIF9idWlsZDogZnVuY3Rpb24gKGl0ZW1zLCBsZWZ0LCByaWdodCwgaGVpZ2h0KSB7XG5cbiAgICAgICAgdmFyIE4gPSByaWdodCAtIGxlZnQgKyAxLFxuICAgICAgICAgICAgTSA9IHRoaXMuX21heEVudHJpZXMsXG4gICAgICAgICAgICBub2RlO1xuXG4gICAgICAgIGlmIChOIDw9IE0pIHtcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgbGVhZiBsZXZlbDsgcmV0dXJuIGxlYWZcbiAgICAgICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW1zLnNsaWNlKGxlZnQsIHJpZ2h0ICsgMSksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICAgICAgICAgIGJib3g6IG51bGwsXG4gICAgICAgICAgICAgICAgbGVhZjogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhbGNCQm94KG5vZGUsIHRoaXMudG9CQm94KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIHRhcmdldCBoZWlnaHQgb2YgdGhlIGJ1bGstbG9hZGVkIHRyZWVcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChNYXRoLmxvZyhOKSAvIE1hdGgubG9nKE0pKTtcblxuICAgICAgICAgICAgLy8gdGFyZ2V0IG51bWJlciBvZiByb290IGVudHJpZXMgdG8gbWF4aW1pemUgc3RvcmFnZSB1dGlsaXphdGlvblxuICAgICAgICAgICAgTSA9IE1hdGguY2VpbChOIC8gTWF0aC5wb3coTSwgaGVpZ2h0IC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBlbGltaW5hdGUgcmVjdXJzaW9uP1xuXG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIGJib3g6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzcGxpdCB0aGUgaXRlbXMgaW50byBNIG1vc3RseSBzcXVhcmUgdGlsZXNcblxuICAgICAgICB2YXIgTjIgPSBNYXRoLmNlaWwoTiAvIE0pLFxuICAgICAgICAgICAgTjEgPSBOMiAqIE1hdGguY2VpbChNYXRoLnNxcnQoTSkpLFxuICAgICAgICAgICAgaSwgaiwgcmlnaHQyLCByaWdodDM7XG5cbiAgICAgICAgbXVsdGlTZWxlY3QoaXRlbXMsIGxlZnQsIHJpZ2h0LCBOMSwgdGhpcy5jb21wYXJlTWluWCk7XG5cbiAgICAgICAgZm9yIChpID0gbGVmdDsgaSA8PSByaWdodDsgaSArPSBOMSkge1xuXG4gICAgICAgICAgICByaWdodDIgPSBNYXRoLm1pbihpICsgTjEgLSAxLCByaWdodCk7XG5cbiAgICAgICAgICAgIG11bHRpU2VsZWN0KGl0ZW1zLCBpLCByaWdodDIsIE4yLCB0aGlzLmNvbXBhcmVNaW5ZKTtcblxuICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8PSByaWdodDI7IGogKz0gTjIpIHtcblxuICAgICAgICAgICAgICAgIHJpZ2h0MyA9IE1hdGgubWluKGogKyBOMiAtIDEsIHJpZ2h0Mik7XG5cbiAgICAgICAgICAgICAgICAvLyBwYWNrIGVhY2ggZW50cnkgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQoaXRlbXMsIGosIHJpZ2h0MywgaGVpZ2h0IC0gMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsY0JCb3gobm9kZSwgdGhpcy50b0JCb3gpO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICBfY2hvb3NlU3VidHJlZTogZnVuY3Rpb24gKGJib3gsIG5vZGUsIGxldmVsLCBwYXRoKSB7XG5cbiAgICAgICAgdmFyIGksIGxlbiwgY2hpbGQsIHRhcmdldE5vZGUsIGFyZWEsIGVubGFyZ2VtZW50LCBtaW5BcmVhLCBtaW5FbmxhcmdlbWVudDtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmIHx8IHBhdGgubGVuZ3RoIC0gMSA9PT0gbGV2ZWwpIGJyZWFrO1xuXG4gICAgICAgICAgICBtaW5BcmVhID0gbWluRW5sYXJnZW1lbnQgPSBJbmZpbml0eTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBhcmVhID0gYmJveEFyZWEoY2hpbGQuYmJveCk7XG4gICAgICAgICAgICAgICAgZW5sYXJnZW1lbnQgPSBlbmxhcmdlZEFyZWEoYmJveCwgY2hpbGQuYmJveCkgLSBhcmVhO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hvb3NlIGVudHJ5IHdpdGggdGhlIGxlYXN0IGFyZWEgZW5sYXJnZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZW5sYXJnZW1lbnQgPCBtaW5FbmxhcmdlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBtaW5FbmxhcmdlbWVudCA9IGVubGFyZ2VtZW50O1xuICAgICAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmxhcmdlbWVudCA9PT0gbWluRW5sYXJnZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgYXJlYVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICBfaW5zZXJ0OiBmdW5jdGlvbiAoaXRlbSwgbGV2ZWwsIGlzTm9kZSkge1xuXG4gICAgICAgIHZhciB0b0JCb3ggPSB0aGlzLnRvQkJveCxcbiAgICAgICAgICAgIGJib3ggPSBpc05vZGUgPyBpdGVtLmJib3ggOiB0b0JCb3goaXRlbSksXG4gICAgICAgICAgICBpbnNlcnRQYXRoID0gW107XG5cbiAgICAgICAgLy8gZmluZCB0aGUgYmVzdCBub2RlIGZvciBhY2NvbW1vZGF0aW5nIHRoZSBpdGVtLCBzYXZpbmcgYWxsIG5vZGVzIGFsb25nIHRoZSBwYXRoIHRvb1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX2Nob29zZVN1YnRyZWUoYmJveCwgdGhpcy5kYXRhLCBsZXZlbCwgaW5zZXJ0UGF0aCk7XG5cbiAgICAgICAgLy8gcHV0IHRoZSBpdGVtIGludG8gdGhlIG5vZGVcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgICAgICBleHRlbmQobm9kZS5iYm94LCBiYm94KTtcblxuICAgICAgICAvLyBzcGxpdCBvbiBub2RlIG92ZXJmbG93OyBwcm9wYWdhdGUgdXB3YXJkcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgd2hpbGUgKGxldmVsID49IDApIHtcbiAgICAgICAgICAgIGlmIChpbnNlcnRQYXRoW2xldmVsXS5jaGlsZHJlbi5sZW5ndGggPiB0aGlzLl9tYXhFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3BsaXQoaW5zZXJ0UGF0aCwgbGV2ZWwpO1xuICAgICAgICAgICAgICAgIGxldmVsLS07XG4gICAgICAgICAgICB9IGVsc2UgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGp1c3QgYmJveGVzIGFsb25nIHRoZSBpbnNlcnRpb24gcGF0aFxuICAgICAgICB0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoYmJveCwgaW5zZXJ0UGF0aCwgbGV2ZWwpO1xuICAgIH0sXG5cbiAgICAvLyBzcGxpdCBvdmVyZmxvd2VkIG5vZGUgaW50byB0d29cbiAgICBfc3BsaXQ6IGZ1bmN0aW9uIChpbnNlcnRQYXRoLCBsZXZlbCkge1xuXG4gICAgICAgIHZhciBub2RlID0gaW5zZXJ0UGF0aFtsZXZlbF0sXG4gICAgICAgICAgICBNID0gbm9kZS5jaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgICAgICBtID0gdGhpcy5fbWluRW50cmllcztcblxuICAgICAgICB0aGlzLl9jaG9vc2VTcGxpdEF4aXMobm9kZSwgbSwgTSk7XG5cbiAgICAgICAgdmFyIG5ld05vZGUgPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbi5zcGxpY2UodGhpcy5fY2hvb3NlU3BsaXRJbmRleChub2RlLCBtLCBNKSksXG4gICAgICAgICAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5vZGUubGVhZikgbmV3Tm9kZS5sZWFmID0gdHJ1ZTtcblxuICAgICAgICBjYWxjQkJveChub2RlLCB0aGlzLnRvQkJveCk7XG4gICAgICAgIGNhbGNCQm94KG5ld05vZGUsIHRoaXMudG9CQm94KTtcblxuICAgICAgICBpZiAobGV2ZWwpIGluc2VydFBhdGhbbGV2ZWwgLSAxXS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICBlbHNlIHRoaXMuX3NwbGl0Um9vdChub2RlLCBuZXdOb2RlKTtcbiAgICB9LFxuXG4gICAgX3NwbGl0Um9vdDogZnVuY3Rpb24gKG5vZGUsIG5ld05vZGUpIHtcbiAgICAgICAgLy8gc3BsaXQgcm9vdCBub2RlXG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbbm9kZSwgbmV3Tm9kZV0sXG4gICAgICAgICAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0ICsgMVxuICAgICAgICB9O1xuICAgICAgICBjYWxjQkJveCh0aGlzLmRhdGEsIHRoaXMudG9CQm94KTtcbiAgICB9LFxuXG4gICAgX2Nob29zZVNwbGl0SW5kZXg6IGZ1bmN0aW9uIChub2RlLCBtLCBNKSB7XG5cbiAgICAgICAgdmFyIGksIGJib3gxLCBiYm94Miwgb3ZlcmxhcCwgYXJlYSwgbWluT3ZlcmxhcCwgbWluQXJlYSwgaW5kZXg7XG5cbiAgICAgICAgbWluT3ZlcmxhcCA9IG1pbkFyZWEgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGkgPSBtOyBpIDw9IE0gLSBtOyBpKyspIHtcbiAgICAgICAgICAgIGJib3gxID0gZGlzdEJCb3gobm9kZSwgMCwgaSwgdGhpcy50b0JCb3gpO1xuICAgICAgICAgICAgYmJveDIgPSBkaXN0QkJveChub2RlLCBpLCBNLCB0aGlzLnRvQkJveCk7XG5cbiAgICAgICAgICAgIG92ZXJsYXAgPSBpbnRlcnNlY3Rpb25BcmVhKGJib3gxLCBiYm94Mik7XG4gICAgICAgICAgICBhcmVhID0gYmJveEFyZWEoYmJveDEpICsgYmJveEFyZWEoYmJveDIpO1xuXG4gICAgICAgICAgICAvLyBjaG9vc2UgZGlzdHJpYnV0aW9uIHdpdGggbWluaW11bSBvdmVybGFwXG4gICAgICAgICAgICBpZiAob3ZlcmxhcCA8IG1pbk92ZXJsYXApIHtcbiAgICAgICAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG5cbiAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChvdmVybGFwID09PSBtaW5PdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBkaXN0cmlidXRpb24gd2l0aCBtaW5pbXVtIGFyZWFcbiAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgbWluQXJlYSA9IGFyZWE7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfSxcblxuICAgIC8vIHNvcnRzIG5vZGUgY2hpbGRyZW4gYnkgdGhlIGJlc3QgYXhpcyBmb3Igc3BsaXRcbiAgICBfY2hvb3NlU3BsaXRBeGlzOiBmdW5jdGlvbiAobm9kZSwgbSwgTSkge1xuXG4gICAgICAgIHZhciBjb21wYXJlTWluWCA9IG5vZGUubGVhZiA/IHRoaXMuY29tcGFyZU1pblggOiBjb21wYXJlTm9kZU1pblgsXG4gICAgICAgICAgICBjb21wYXJlTWluWSA9IG5vZGUubGVhZiA/IHRoaXMuY29tcGFyZU1pblkgOiBjb21wYXJlTm9kZU1pblksXG4gICAgICAgICAgICB4TWFyZ2luID0gdGhpcy5fYWxsRGlzdE1hcmdpbihub2RlLCBtLCBNLCBjb21wYXJlTWluWCksXG4gICAgICAgICAgICB5TWFyZ2luID0gdGhpcy5fYWxsRGlzdE1hcmdpbihub2RlLCBtLCBNLCBjb21wYXJlTWluWSk7XG5cbiAgICAgICAgLy8gaWYgdG90YWwgZGlzdHJpYnV0aW9ucyBtYXJnaW4gdmFsdWUgaXMgbWluaW1hbCBmb3IgeCwgc29ydCBieSBtaW5YLFxuICAgICAgICAvLyBvdGhlcndpc2UgaXQncyBhbHJlYWR5IHNvcnRlZCBieSBtaW5ZXG4gICAgICAgIGlmICh4TWFyZ2luIDwgeU1hcmdpbikgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmVNaW5YKTtcbiAgICB9LFxuXG4gICAgLy8gdG90YWwgbWFyZ2luIG9mIGFsbCBwb3NzaWJsZSBzcGxpdCBkaXN0cmlidXRpb25zIHdoZXJlIGVhY2ggbm9kZSBpcyBhdCBsZWFzdCBtIGZ1bGxcbiAgICBfYWxsRGlzdE1hcmdpbjogZnVuY3Rpb24gKG5vZGUsIG0sIE0sIGNvbXBhcmUpIHtcblxuICAgICAgICBub2RlLmNoaWxkcmVuLnNvcnQoY29tcGFyZSk7XG5cbiAgICAgICAgdmFyIHRvQkJveCA9IHRoaXMudG9CQm94LFxuICAgICAgICAgICAgbGVmdEJCb3ggPSBkaXN0QkJveChub2RlLCAwLCBtLCB0b0JCb3gpLFxuICAgICAgICAgICAgcmlnaHRCQm94ID0gZGlzdEJCb3gobm9kZSwgTSAtIG0sIE0sIHRvQkJveCksXG4gICAgICAgICAgICBtYXJnaW4gPSBiYm94TWFyZ2luKGxlZnRCQm94KSArIGJib3hNYXJnaW4ocmlnaHRCQm94KSxcbiAgICAgICAgICAgIGksIGNoaWxkO1xuXG4gICAgICAgIGZvciAoaSA9IG07IGkgPCBNIC0gbTsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBleHRlbmQobGVmdEJCb3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKGxlZnRCQm94KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IE0gLSBtIC0gMTsgaSA+PSBtOyBpLS0pIHtcbiAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGV4dGVuZChyaWdodEJCb3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKHJpZ2h0QkJveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFyZ2luO1xuICAgIH0sXG5cbiAgICBfYWRqdXN0UGFyZW50QkJveGVzOiBmdW5jdGlvbiAoYmJveCwgcGF0aCwgbGV2ZWwpIHtcbiAgICAgICAgLy8gYWRqdXN0IGJib3hlcyBhbG9uZyB0aGUgZ2l2ZW4gdHJlZSBwYXRoXG4gICAgICAgIGZvciAodmFyIGkgPSBsZXZlbDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGV4dGVuZChwYXRoW2ldLmJib3gsIGJib3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9jb25kZW5zZTogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgcGF0aCwgcmVtb3ZpbmcgZW1wdHkgbm9kZXMgYW5kIHVwZGF0aW5nIGJib3hlc1xuICAgICAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxLCBzaWJsaW5nczsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChwYXRoW2ldLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncyA9IHBhdGhbaSAtIDFdLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncy5zcGxpY2Uoc2libGluZ3MuaW5kZXhPZihwYXRoW2ldKSwgMSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgICAgICB9IGVsc2UgY2FsY0JCb3gocGF0aFtpXSwgdGhpcy50b0JCb3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9pbml0Rm9ybWF0OiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIC8vIGRhdGEgZm9ybWF0IChtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIGFjY2Vzc29ycylcblxuICAgICAgICAvLyB1c2VzIGV2YWwtdHlwZSBmdW5jdGlvbiBjb21waWxhdGlvbiBpbnN0ZWFkIG9mIGp1c3QgYWNjZXB0aW5nIGEgdG9CQm94IGZ1bmN0aW9uXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGFsZ29yaXRobXMgYXJlIHZlcnkgc2Vuc2l0aXZlIHRvIHNvcnRpbmcgZnVuY3Rpb25zIHBlcmZvcm1hbmNlLFxuICAgICAgICAvLyBzbyB0aGV5IHNob3VsZCBiZSBkZWFkIHNpbXBsZSBhbmQgd2l0aG91dCBpbm5lciBjYWxsc1xuXG4gICAgICAgIC8vIGpzaGludCBldmlsOiB0cnVlXG5cbiAgICAgICAgdmFyIGNvbXBhcmVBcnIgPSBbJ3JldHVybiBhJywgJyAtIGInLCAnOyddO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1pblggPSBuZXcgRnVuY3Rpb24oJ2EnLCAnYicsIGNvbXBhcmVBcnIuam9pbihmb3JtYXRbMF0pKTtcbiAgICAgICAgdGhpcy5jb21wYXJlTWluWSA9IG5ldyBGdW5jdGlvbignYScsICdiJywgY29tcGFyZUFyci5qb2luKGZvcm1hdFsxXSkpO1xuXG4gICAgICAgIHRoaXMudG9CQm94ID0gbmV3IEZ1bmN0aW9uKCdhJywgJ3JldHVybiBbYScgKyBmb3JtYXQuam9pbignLCBhJykgKyAnXTsnKTtcbiAgICB9XG59O1xuXG5cbi8vIGNhbGN1bGF0ZSBub2RlJ3MgYmJveCBmcm9tIGJib3hlcyBvZiBpdHMgY2hpbGRyZW5cbmZ1bmN0aW9uIGNhbGNCQm94KG5vZGUsIHRvQkJveCkge1xuICAgIG5vZGUuYmJveCA9IGRpc3RCQm94KG5vZGUsIDAsIG5vZGUuY2hpbGRyZW4ubGVuZ3RoLCB0b0JCb3gpO1xufVxuXG4vLyBtaW4gYm91bmRpbmcgcmVjdGFuZ2xlIG9mIG5vZGUgY2hpbGRyZW4gZnJvbSBrIHRvIHAtMVxuZnVuY3Rpb24gZGlzdEJCb3gobm9kZSwgaywgcCwgdG9CQm94KSB7XG4gICAgdmFyIGJib3ggPSBlbXB0eSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IGssIGNoaWxkOyBpIDwgcDsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgZXh0ZW5kKGJib3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZC5iYm94KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmJveDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoKSB7IHJldHVybiBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07IH1cblxuZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICBhWzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgYVsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIGFbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICBhWzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWChhLCBiKSB7IHJldHVybiBhLmJib3hbMF0gLSBiLmJib3hbMF07IH1cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWShhLCBiKSB7IHJldHVybiBhLmJib3hbMV0gLSBiLmJib3hbMV07IH1cblxuZnVuY3Rpb24gYmJveEFyZWEoYSkgICB7IHJldHVybiAoYVsyXSAtIGFbMF0pICogKGFbM10gLSBhWzFdKTsgfVxuZnVuY3Rpb24gYmJveE1hcmdpbihhKSB7IHJldHVybiAoYVsyXSAtIGFbMF0pICsgKGFbM10gLSBhWzFdKTsgfVxuXG5mdW5jdGlvbiBlbmxhcmdlZEFyZWEoYSwgYikge1xuICAgIHJldHVybiAoTWF0aC5tYXgoYlsyXSwgYVsyXSkgLSBNYXRoLm1pbihiWzBdLCBhWzBdKSkgKlxuICAgICAgICAgICAoTWF0aC5tYXgoYlszXSwgYVszXSkgLSBNYXRoLm1pbihiWzFdLCBhWzFdKSk7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdGlvbkFyZWEoYSwgYikge1xuICAgIHZhciBtaW5YID0gTWF0aC5tYXgoYVswXSwgYlswXSksXG4gICAgICAgIG1pblkgPSBNYXRoLm1heChhWzFdLCBiWzFdKSxcbiAgICAgICAgbWF4WCA9IE1hdGgubWluKGFbMl0sIGJbMl0pLFxuICAgICAgICBtYXhZID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgbWF4WCAtIG1pblgpICpcbiAgICAgICAgICAgTWF0aC5tYXgoMCwgbWF4WSAtIG1pblkpO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPD0gYlswXSAmJlxuICAgICAgICAgICBhWzFdIDw9IGJbMV0gJiZcbiAgICAgICAgICAgYlsyXSA8PSBhWzJdICYmXG4gICAgICAgICAgIGJbM10gPD0gYVszXTtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0cyhhLCBiKSB7XG4gICAgcmV0dXJuIGJbMF0gPD0gYVsyXSAmJlxuICAgICAgICAgICBiWzFdIDw9IGFbM10gJiZcbiAgICAgICAgICAgYlsyXSA+PSBhWzBdICYmXG4gICAgICAgICAgIGJbM10gPj0gYVsxXTtcbn1cblxuLy8gc29ydCBhbiBhcnJheSBzbyB0aGF0IGl0ZW1zIGNvbWUgaW4gZ3JvdXBzIG9mIG4gdW5zb3J0ZWQgaXRlbXMsIHdpdGggZ3JvdXBzIHNvcnRlZCBiZXR3ZWVuIGVhY2ggb3RoZXI7XG4vLyBjb21iaW5lcyBzZWxlY3Rpb24gYWxnb3JpdGhtIHdpdGggYmluYXJ5IGRpdmlkZSAmIGNvbnF1ZXIgYXBwcm9hY2hcblxuZnVuY3Rpb24gbXVsdGlTZWxlY3QoYXJyLCBsZWZ0LCByaWdodCwgbiwgY29tcGFyZSkge1xuICAgIHZhciBzdGFjayA9IFtsZWZ0LCByaWdodF0sXG4gICAgICAgIG1pZDtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbikgY29udGludWU7XG5cbiAgICAgICAgbWlkID0gbGVmdCArIE1hdGguY2VpbCgocmlnaHQgLSBsZWZ0KSAvIG4gLyAyKSAqIG47XG4gICAgICAgIHNlbGVjdChhcnIsIGxlZnQsIHJpZ2h0LCBtaWQsIGNvbXBhcmUpO1xuXG4gICAgICAgIHN0YWNrLnB1c2gobGVmdCwgbWlkLCBtaWQsIHJpZ2h0KTtcbiAgICB9XG59XG5cbi8vIEZsb3lkLVJpdmVzdCBzZWxlY3Rpb24gYWxnb3JpdGhtOlxuLy8gc29ydCBhbiBhcnJheSBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IChpbmNsdXNpdmUpIHNvIHRoYXQgdGhlIHNtYWxsZXN0IGsgZWxlbWVudHMgY29tZSBmaXJzdCAodW5vcmRlcmVkKVxuZnVuY3Rpb24gc2VsZWN0KGFyciwgbGVmdCwgcmlnaHQsIGssIGNvbXBhcmUpIHtcbiAgICB2YXIgbiwgaSwgeiwgcywgc2QsIG5ld0xlZnQsIG5ld1JpZ2h0LCB0LCBqO1xuXG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKGkgLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIGkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIGkpICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGFyciwgbmV3TGVmdCwgbmV3UmlnaHQsIGssIGNvbXBhcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdCA9IGFycltrXTtcbiAgICAgICAgaSA9IGxlZnQ7XG4gICAgICAgIGogPSByaWdodDtcblxuICAgICAgICBzd2FwKGFyciwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlKGFycltyaWdodF0sIHQpID4gMCkgc3dhcChhcnIsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXAoYXJyLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltpXSwgdCkgPCAwKSBpKys7XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbal0sIHQpID4gMCkgai0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnIsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXAoYXJyLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIHZhciB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxuXG4vLyBleHBvcnQgYXMgQU1EL0NvbW1vbkpTIG1vZHVsZSBvciBnbG9iYWwgdmFyaWFibGVcbmlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZSgncmJ1c2gnLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJidXNoOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IHJidXNoO1xuZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSBzZWxmLnJidXNoID0gcmJ1c2g7XG5lbHNlIHdpbmRvdy5yYnVzaCA9IHJidXNoO1xuXG59KSgpO1xuIiwiLy8gQ29weXJpZ2h0IDIwMTQgU2ltb24gTHlkZWxsXHJcbi8vIFgxMSAo4oCcTUlU4oCdKSBMaWNlbnNlZC4gKFNlZSBMSUNFTlNFLilcclxuXHJcbnZvaWQgKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcclxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcclxuICAgIGRlZmluZShmYWN0b3J5KVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJvb3QucmVzb2x2ZVVybCA9IGZhY3RvcnkoKVxyXG4gIH1cclxufSh0aGlzLCBmdW5jdGlvbigpIHtcclxuXHJcbiAgZnVuY3Rpb24gcmVzb2x2ZVVybCgvKiAuLi51cmxzICovKSB7XHJcbiAgICB2YXIgbnVtVXJscyA9IGFyZ3VtZW50cy5sZW5ndGhcclxuXHJcbiAgICBpZiAobnVtVXJscyA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvbHZlVXJsIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudDsgZ290IG5vbmUuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGJhc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKVxyXG4gICAgYmFzZS5ocmVmID0gYXJndW1lbnRzWzBdXHJcblxyXG4gICAgaWYgKG51bVVybHMgPT09IDEpIHtcclxuICAgICAgcmV0dXJuIGJhc2UuaHJlZlxyXG4gICAgfVxyXG5cclxuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdXHJcbiAgICBoZWFkLmluc2VydEJlZm9yZShiYXNlLCBoZWFkLmZpcnN0Q2hpbGQpXHJcblxyXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxyXG4gICAgdmFyIHJlc29sdmVkXHJcblxyXG4gICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IG51bVVybHM7IGluZGV4KyspIHtcclxuICAgICAgYS5ocmVmID0gYXJndW1lbnRzW2luZGV4XVxyXG4gICAgICByZXNvbHZlZCA9IGEuaHJlZlxyXG4gICAgICBiYXNlLmhyZWYgPSByZXNvbHZlZFxyXG4gICAgfVxyXG5cclxuICAgIGhlYWQucmVtb3ZlQ2hpbGQoYmFzZSlcclxuXHJcbiAgICByZXR1cm4gcmVzb2x2ZWRcclxuICB9XHJcblxyXG4gIHJldHVybiByZXNvbHZlVXJsXHJcblxyXG59KSk7XHJcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5faWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBjb29yZHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXVswXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgICAgICB0eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwidmFyIGJ1bmRsZUZuID0gYXJndW1lbnRzWzNdO1xudmFyIHNvdXJjZXMgPSBhcmd1bWVudHNbNF07XG52YXIgY2FjaGUgPSBhcmd1bWVudHNbNV07XG5cbnZhciBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIHZhciB3a2V5O1xuICAgIHZhciBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjYWNoZSk7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgIGlmIChjYWNoZVtrZXldLmV4cG9ydHMgPT09IGZuKSB7XG4gICAgICAgICAgICB3a2V5ID0ga2V5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJywnbW9kdWxlJywnZXhwb3J0cyddLCAnKCcgKyBmbiArICcpKHNlbGYpJyksXG4gICAgICAgICAgICB3Y2FjaGVcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIHNrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICBcbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJ10sJ3JlcXVpcmUoJyArIHN0cmluZ2lmeSh3a2V5KSArICcpKHNlbGYpJyksXG4gICAgICAgIHNjYWNoZVxuICAgIF07XG4gICAgXG4gICAgdmFyIHNyYyA9ICcoJyArIGJ1bmRsZUZuICsgJykoeydcbiAgICAgICAgKyBPYmplY3Qua2V5cyhzb3VyY2VzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShrZXkpICsgJzpbJ1xuICAgICAgICAgICAgICAgICsgc291cmNlc1trZXldWzBdXG4gICAgICAgICAgICAgICAgKyAnLCcgKyBzdHJpbmdpZnkoc291cmNlc1trZXldWzFdKSArICddJ1xuICAgICAgICAgICAgO1xuICAgICAgICB9KS5qb2luKCcsJylcbiAgICAgICAgKyAnfSx7fSxbJyArIHN0cmluZ2lmeShza2V5KSArICddKSdcbiAgICA7XG4gICAgXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcbiAgICBcbiAgICByZXR1cm4gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgICBuZXcgQmxvYihbc3JjXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KVxuICAgICkpO1xufTtcbiJdfQ== diff --git a/demo/streets-mobile.json b/demo/streets-mobile.json deleted file mode 100644 index 522c5be102f..00000000000 --- a/demo/streets-mobile.json +++ /dev/null @@ -1,9001 +0,0 @@ -{ - "version" : 7, - "sprite" : "http://basemapsbeta.arcgis.com/preview/styles/StreetMapMobile/resources/sprites/sprite", - "glyphs" : "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/fonts/{fontstack}/{range}.pbf", - "sources" : { - "esri" : { - "type" : "indexedVector", - "minZoom" : 0, - "maxZoom" : 19, - "bounds" : [ - -180, - -85.0511, - 180, - 85.0511 - ], - "name" : "World", - "scheme" : "xyz", - "tilejson" : "2.0.0", - "tiles" : [ - "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/tile/{z}/{x}/{y}.pbf" - ], - "index" : "http://basemapsbeta.arcgis.com/arcgis/rest/services/World_Basemap/VectorTileServer/tilemap/index.json" - } - }, - "constants" : { - "@waterbody_sea_fill_color" : "#b6deff", - "@waterbody_sea_1_fill_color" : "#b6deff", - "@Arial Italic" : "Arial Italic", - "@land_land_fill_color" : "#F6F1E7", - "@land_land_1_fill_color" : "#a9cdeb", - "@land_ice_fill_color" : "#FFFFFF", - "@land_ice_1_fill_color" : "#a9cdeb", - "@bathymetry_2_fill_color" : "#b6deff", - "@bathymetry_3_fill_color" : "#b6deff", - "@bathymetry_4_fill_color" : "#b6deff", - "@bathymetry_5_fill_color" : "#b6deff", - "@bathymetry_6_fill_color" : "#b6deff", - "@bathymetry_7_fill_color" : "#b6deff", - "@urban_areas_fill_color" : "#EBE3DC", - "@vectorvegsmallscale_9_fill_color" : "#cbe5b1", - "@vectorvegsmallscale_10_fill_color" : "#bae291", - "@vectorvegsmallscale_9_1_fill_color" : "#cbe5b1", - "@vectorvegsmallscale_10_1_fill_color" : "#bae291", - "@airport_airport_property_SL1_SLD0_fill_color" : "#E0E1E0", - "@airport_airport_property_SL0_SLD0_line_color" : "#d1d1d1", - "@airport_airport_property_SL0_SLD0_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.666667], [14, 0.666667], [17, 0.666667]] - }, - "@airport_airport_runway_SLD1_fill_color" : "#CFD0D0", - "@Arial Regular" : "Arial Regular", - "@admin1_park_fill_color" : "#cbe5b1", - "@admin_0_forest;_admin_0_park_fill_color" : "#cbe5b1", - "@open_space_fill_color" : "#cbe5b1", - "@water_supply_and_treatment_SL1_fill_color" : "#E0E1E0", - "@water_supply_and_treatment_SL0_line_color" : "#d1d1d1", - "@water_supply_and_treatment_SL0_line_width" : { - "base" : 1.2, - "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@transportation_facility_SL1_fill_color" : "#E0E1E0", - "@transportation_facility_SL0_line_color" : "#d1d1d1", - "@transportation_facility_SL0_line_width" : { - "base" : 1.2, - "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@port_facility_SL1_fill_color" : "#E0E1E0", - "@port_facility_SL0_line_color" : "#d1d1d1", - "@port_facility_SL0_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.266667], [17, 0.266667]] - }, - "@military_SL1_fill_color" : "#E0E1E0", - "@military_SL0_line_color" : "#d1d1d1", - "@military_SL0_line_width" : { - "base" : 1.2, - "stops" : [[6, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@industry_SL1_fill_color" : "#E0E1E0", - "@industry_SL0_line_color" : "#d1d1d1", - "@industry_SL0_line_width" : { - "base" : 1.2, - "stops" : [[13, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@tribal_government_facility_fill_color" : "#ded9cb", - "@mail_and_shipping_fill_color" : "#E8E3D5", - "@energy;_government;_information_and_communication_fill_color" : "#E8E3D5", - "@building_general;_emergency_response_and_law_enforcement_fill_color" : "#E8E3D5", - "@banking_and_finance_fill_color" : "#E8E3D5", - "@health_and_medical_SL1_fill_color" : "#fcd6a8", - "@health_and_medical_SL0_line_color" : "#fcd6a8", - "@health_and_medical_SL0_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@public_attraction_and_landmark_fill_color" : "#fcd6a8", - "@commercial_and_retail_fill_color" : "#fcd6a8", - "@education_fill_color" : "#fddfd6", - "@cemetery_fill_color" : "#cbe5b1", - "@golf_course_SL1_fill_color" : "#cbe5b1", - "@golf_course_SL0_line_color" : "#cbe5b1", - "@golf_course_SL0_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.266667], [14, 0.266667], [17, 0.266667]] - }, - "@zoo_fill_color" : "#cbe5b1", - "@park_fill_color" : "#cbe5b1", - "@water_body_577k_-_2m_lake_or_pond;_stream_or_river_fill_color" : "#b6deff", - "@water_body_577k_-_2m_lake_or_pond-intermittent_fill_color" : "#b6deff", - "@water_body_4m_-_9m_lake_or_pond;_stream_or_river_fill_color" : "#b6deff", - "@water_body_4m_-_9m_lake_or_pond-intermittent_fill_color" : "#b6deff", - "@water_body_18m_-_147m_SL1_fill_color" : "#b6deff", - "@water_body_18m_-_147m_SL0_line_color" : "#b6deff", - "@water_body_18m_-_147m_SL0_line_width" : { - "base" : 1.2, - "stops" : [[1, 0.533333], [5, 0.533333]] - }, - "@waterbody_inundated_area_SLD0_fill_color" : "#b6deff", - "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3_fill_color" : "#b6deff", - "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_color" : "#b6deff", - "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.666667], [14, 0.666667], [17, 0.666667]] - }, - "@waterbody_playa_SLD4_fill_color" : "#b6deff", - "@waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash_SLD4_fill_color" : "#b6deff", - "@waterbody_ice_mass_SLD6_fill_color" : "#b6deff", - "@waterbody_swamp_or_marsh_SLD6_fill_color" : "#b6deff", - "@Arial Bold Italic" : "Arial Bold Italic", - "@water_flowline_577k_-_2m_stream_or_river_line_color" : "#b6deff", - "@water_flowline_577k_-_2m_stream_or_river_line_width" : { - "base" : 1.2, - "stops" : [[7, 0.5], [11, 0.7]] - }, - "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_color" : "#b6deff", - "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_width" : { - "base" : 1.2, - "stops" : [[7, 0.5], [11, 0.7]] - }, - "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_color" : "#b6deff", - "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_width" : { - "base" : 1.2, - "stops" : [[7, 0.533333], [11, 0.533333]] - }, - "@water_flowline_577k_-_2m_canal_or_ditch_SL0_icon_image" : "water_flowline_577k_-_2m_canal_or_ditch_SL0", - "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_color" : "#b6deff", - "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_width" : { - "base" : 1.2, - "stops" : [[7, 0.5], [11, 0.7]] - }, - "@water_flowline_4m_-_9m_line_color" : "#b6deff", - "@water_flowline_4m_-_9m_line_width" : { - "base" : 1.2, - "stops" : [[5, 0.5], [7, 0.7]] - }, - "@water_flowline_18m_-_147m_line_color" : "#b6deff", - "@water_flowline_18m_-_147m_line_width" : { - "base" : 1.2, - "stops" : [[1, 0.5], [5, 0.7]] - }, - "@waterline_canal_or_ditch_SL1_line_color" : "#b6deff", - "@waterline_canal_or_ditch_SL1_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.7], [14, 1.0], [17, 2]] - }, - "@waterline_canal_or_ditch_SL0_icon_image" : "waterline_canal_or_ditch_SL0", - "@waterline_stream_or_river-intermittent_line_color" : "#b6deff", - "@waterline_stream_or_river-intermittent_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.7], [14, 0.7], [17, 2]] - }, - "@waterline_stream_or_river-intermittent_line_dasharray" : [10.6667, 1.77778], - "@waterline_stream_or_river;_artificial_path;_connector_line_color" : "#b6deff", - "@waterline_stream_or_river;_artificial_path;_connector_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.7], [14, 0.7], [17, 2.66667]] - }, - "@landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0_fill_color" : "#cbe5b1", - "@landscape_grass_SLD1_fill_color" : "#c1d9a8", - "@landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2_fill_color" : "#FCEDC2", - "@landscape_pool___fountain_SLD3_fill_color" : "#b6deff", - "@sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0_fill_color" : "#cbe5b1", - "@sports_baseball_field;_softball_field_SL1_SLD1_fill_color" : "#cbe5b1", - "@sports_baseball_field;_softball_field_SL0_SLD1_line_color" : "#c3e3a4", - "@sports_baseball_field;_softball_field_SL0_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.266667], [17, 0.266667]] - }, - "@sports_golf_fairway_SLD2_fill_color" : "#bcd4a4", - "@sports_golf_sand_trap_SLD3_fill_color" : "#FFFFD4", - "@sports_golf_putting_green___teeing_ground_SL1_SLD4_fill_color" : "#afc698", - "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_color" : "#FFFFD4", - "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_width" : { - "base" : 1.2, - "stops" : [[14, 2], [17, 2]] - }, - "@sports_golf_water_hazard_SLD5_fill_color" : "#b6deff", - "@sports_athletic_track;_track_-_clay_or_dirt_SLD6_fill_color" : "#FFCCCC", - "@sports_hardcourt_SL1_SLD7_fill_color" : "#DEDED1", - "@sports_hardcourt_SL0_SLD7_line_color" : "#CCCCC0", - "@sports_hardcourt_SL0_SLD7_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.266667], [17, 0.266667]] - }, - "@pavement_parking_lot;_parking_lot_other_SLD0_fill_color" : "#DEDED1", - "@pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1_fill_color" : "#FFFFFF", - "@pavement_ipc_garden_path_SL1_SLD2_fill_color" : "#FFFFFF", - "@pavement_ipc_garden_path_SL0_SLD2_line_color" : "#E3DED6", - "@pavement_ipc_garden_path_SL0_SLD2_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.266667], [17, 0.266667]] - }, - "@special_area_of_interest_line_line_color" : "#FFFFFF", - "@special_area_of_interest_line_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.666667], [17, 0.666667]] - }, - "@building_footprint_SL1_fill_color" : "#EBE7DC", - "@building_footprint_SL1_1_fill_color" : "#D1CAC5", - "@building_footprint_SL0_line_color" : "#f8f7f4", - "@building_footprint_SL0_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.75], [17, 0.75]] - }, - "@trails_and_paths_SLD0_line_color" : "#FDFDFD", - "@trails_and_paths_SLD0_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.6], [17, 1.6]] - }, - "@Arial Bold" : "Arial Bold", - "@ferry_inland_water_ferry;_ocean_ferry_line_color" : "#92c5f8", - "@ferry_inland_water_ferry;_ocean_ferry_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.0], [14, 1.0], [17, 1.0]] - }, - "@ferry_inland_water_ferry;_ocean_ferry_line_dasharray" : [6.06061, 3.63636], - "@ferry_rail_ferry_SL2_line_color" : "#CFD0D0", - "@ferry_rail_ferry_SL2_line_width" : { - "base" : 1.2, - "stops" : [[11, 3.33333], [14, 4], [17, 4]] - }, - "@ferry_rail_ferry_SL1_line_color" : "#E0E1E0", - "@ferry_rail_ferry_SL1_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 1.33333], [17, 1.33333]] - }, - "@ferry_rail_ferry_SL0_icon_image" : "ferry_rail_ferry_SL0", - "@road_centerlines_4wd;_recreation_SL1_SLD0_line_color" : "#FFFFFF", - "@road_centerlines_4wd;_recreation_SL1_SLD0_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 2], [17, 4]] - }, - "@road_centerlines_local_road_SL1_SLD1_line_color" : "#CCCCCC", - "@road_centerlines_local_road_SL1_SLD1_line_width" : { - "base" : 1.4, - "stops" : [[11, 1.5], [14, 4.0], [17, 6.0]] - }, - "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color" : "#CCCCCC", - "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.5], [14, 3.33333], [17, 4.33333]] - }, - "@road_centerlines_pedestrian_SLD1_line_color" : "#ebe8e2", - "@road_centerlines_pedestrian_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[14, 0.75], [17, 2.6]] - }, - "@road_centerlines_4wd;_recreation_SL0_SLD1_line_color" : "#CCCCCC", - "@road_centerlines_4wd;_recreation_SL0_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[11, 1], [14, 1], [17, 2]] - }, - "@road_centerlines_local_road_SL0_SLD5_line_color" : "#FDFDFD", - "@road_centerlines_local_road_SL0_SLD5_line_width" : { - "base" : 1.4, - "stops" : [[11, 0.75], [14, 2.66667], [17, 4.66667]] - }, - "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color" : "#FDFDFD", - "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.75], [14, 1.33333], [17, 2.33333]] - }, - "@road_centerlines_minor_arterial_SL1_SLD7_line_color" : "#acaeb0", - "@road_centerlines_minor_arterial_SL1_SLD7_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.7], [14, 6.66667], [17, 6.66667]] - }, - "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color" : "#acaeb0", - "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4], [17, 6]] - }, - "@road_centerlines_minor_arterial_SL0_SLD9_line_color" : "#FFFFFF", - "@road_centerlines_minor_arterial_SL0_SLD9_line_width" : { - "base" : 1.2, - "stops" : [[9, 1], [14, 4.66667], [17, 4.66667]] - }, - "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color" : "#FFFFFF", - "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.75], [14, 2], [17, 4]] - }, - "@road_centerlines_major_arterial_SL1_SLD11_line_color" : "#f7b45e", - "@road_centerlines_major_arterial_SL1_SLD11_line_width" : { - "base" : 1.2, - "stops" : [[8, 1.5], [14, 7.33333], [17, 14.33333]] - }, - "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color" : "#f7b45e", - "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4.66667], [17, 7.66667]] - }, - "@road_centerlines_major_arterial_SL0_SLD13_line_color" : "#FFEBC4", - "@road_centerlines_major_arterial_SL0_SLD13_line_width" : { - "base" : 1.2, - "stops" : [[8, 0.75], [14, 5.33333], [17, 10.33333]] - }, - "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color" : "#FFEBC4", - "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.75], [14, 2.66667], [17, 4.66667]] - }, - "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_color" : "#FF9A42", - "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" : { - "base" : 1.2, - "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] - }, - "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_color" : "#d4d1ca", - "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_width" : { - "base" : 1.2, - "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] - }, - "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color" : "#FF9A42", - "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4.66667], [17, 8.66667]] - }, - "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_color" : "#FFEC80", - "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" : { - "base" : 1.2, - "stops" : [[4, 0.55], [14, 5.33333], [17, 10.33333]] - }, - "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color" : "#FFEC80", - "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.55], [14, 2.66667], [17, 4.66667]] - }, - "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_color" : "#FFFFFF", - "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 2], [17, 4]] - }, - "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_color" : "#CCCCCC", - "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_width" : { - "base" : 1.4, - "stops" : [[11, 1.5], [14, 4.0], [17, 6.0]] - }, - "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color" : "#CCCCCC", - "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.5], [14, 3.33333], [17, 4.33333]] - }, - "@road_centerlines_(tunnels)_pedestrian_SLD1_line_color" : "#FDFDFD", - "@road_centerlines_(tunnels)_pedestrian_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.6], [17, 1.6]] - }, - "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_color" : "#D4D4AE", - "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_width" : { - "base" : 1.2, - "stops" : [[11, 1], [14, 1], [17, 1]] - }, - "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_color" : "#FDFDFD", - "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 2.66667], [17, 2.66667]] - }, - "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color" : "#FDFDFD", - "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 1.33333], [17, 1.33333]] - }, - "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_color" : "#acaeb0", - "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.7], [14, 6.66667], [17, 6.66667]] - }, - "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color" : "#acaeb0", - "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4], [17, 6]] - }, - "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_color" : "#FFFFFF", - "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_width" : { - "base" : 1.2, - "stops" : [[9, 1], [14, 4.66667], [17, 4.66667]] - }, - "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color" : "#FFFFFF", - "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.75], [14, 2], [17, 4]] - }, - "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_color" : "#f7b45e", - "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_width" : { - "base" : 1.2, - "stops" : [[8, 1.5], [14, 7.33333], [17, 14.33333]] - }, - "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color" : "#f7b45e", - "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4.66667], [17, 7.66667]] - }, - "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_color" : "#ffebc4", - "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_width" : { - "base" : 1.2, - "stops" : [[8, 0.75], [14, 5.33333], [17, 10.33333]] - }, - "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color" : "#ffebc4", - "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.75], [14, 2.66667], [17, 4.66667]] - }, - "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_color" : "#FF9A42", - "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" : { - "base" : 1.2, - "stops" : [[4, 1.3], [14, 7.33333], [17, 14.33333]] - }, - "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color" : "#FF9A42", - "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" : { - "base" : 1.2, - "stops" : [[9, 1.5], [14, 4.66667], [17, 8.66667]] - }, - "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_color" : "#FFEC80", - "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" : { - "base" : 1.2, - "stops" : [[4, 0.55], [14, 5.33333], [17, 10.33333]] - }, - "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color" : "#FFEC80", - "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" : { - "base" : 1.2, - "stops" : [[9, 0.55], [14, 2.66667], [17, 4.66667]] - }, - "@railroad_SL2_line_color" : "#CFD0D0", - "@railroad_SL2_line_width" : { - "base" : 1.2, - "stops" : [[11, 1.33333], [14, 1.33333], [17, 3.33333]] - }, - "@railroad_SL1_line_color" : "#dbdddb", - "@railroad_SL1_line_width" : { - "base" : 1.2, - "stops" : [[11, 0.75], [14, 0.75], [17, 1.33333]] - }, - "@railroad_SL0_icon_image" : "railroad_SL0", - "@boundaries_admin0_SL1_SLD2_line_color" : "#ddd8e7", - "@boundaries_admin0_SL1_SLD2_line_width" : { - "base" : 1.2, - "stops" : [[1, 1.5], [14, 9.0], [17, 9.0]] - }, - "@boundaries_admin0_SL1_SLD2_1_line_color" : "#b9b5ad", - "@boundaries_admin0_SL1_SLD2_1_line_width" : { - "base" : 1.2, - "stops" : [[1, 1], [14, 9.33333], [17, 9.33333]] - }, - "@boundaries_admin1_SL1_SLD2_line_color" : "#ece9f5", - "@boundaries_admin1_SL1_SLD2_line_width" : { - "base" : 1.0, - "stops" : [[4, 1.0], [14, 5.0], [17, 5.0]] - }, - "@boundaries_admin2_SL1_SLD2_line_color" : "#e6e0f0", - "@boundaries_admin2_SL1_SLD2_line_width" : { - "base" : 1.2, - "stops" : [[8, 0], [14, 0], [17, 0]] - }, - "@boundaries_admin0_SL0_SLD5_line_color" : "#c4bbd8", - "@boundaries_admin0_SL0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[1, 0.5], [14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin1_SL0_SLD5_line_color" : "#d7ccef", - "@boundaries_admin1_SL0_SLD5_line_width" : { - "base" : 1.0, - "stops" : [[4, 0.5], [14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin2_SL0_SLD5_line_color" : "#d1c7e8", - "@boundaries_admin2_SL0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[8, 1.0], [14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin2_SL0_SLD5_line_dasharray" : [8, 5.33333], - "@boundaries_admin3_SLD5_line_color" : "#CCCCCC", - "@boundaries_admin3_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin3_SLD5_line_dasharray" : [6.66667, 4], - "@boundaries_admin4_SLD5_line_color" : "#CCCCCC", - "@boundaries_admin4_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin4_SLD5_line_dasharray" : [6.66667, 4], - "@boundaries_admin5_SLD5_line_color" : "#CCCCCC", - "@boundaries_admin5_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.33333], [17, 1.33333]] - }, - "@boundaries_admin5_SLD5_line_dasharray" : [6.66667, 4], - "@boundaries_disputed_admin0_SLD5_line_color" : "#CCCCCC", - "@boundaries_disputed_admin0_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[1, 1.33333], [14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin0_SLD5_line_dasharray" : [6.0, 3.0], - "@boundaries_disputed_admin1_SLD5_line_color" : "#CCCCCC", - "@boundaries_disputed_admin1_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[4, 1.33333], [14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin1_SLD5_line_dasharray" : [6.0, 3.0], - "@boundaries_disputed_admin2_SLD5_line_color" : "#CCCCCC", - "@boundaries_disputed_admin2_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[10, 1.33333], [14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin2_SLD5_line_dasharray" : [6.0, 3.0], - "@boundaries_disputed_admin3_SLD5_line_color" : "#CCCCCC", - "@boundaries_disputed_admin3_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin3_SLD5_line_dasharray" : [6.0, 3.0], - "@boundaries_disputed_admin4_SLD5_line_color" : "#9DA0A2", - "@boundaries_disputed_admin4_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin4_SLD5_line_dasharray" : [6.0, 3.0], - "@boundaries_disputed_admin5_SLD5_line_color" : "#CCCCCC", - "@boundaries_disputed_admin5_SLD5_line_width" : { - "base" : 1.2, - "stops" : [[14, 1.6], [17, 1.6]] - }, - "@boundaries_disputed_admin5_SLD5_line_dasharray" : [6.0, 3.0], - "@points_of_interest_bus_station_icon_image" : "points_of_interest_bus_station", - "@points_of_interest_rail_station_icon_image" : "points_of_interest_rail_station", - "@populated_places_(large_scale)_icon_image" : "populated_places_(large_scale)", - "@populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital", - "@populated_places_(small_scale)_1,000,000_and_up,_admin1_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin1_capital", - "@populated_places_(small_scale)_1,000,000_and_up,_admin2_capital_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_admin2_capital", - "@populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place", - "@populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital", - "@populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital", - "@populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place", - "@populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital", - "@populated_places_(small_scale)_100,000_to_299,999,_admin1_capital_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_admin1_capital", - "@populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place", - "@populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital", - "@populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital", - "@populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place_icon_image" : "populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place", - "@populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital", - "@populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital", - "@populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet_icon_image" : "populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet", - "@populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital_icon_image" : "populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital", - "@populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet_icon_image" : "populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet", - "@populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital_icon_image" : "populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital" - }, - "layers" : [{ - "id" : "background", - "type" : "background", - "paint" : { - "background-color" : "#F6F1E7" - } - },{ - "id" : "waterbody_sea_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody_Sea", - "minzoom" : 0, - "layout" : {}, - "paint" : { - "fill-color" : "@waterbody_sea_1_fill_color" - } - }, { - "id" : "waterbody_sea", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody_Sea", - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@waterbody_sea_fill_color" - } - }, { - "id" : "bathymetry_2", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 0], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_2_fill_color" - } - }, { - "id" : "bathymetry_3", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 1], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_3_fill_color" - } - }, { - "id" : "bathymetry_4", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 2], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_4_fill_color" - } - }, { - "id" : "bathymetry_5", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 3], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_5_fill_color" - } - }, { - "id" : "bathymetry_6", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 4], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_6_fill_color" - } - }, { - "id" : "bathymetry_7", - "type" : "fill", - "source" : "esri", - "source-layer" : "Bathymetry", - "filter" : ["==", "_symbol", 5], - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@bathymetry_7_fill_color" - } - }, { - "id" : "land_land_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Land", - "filter" : ["==", "_symbol", 0], - "minzoom" : 0, - "layout" : {}, - "paint" : { - "fill-color" : "@land_land_1_fill_color", - "fill-translate" : [2,2] - } - },{ - "id" : "land_land", - "type" : "fill", - "source" : "esri", - "source-layer" : "Land", - "filter" : ["==", "_symbol", 0], - "minzoom" : 0, - "layout" : {}, - "paint" : { - "fill-color" : "@land_land_fill_color" - } - }, { - "id" : "land_ice_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Land", - "filter" : ["==", "_symbol", 1], - "minzoom" : 0, - "layout" : {}, - "paint" : { - "fill-color" : "@land_ice_1_fill_color", - "fill-translate" : [2,2] - } - }, { - "id" : "land_ice", - "type" : "fill", - "source" : "esri", - "source-layer" : "Land", - "filter" : ["==", "_symbol", 1], - "minzoom" : 0, - "layout" : {}, - "paint" : { - "fill-color" : "@land_ice_fill_color" - } - },{ - "id" : "urban_areas", - "type" : "fill", - "source" : "esri", - "source-layer" : "Urban Areas", - "minzoom" : 5, - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@urban_areas_fill_color" - } - }, { - "id" : "vectorvegsmallscale_9_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "VectorVegSmallScale", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "maxzoom" : 4, - "layout" : {}, - "paint" : { - "fill-color" : "@vectorvegsmallscale_9_1_fill_color", - "fill-opacity" : 0.15 - } - }, { - "id" : "vectorvegsmallscale_10_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "VectorVegSmallScale", - "filter" : ["==", "_symbol", 1], - "minzoom" : 4, - "maxzoom" : 4, - "layout" : {}, - "paint" : { - "fill-color" : "@vectorvegsmallscale_10_1_fill_color", - "fill-opacity" : 0.15 - } - }, { - "id" : "vectorvegsmallscale_9", - "type" : "fill", - "source" : "esri", - "source-layer" : "VectorVegSmallScale", - "filter" : ["==", "_symbol", 0], - "maxzoom" : 4, - "layout" : {}, - "paint" : { - "fill-color" : "@vectorvegsmallscale_9_fill_color", - "fill-opacity" : 0.2 - } - }, { - "id" : "vectorvegsmallscale_10", - "type" : "fill", - "source" : "esri", - "source-layer" : "VectorVegSmallScale", - "filter" : ["==", "_symbol", 1], - "maxzoom" : 4, - "layout" : {}, - "paint" : { - "fill-color" : "@vectorvegsmallscale_10_fill_color", - "fill-opacity" : 0.2 - } - }, { - "id" : "open_space", - "type" : "fill", - "source" : "esri", - "source-layer" : "Open Space", - "minzoom" : 12, - "layout" : {}, - "paint" : { - "fill-color" : "@open_space_fill_color" - } - }, { - "id" : "admin_0_forest;_admin_0_park", - "type" : "fill", - "source" : "esri", - "source-layer" : "Admin 0 Forest; Admin 0 park", - "minzoom" : 5, - "layout" : {}, - "paint" : { - "fill-color" : "@admin_0_forest;_admin_0_park_fill_color" - } - }, { - "id" : "admin1_park", - "type" : "fill", - "source" : "esri", - "source-layer" : "Admin1 Park", - "minzoom" : 9, - "layout" : {}, - "paint" : { - "fill-color" : "@admin1_park_fill_color" - } - }, { - "id" : "zoo", - "type" : "fill", - "source" : "esri", - "source-layer" : "Zoo", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@zoo_fill_color" - } - }, { - "id" : "military_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Military", - "minzoom" : 6, - "layout" : {}, - "paint" : { - "fill-color" : "@military_SL1_fill_color" - } - }, { - "id" : "military_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Military", - "minzoom" : 6, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@military_SL0_line_color", - "line-width" : "@military_SL0_line_width" - } - }, { - "id" : "port_facility_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "port Facility", - "minzoom" :6, - "layout" : {}, - "paint" : { - "fill-color" : "@port_facility_SL1_fill_color" - } - }, { - "id" : "port_facility_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "port Facility", - "minzoom" :6, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@port_facility_SL0_line_color", - "line-width" : "@port_facility_SL0_line_width" - } - }, { - "id" : "transportation_facility_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Transportation Facility", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@transportation_facility_SL1_fill_color" - } - }, { - "id" : "transportation_facility_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Transportation Facility", - "minzoom" : 13, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@transportation_facility_SL0_line_color", - "line-width" : "@transportation_facility_SL0_line_width" - } - }, { - "id" : "industry_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Industry", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@industry_SL1_fill_color" - } - }, { - "id" : "industry_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Industry", - "minzoom" : 13, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@industry_SL0_line_color", - "line-width" : "@industry_SL0_line_width" - } - }, { - "id" : "tribal_government_facility", - "type" : "fill", - "source" : "esri", - "source-layer" : "Tribal Government Facility", - "minzoom" : 8, - "layout" : {}, - "paint" : { - "fill-color" : "@tribal_government_facility_fill_color" - } - }, { - "id" : "golf_course_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Golf Course", - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@golf_course_SL1_fill_color" - } - }, { - "id" : "golf_course_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Golf Course", - "minzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@golf_course_SL0_line_color", - "line-width" : "@golf_course_SL0_line_width" - } - }, { - "id" : "airport_airport_property_SL1_SLD0", - "type" : "fill", - "source" : "esri", - "source-layer" : "Airport", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : {}, - "paint" : { - "fill-color" : "@airport_airport_property_SL1_SLD0_fill_color" - } - }, { - "id" : "airport_airport_property_SL0_SLD0", - "type" : "line", - "source" : "esri", - "source-layer" : "Airport", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@airport_airport_property_SL0_SLD0_line_color", - "line-width" : "@airport_airport_property_SL0_SLD0_line_width" - } - }, { - "id" : "airport_airport_runway_SLD1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Airport", - "filter" : ["==", "_symbol", 0], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@airport_airport_runway_SLD1_fill_color" - } - }, { - "id" : "commercial_and_retail", - "type" : "fill", - "source" : "esri", - "source-layer" : "Commercial and Retail", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@commercial_and_retail_fill_color" - } - }, { - "id" : "water_supply_and_treatment_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Supply and Treatment", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@water_supply_and_treatment_SL1_fill_color" - } - }, { - "id" : "water_supply_and_treatment_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Supply and Treatment", - "minzoom" : 13, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_supply_and_treatment_SL0_line_color", - "line-width" : "@water_supply_and_treatment_SL0_line_width" - } - }, { - "id" : "mail_and_shipping", - "type" : "fill", - "source" : "esri", - "source-layer" : "Mail and Shipping", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@mail_and_shipping_fill_color" - } - }, { - "id" : "cemetery", - "type" : "fill", - "source" : "esri", - "source-layer" : "Cemetery", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@cemetery_fill_color" - } - }, { - "id" : "park", - "type" : "fill", - "source" : "esri", - "source-layer" : "Park", - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@park_fill_color" - } - }, { - "id" : "banking_and_finance", - "type" : "fill", - "source" : "esri", - "source-layer" : "Banking and Finance", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@banking_and_finance_fill_color" - } - }, { - "id" : "energy;_government;_information_and_communication", - "type" : "fill", - "source" : "esri", - "source-layer" : "Energy; Government; Information and Communication", - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@energy;_government;_information_and_communication_fill_color" - } - }, { - "id" : "building_general;_emergency_response_and_law_enforcement", - "type" : "fill", - "source" : "esri", - "source-layer" : "Building General; Emergency Response and Law Enforcement", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@building_general;_emergency_response_and_law_enforcement_fill_color" - } - }, { - "id" : "public_attraction_and_landmark", - "type" : "fill", - "source" : "esri", - "source-layer" : "Public Attraction and Landmark", - "minzoom" : 13, - "layout" : {}, - "paint" : { - "fill-color" : "@public_attraction_and_landmark_fill_color" - } - }, { - "id" : "education", - "type" : "fill", - "source" : "esri", - "source-layer" : "Education", - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@education_fill_color" - } - }, { - "id" : "health_and_medical_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Health and Medical", - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@health_and_medical_SL1_fill_color" - } - }, { - "id" : "health_and_medical_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Health and Medical", - "minzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@health_and_medical_SL0_line_color", - "line-width" : "@health_and_medical_SL0_line_width" - } - }, { - "id" : "water_body_577k_-_2m_lake_or_pond;_stream_or_river", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Body_577k - 2m", - "filter" : ["==", "_symbol", 0], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@water_body_577k_-_2m_lake_or_pond;_stream_or_river_fill_color" - } - }, { - "id" : "water_body_577k_-_2m_lake_or_pond-intermittent", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Body_577k - 2m", - "filter" : ["==", "_symbol", 1], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : {}, - "paint" : { - "fill-image" : "water_body_577k_-_2m_lake_or_pond-intermittent" - } - }, { - "id" : "water_body_4m_-_9m_lake_or_pond;_stream_or_river", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Body_4m - 9m", - "filter" : ["==", "_symbol", 0], - "minzoom" : 5, - "maxzoom" : 7, - "layout" : {}, - "paint" : { - "fill-color" : "@water_body_4m_-_9m_lake_or_pond;_stream_or_river_fill_color" - } - }, { - "id" : "water_body_4m_-_9m_lake_or_pond-intermittent", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Body_4m - 9m", - "filter" : ["==", "_symbol", 1], - "minzoom" : 5, - "maxzoom" : 7, - "layout" : {}, - "paint" : { - "fill-image" : "water_body_4m_-_9m_lake_or_pond-intermittent" - } - }, { - "id" : "water_body_18m_-_147m_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Water Body_18m - 147m", - "minzoom" : 1, - "maxzoom" : 5, - "layout" : {}, - "paint" : { - "fill-color" : "@water_body_18m_-_147m_SL1_fill_color" - } - }, { - "id" : "water_body_18m_-_147m_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Body_18m - 147m", - "minzoom" : 1, - "maxzoom" : 5, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_body_18m_-_147m_SL0_line_color", - "line-width" : "@water_body_18m_-_147m_SL0_line_width" - } - }, { - "id" : "waterbody_inundated_area_SLD0", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 4], - "minzoom" : 12, - "layout" : {}, - "paint" : { - "fill-color" : "@waterbody_inundated_area_SLD0_fill_color" - } - }, { - "id" : "waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-color" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL1_SLD3_fill_color" - } - }, { - "id" : "waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3", - "type" : "line", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_color", - "line-width" : "@waterbody_canal_or_ditch;_estuary;_lake_or_pond;_reservoir;_stream_or_river;_bay_or_inlet_SL0_SLD3_line_width" - } - }, { - "id" : "waterbody_playa_SLD4", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 1], - "minzoom" : 12, - "layout" : {}, - "paint" : { - "fill-image" : "waterbody_playa" - } - }, { - "id" : "waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash_SLD4", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 5], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-image" : "waterbody_lake_or_pond-intermittent;_stream_or_river-intermittent;_reservoir-intermittent;_wash", - "fill-opacity" : 0.35 - } - }, { - "id" : "waterbody_ice_mass_SLD6", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 2], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-image" : "waterbody_ice_mass", - "fill-opacity" : 0.4 - } - }, { - "id" : "waterbody_swamp_or_marsh_SLD6", - "type" : "fill", - "source" : "esri", - "source-layer" : "Waterbody", - "filter" : ["==", "_symbol", 3], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "fill-image" : "waterbody_swamp_or_marsh", - "fill-opacity" : 0.5 - } - }, { - "id" : "water_flowline_577k_-_2m_stream_or_river", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m", - "filter" : ["==", "_symbol", 0], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_577k_-_2m_stream_or_river_line_color", - "line-width" : "@water_flowline_577k_-_2m_stream_or_river_line_width" - } - }, { - "id" : "water_flowline_577k_-_2m_stream_or_river-intermittent", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m", - "filter" : ["==", "_symbol", 1], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_color", - "line-width" : "@water_flowline_577k_-_2m_stream_or_river-intermittent_line_width" - } - }, { - "id" : "water_flowline_577k_-_2m_canal_or_ditch_SL1", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m", - "filter" : ["==", "_symbol", 2], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_color", - "line-width" : "@water_flowline_577k_-_2m_canal_or_ditch_SL1_line_width" - } - }, { - "id" : "water_flowline_577k_-_2m_canal_or_ditch_SL0", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m", - "filter" : ["==", "_symbol", 2], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "symbol-placement" : "line", - "symbol-avoid-edges" : true, - "icon-image" : "@water_flowline_577k_-_2m_canal_or_ditch_SL0_icon_image", - "icon-allow-overlap" : true, - "icon-padding" : 1 - }, - "paint" : {} - - }, { - "id" : "water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m", - "filter" : ["==", "_symbol", 3], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_color", - "line-width" : "@water_flowline_577k_-_2m_artificial_path;_connector;_dam_or_weir;_levee;_waterfall_line_width" - } - }, { - "id" : "water_flowline_4m_-_9m", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_4m - 9m", - "minzoom" : 5, - "maxzoom" : 7, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_4m_-_9m_line_color", - "line-width" : "@water_flowline_4m_-_9m_line_width" - } - }, { - "id" : "water_flowline_18m_-_147m", - "type" : "line", - "source" : "esri", - "source-layer" : "Water Flowline_18m - 147m", - "minzoom" : 4, - "maxzoom" : 5, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@water_flowline_18m_-_147m_line_color", - "line-width" : "@water_flowline_18m_-_147m_line_width" - } - }, { - "id" : "waterline_canal_or_ditch_SL1", - "type" : "line", - "source" : "esri", - "source-layer" : "Waterline", - "filter" : ["==", "_symbol", 0], - "minzoom" : 11, - "layout" : { - "line-cap" : "round" - }, - "paint" : { - "line-color" : "@waterline_canal_or_ditch_SL1_line_color", - "line-width" : "@waterline_canal_or_ditch_SL1_line_width" - } - }, { - "id" : "waterline_canal_or_ditch_SL0", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterline", - "filter" : ["==", "_symbol", 0], - "minzoom" : 11, - "layout" : { - "symbol-placement" : "line", - "symbol-avoid-edges" : true, - "icon-image" : "@waterline_canal_or_ditch_SL0_icon_image", - "icon-allow-overlap" : true, - "icon-padding" : 1 - }, - "paint" : {} - - }, { - "id" : "waterline_stream_or_river-intermittent", - "type" : "line", - "source" : "esri", - "source-layer" : "Waterline", - "filter" : ["==", "_symbol", 1], - "minzoom" : 11, - "layout" : {}, - "paint" : { - "line-color" : "@waterline_stream_or_river-intermittent_line_color", - "line-width" : "@waterline_stream_or_river-intermittent_line_width", - "line-dasharray" : "@waterline_stream_or_river-intermittent_line_dasharray" - } - }, { - "id" : "waterline_stream_or_river;_artificial_path;_connector", - "type" : "line", - "source" : "esri", - "source-layer" : "Waterline", - "filter" : ["==", "_symbol", 2], - "minzoom" : 11, - "layout" : { - "line-cap" : "round" - }, - "paint" : { - "line-color" : "@waterline_stream_or_river;_artificial_path;_connector_line_color", - "line-width" : "@waterline_stream_or_river;_artificial_path;_connector_line_width" - } - }, { - "id" : "landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0", - "type" : "fill", - "source" : "esri", - "source-layer" : "Landscape", - "filter" : ["==", "_symbol", 1], - "minzoom" : 14, - "layout" : {}, - "paint" : { - "fill-color" : "@landscape_ipc_forest;_ipc_garden_path-conflicted;_ipc_green_urban_area;_ivy___groundcover;_planter_SLD0_fill_color" - } - }, { - "id" : "landscape_grass_SLD1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Landscape", - "filter" : ["==", "_symbol", 2], - "minzoom" : 14, - "layout" : {}, - "paint" : { - "fill-color" : "@landscape_grass_SLD1_fill_color" - } - }, { - "id" : "landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2", - "type" : "fill", - "source" : "esri", - "source-layer" : "Landscape", - "filter" : ["==", "_symbol", 0], - "minzoom" : 14, - "layout" : {}, - "paint" : { - "fill-color" : "@landscape_dirt;_gravel;_mulch;_rock;_sand_SLD2_fill_color" - } - }, { - "id" : "landscape_pool___fountain_SLD3", - "type" : "fill", - "source" : "esri", - "source-layer" : "Landscape", - "filter" : ["==", "_symbol", 3], - "minzoom" : 14, - "layout" : {}, - "paint" : { - "fill-color" : "@landscape_pool___fountain_SLD3_fill_color" - } - }, { - "id" : "sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 3], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_football_field;_soccer_field;_sports_turf;_tennis_court_exterior;_tennis_court_interior;_track_-_grass_SLD0_fill_color" - } - }, { - "id" : "sports_baseball_field;_softball_field_SL1_SLD1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 4], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_baseball_field;_softball_field_SL1_SLD1_fill_color" - } - }, { - "id" : "sports_baseball_field;_softball_field_SL0_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 4], - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@sports_baseball_field;_softball_field_SL0_SLD1_line_color", - "line-width" : "@sports_baseball_field;_softball_field_SL0_SLD1_line_width" - } - }, { - "id" : "sports_golf_fairway_SLD2", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 2], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_golf_fairway_SLD2_fill_color" - } - }, { - "id" : "sports_golf_sand_trap_SLD3", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 0], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_golf_sand_trap_SLD3_fill_color" - } - }, { - "id" : "sports_golf_putting_green___teeing_ground_SL1_SLD4", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 1], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_golf_putting_green___teeing_ground_SL1_SLD4_fill_color" - } - }, { - "id" : "sports_golf_putting_green___teeing_ground_SL0_SLD4", - "type" : "line", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 1], - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_color", - "line-width" : "@sports_golf_putting_green___teeing_ground_SL0_SLD4_line_width" - } - }, { - "id" : "sports_golf_water_hazard_SLD5", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 5], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_golf_water_hazard_SLD5_fill_color" - } - }, { - "id" : "sports_athletic_track;_track_-_clay_or_dirt_SLD6", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 7], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_athletic_track;_track_-_clay_or_dirt_SLD6_fill_color" - } - }, { - "id" : "sports_hardcourt_SL1_SLD7", - "type" : "fill", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 6], - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@sports_hardcourt_SL1_SLD7_fill_color" - } - }, { - "id" : "sports_hardcourt_SL0_SLD7", - "type" : "line", - "source" : "esri", - "source-layer" : "Sports", - "filter" : ["==", "_symbol", 6], - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@sports_hardcourt_SL0_SLD7_line_color", - "line-width" : "@sports_hardcourt_SL0_SLD7_line_width" - } - }, { - "id" : "pavement_parking_lot;_parking_lot_other_SLD0", - "type" : "fill", - "source" : "esri", - "source-layer" : "Pavement", - "filter" : ["==", "_symbol", 2], - "minzoom" : 17, - "layout" : {}, - "paint" : { - "fill-color" : "@pavement_parking_lot;_parking_lot_other_SLD0_fill_color" - } - }, { - "id" : "pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Pavement", - "filter" : ["==", "_symbol", 0], - "minzoom" : 17, - "layout" : {}, - "paint" : { - "fill-color" : "@pavement_bike_path;_curb;_sidewalk;_street;_walking_path;_dock___pier;_ipc_paved_area_SLD1_fill_color" - } - }, { - "id" : "pavement_ipc_garden_path_SL1_SLD2", - "type" : "fill", - "source" : "esri", - "source-layer" : "Pavement", - "filter" : ["==", "_symbol", 1], - "minzoom" : 17, - "layout" : {}, - "paint" : { - "fill-color" : "@pavement_ipc_garden_path_SL1_SLD2_fill_color" - } - }, { - "id" : "pavement_ipc_garden_path_SL0_SLD2", - "type" : "line", - "source" : "esri", - "source-layer" : "Pavement", - "filter" : ["==", "_symbol", 1], - "minzoom" : 17, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@pavement_ipc_garden_path_SL0_SLD2_line_color", - "line-width" : "@pavement_ipc_garden_path_SL0_SLD2_line_width" - } - }, { - "id" : "special_area_of_interest_line", - "type" : "line", - "source" : "esri", - "source-layer" : "Special Area of Interest Line", - "minzoom" : 17, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@special_area_of_interest_line_line_color", - "line-width" : "@special_area_of_interest_line_line_width" - } - }, { - "id" : "building_footprint_SL1_1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Building Footprint", - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@building_footprint_SL1_1_fill_color", - "fill-translate" : [1,1] - } - }, - { - "id" : "building_footprint_SL1", - "type" : "fill", - "source" : "esri", - "source-layer" : "Building Footprint", - "minzoom" : 15, - "layout" : {}, - "paint" : { - "fill-color" : "@building_footprint_SL1_fill_color" - } - }, { - "id" : "building_footprint_SL0", - "type" : "line", - "source" : "esri", - "source-layer" : "Building Footprint", - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@building_footprint_SL0_line_color", - "line-width" : "@building_footprint_SL0_line_width" - } - }, { - "id" : "ferry_inland_water_ferry;_ocean_ferry", - "type" : "line", - "source" : "esri", - "source-layer" : "Ferry", - "filter" : ["==", "_symbol", 0], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@ferry_inland_water_ferry;_ocean_ferry_line_color", - "line-width" : "@ferry_inland_water_ferry;_ocean_ferry_line_width", - "line-dasharray" : "@ferry_inland_water_ferry;_ocean_ferry_line_dasharray" - } - }, { - "id" : "ferry_rail_ferry_SL2", - "type" : "line", - "source" : "esri", - "source-layer" : "Ferry", - "filter" : ["==", "_symbol", 1], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@ferry_rail_ferry_SL2_line_color", - "line-width" : "@ferry_rail_ferry_SL2_line_width" - } - }, { - "id" : "railroad_SL2", - "type" : "line", - "source" : "esri", - "source-layer" : "Railroad", - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@railroad_SL2_line_color", - "line-width" : "@railroad_SL2_line_width" - } - }, { - "id" : "railroad_SL1", - "type" : "line", - "source" : "esri", - "source-layer" : "Railroad", - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@railroad_SL1_line_color", - "line-width" : "@railroad_SL1_line_width" - } - }, { - "id" : "railroad_SL0", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Railroad", - "minzoom" : 11, - "layout" : { - "symbol-placement" : "line", - "symbol-avoid-edges" : true, - "icon-image" : "@railroad_SL0_icon_image", - "icon-allow-overlap" : true, - "icon-padding" : 1 - }, - "paint" : {} - - }, { - "id" : "ferry_rail_ferry_SL1", - "type" : "line", - "source" : "esri", - "source-layer" : "Ferry", - "filter" : ["==", "_symbol", 1], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@ferry_rail_ferry_SL1_line_color", - "line-width" : "@ferry_rail_ferry_SL1_line_width" - } - }, { - "id" : "ferry_rail_ferry_SL0", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Ferry", - "filter" : ["==", "_symbol", 1], - "minzoom" : 11, - "layout" : { - "symbol-placement" : "line", - "symbol-avoid-edges" : true, - "icon-image" : "@ferry_rail_ferry_SL0_icon_image", - "icon-allow-overlap" : true, - "icon-padding" : 1 - }, - "paint" : {} - - }, { - "id" : "road_centerlines_4wd;_recreation_SL1_SLD0", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 9], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_4wd;_recreation_SL1_SLD0_line_color", - "line-width" : "@road_centerlines_4wd;_recreation_SL1_SLD0_line_width" - } - }, { - "id" : "road_centerlines_local_road_SL1_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_local_road_SL1_SLD1_line_color", - "line-width" : "@road_centerlines_local_road_SL1_SLD1_line_width" - } - }, { - "id" : "road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 7], - "minzoom" : 14, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color", - "line-width" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width" - } - }, { - "id" : "road_centerlines_pedestrian_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 8], - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_pedestrian_SLD1_line_color", - "line-width" : "@road_centerlines_pedestrian_SLD1_line_width" - } - }, { - "id" : "road_centerlines_4wd;_recreation_SL0_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 9], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_4wd;_recreation_SL0_SLD1_line_color", - "line-width" : "@road_centerlines_4wd;_recreation_SL0_SLD1_line_width" - } - }, { - "id" : "road_centerlines_local_road_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_local_road_SL0_SLD5_line_color", - "line-width" : "@road_centerlines_local_road_SL0_SLD5_line_width" - } - }, { - "id" : "road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 7], - "minzoom" : 14, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color", - "line-width" : "@road_centerlines_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width" - } - }, { - "id" : "road_centerlines_minor_arterial_SL1_SLD7", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 4], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_minor_arterial_SL1_SLD7_line_color", - "line-width" : "@road_centerlines_minor_arterial_SL1_SLD7_line_width" - } - }, { - "id" : "road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 5], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color", - "line-width" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width" - } - }, { - "id" : "road_centerlines_minor_arterial_SL0_SLD9", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 4], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_minor_arterial_SL0_SLD9_line_color", - "line-width" : "@road_centerlines_minor_arterial_SL0_SLD9_line_width" - } - }, { - "id" : "road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 5], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color", - "line-width" : "@road_centerlines_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width" - } - }, { - "id" : "road_centerlines_major_arterial_SL1_SLD11", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 2], - "minzoom" : 8, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_major_arterial_SL1_SLD11_line_color", - "line-width" : "@road_centerlines_major_arterial_SL1_SLD11_line_width" - } - }, { - "id" : "road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 3], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color", - "line-width" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width" - } - }, { - "id" : "road_centerlines_major_arterial_SL0_SLD13", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 2], - "minzoom" : 8, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_major_arterial_SL0_SLD13_line_color", - "line-width" : "@road_centerlines_major_arterial_SL0_SLD13_line_width" - } - }, { - "id" : "road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 3], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color", - "line-width" : "@road_centerlines_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width" - } - }, { - "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_color", - "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_1_line_width", - "line-translate" : [0.5,0.5] - } - }, { - "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_color", - "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL1_SLD15_line_width" - } - }, { - "id" : "road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color", - "line-width" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width" - } - }, { - "id" : "road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_color", - "line-width" : "@road_centerlines_freeway_motorway;_highway_major_road_SL0_SLD17_line_width" - } - }, { - "id" : "road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color", - "line-width" : "@road_centerlines_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width" - } - }, { - "id" : "road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 9], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_color", - "line-width" : "@road_centerlines_(tunnels)_4wd;_recreation_SL1_SLD0_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_local_road_SL1_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_color", - "line-width" : "@road_centerlines_(tunnels)_local_road_SL1_SLD1_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 7], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_color", - "line-width" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL1_SLD1_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_pedestrian_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 8], - "minzoom" : 15, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_pedestrian_SLD1_line_color", - "line-width" : "@road_centerlines_(tunnels)_pedestrian_SLD1_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 9], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_color", - "line-width" : "@road_centerlines_(tunnels)_4wd;_recreation_SL0_SLD1_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_local_road_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 6], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_color", - "line-width" : "@road_centerlines_(tunnels)_local_road_SL0_SLD5_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 7], - "minzoom" : 11, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_color", - "line-width" : "@road_centerlines_(tunnels)_service_road;_local_road_traffic_circle;_local_road_ramp;_collector;_resource_SL0_SLD5_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_minor_arterial_SL1_SLD7", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 4], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_color", - "line-width" : "@road_centerlines_(tunnels)_minor_arterial_SL1_SLD7_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 5], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_color", - "line-width" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL1_SLD7_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_minor_arterial_SL0_SLD9", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 4], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_color", - "line-width" : "@road_centerlines_(tunnels)_minor_arterial_SL0_SLD9_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 5], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_color", - "line-width" : "@road_centerlines_(tunnels)_minor_arterial_ramp;_minor_arterial_traffic_circle_SL0_SLD9_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_major_arterial_SL1_SLD11", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 2], - "minzoom" : 8, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_color", - "line-width" : "@road_centerlines_(tunnels)_major_arterial_SL1_SLD11_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 3], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_color", - "line-width" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL1_SLD11_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_major_arterial_SL0_SLD13", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 2], - "minzoom" : 8, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_color", - "line-width" : "@road_centerlines_(tunnels)_major_arterial_SL0_SLD13_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 3], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_color", - "line-width" : "@road_centerlines_(tunnels)_major_arterial_traffic_circle;_major_arterial_ramp_SL0_SLD13_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_color", - "line-width" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL1_SLD15_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_color", - "line-width" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL1_SLD15_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 0], - "minzoom" : 4, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_color", - "line-width" : "@road_centerlines_(tunnels)_freeway_motorway;_highway_major_road_SL0_SLD17_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17", - "type" : "line", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)", - "filter" : ["==", "_symbol", 1], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_color", - "line-width" : "@road_centerlines_(tunnels)_freeway_motorway_ramp;_highway_major_road_ramp;_freeway_motorway_traffic_circle;_highway_major_road_traffic_circle_SL0_SLD17_line_width", - "line-opacity" : 0.3 - } - }, { - "id" : "boundaries_admin0_SL1_SLD2_1", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 0], - "minzoom" : 1, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin0_SL1_SLD2_1_line_color", - "line-width" : "@boundaries_admin0_SL1_SLD2_1_line_width", - "line-translate" : [0.5,0.5] - } - }, { - "id" : "boundaries_admin0_SL1_SLD2", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 0], - "minzoom" : 1, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin0_SL1_SLD2_line_color", - "line-width" : "@boundaries_admin0_SL1_SLD2_line_width" - } - }, { - "id" : "boundaries_admin1_SL1_SLD2", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 1], - "minzoom" : 4, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin1_SL1_SLD2_line_color", - "line-width" : "@boundaries_admin1_SL1_SLD2_line_width" - } - }, { - "id" : "boundaries_admin2_SL1_SLD2", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 2], - "minzoom" : 9, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin2_SL1_SLD2_line_color", - "line-width" : "@boundaries_admin2_SL1_SLD2_line_width" - } - }, { - "id" : "boundaries_admin0_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 0], - "minzoom" : 1, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin0_SL0_SLD5_line_color", - "line-width" : "@boundaries_admin0_SL0_SLD5_line_width" - } - }, { - "id" : "boundaries_admin1_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 1], - "minzoom" : 4, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin1_SL0_SLD5_line_color", - "line-width" : "@boundaries_admin1_SL0_SLD5_line_width" - } - }, { - "id" : "boundaries_admin2_SL0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 2], - "minzoom" : 9, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin2_SL0_SLD5_line_color", - "line-width" : "@boundaries_admin2_SL0_SLD5_line_width", - "line-dasharray" : "@boundaries_admin2_SL0_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_admin3_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 3], - "minzoom" : 16, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin3_SLD5_line_color", - "line-width" : "@boundaries_admin3_SLD5_line_width", - "line-dasharray" : "@boundaries_admin3_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_admin4_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 4], - "minzoom" : 16, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin4_SLD5_line_color", - "line-width" : "@boundaries_admin4_SLD5_line_width", - "line-dasharray" : "@boundaries_admin4_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_admin5_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 5], - "minzoom" : 16, - "layout" : { - "line-cap" : "round", - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_admin5_SLD5_line_color", - "line-width" : "@boundaries_admin5_SLD5_line_width", - "line-dasharray" : "@boundaries_admin5_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin0_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 8], - "minzoom" : 1, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin0_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin0_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin0_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin1_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 9], - "minzoom" : 4, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin1_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin1_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin1_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin2_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 10], - "minzoom" : 10, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin2_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin2_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin2_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin3_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 11], - "minzoom" : 16, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin3_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin3_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin3_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin4_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 12], - "minzoom" : 16, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin4_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin4_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin4_SLD5_line_dasharray" - } - }, { - "id" : "boundaries_disputed_admin5_SLD5", - "type" : "line", - "source" : "esri", - "source-layer" : "Boundaries", - "filter" : ["==", "_symbol", 13], - "minzoom" : 16, - "layout" : { - "line-join" : "round" - }, - "paint" : { - "line-color" : "@boundaries_disputed_admin5_SLD5_line_color", - "line-width" : "@boundaries_disputed_admin5_SLD5_line_width", - "line-dasharray" : "@boundaries_disputed_admin5_SLD5_line_dasharray" - } - }, { - "id" : "nation_boundary_label_labelsize_=_1", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 14.8, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.2 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 14.8, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "nation_boundary_label_labelsize_=_2", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 13.5, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.2 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 13.5, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "nation_boundary_label_labelsize_=_3", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.2 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 12, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "nation_boundary_label_labelsize_=_4", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.2 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 12, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "nation_boundary_label_labelsize_=_5", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.15 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 12, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "nation_boundary_label_labelsize_=_6", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Nation Boundary_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 3, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-transform" : "uppercase", - "text-letter-spacing" : 0.15 - }, - "paint" : { - "text-color" : "#9d94af", - "text-size" : 12, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - },{ - "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 0], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#2d2a2b", - "text-size" : 12, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin1_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 1], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin1_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#2d2a2b", - "text-size" : 12, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_1,000,000_and_up,_admin2_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 2], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_admin2_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#2d2a2b", - "text-size" : 12, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 3], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_1,000,000_and_up,_non-capital_populated_place_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#2d2a2b", - "text-size" : 12, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 4], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4d4d4f", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 5], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_admin1_capital;_300,000_to_999,999,_admin2_capital;_300,000_to_999,999,_territory___protectorate_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4d4d4f", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 6], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_300,000_to_999,999,_non-capital_populated_place_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Bold", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4d4d4f", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 7], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#58595b", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_100,000_to_299,999,_admin1_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 8], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_admin1_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#58595b", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 9], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_100,000_to_299,999,_non-capital_populated_place_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#58595b", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 10], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 11], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_admin1_capital;_30,000_to_99,999,_territory___protectorate_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 12], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_30,000_to_99,999,_non-capital_populated_place_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-justify" : "left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 13], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 14], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_admin1_capital;_10,000_to_29,999,_territory___protectorate_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 15], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_10,000_to_29,999,_non-capital_populated_place;_10,000_to_29,999,_non-capital_hamlet_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 16], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_2,500_to_9,999,_admin0_(nation)_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 17], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_2,500_to_9,999,_non-capital_populated_place;_2,500_to_9,999,_non-capital_hamlet;_1_to_2,499,_non-capital_populated_place;_1_to_2,499,_non-capital_hamlet;_0,_non-capital_populated_place;_0,_non-capital_hamlet_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (small scale)", - "filter" : ["==", "_symbol", 18], - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(small_scale)_0,_admin1_capital;_0,_territory___protectorate_capital_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left", - "text-offset" : [0.15,0] - }, - "paint" : { - "text-color" : "#4E4E4E", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_1,000,000_and_up", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 0], - "minzoom" : 10, - "maxzoom" : 15, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 14.5, - "text-max-width" : 4, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.17, - "text-line-height" : 0.9, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#968da5", - "text-size" : 14.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_300,000_to_999,999", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 1], - "minzoom" : 10, - "maxzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 14.5, - "text-max-width" : 4, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.17, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#968da5", - "text-size" : 14.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_100,000_to_299,999", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 2], - "minzoom" : 10, - "maxzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.2, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#aaa0bc", - "text-size" : 12, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_30,000_to_99,999", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 3], - "minzoom" : 10, - "maxzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 11.5, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.12, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#aaa0bc", - "text-size" : 11.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_10,000_to_29,999", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 4], - "minzoom" : 10, - "maxzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 11.5, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.12, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#aaa0bc", - "text-size" : 11.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)_0_to_9,999", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "filter" : ["==", "_label_class", 5], - "minzoom" : 14, - "maxzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-anchor" : "top", - "text-max-size" : 14, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 5, - "text-justify" : "center", - "text-transform" : "uppercase", - "text-letter-spacing" : 0.12, - "text-offset" : [0,1] - }, - "paint" : { - "text-color" : "#aaa0bc", - "text-size" : 11.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "points_of_interest_bus_station", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Points of Interest", - "filter" : ["==", "_symbol", 2], - "minzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@points_of_interest_bus_station_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "left" - }, - "paint" : { - "text-color" : "#595959", - "text-size" : 10.0, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "points_of_interest_rail_station", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Points of Interest", - "filter" : ["==", "_symbol", 3], - "minzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@points_of_interest_rail_station_icon_image", - "icon-padding" : 1, - "text-font" : "@Arial Regular", - "text-anchor" : "top", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-justify" : "center", - "text-offset" : [0,1.2] - }, - "paint" : { - "text-color" : "#595959", - "text-size" : 10.0, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "populated_places_(large_scale)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Populated Places (large scale)", - "minzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "icon-image" : "@populated_places_(large_scale)_icon_image", - "icon-padding" : 1 - }, - "paint" : {} - }, { - "id" : "admin1_boundary_label_labelsize_=_1", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 15, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.10 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 15, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_boundary_label_labelsize_=_2", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 13.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.10 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 13.6667, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_boundary_label_labelsize_=_3", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 12.3333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.10 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 12.3333, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_boundary_label_labelsize_=_4", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 12, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.1 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 12, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_boundary_label_labelsize_=_5", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 11, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.1 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 11, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_boundary_label_labelsize_=_6", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Boundary_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 5, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 11, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-letter-spacing" : 0.1 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 11, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 1.0, - "text-halo-blur" : 1.0 - } - },{ - "id" : "admin2_boundary_label_labelsize_=_1,2,3", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin2 Boundary_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 9, - "maxzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 11.3333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 11.3333, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 0.933333 - } - }, { - "id" : "admin2_boundary_label_labelsize_=_4,5,6", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin2 Boundary_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 9, - "maxzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#928aa3", - "text-size" : 10, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 0.933333 - } - },{ - "id" : "airport_label_airport_property", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Airport_label", - "minzoom" : 9, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "education_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Education_label", - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "health_and_medical_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Health and Medical_label", - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin1_park_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin1 Park_label", - "minzoom" : 9, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#418841", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "admin_0_forest;_admin_0_park_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Admin 0 Forest; Admin 0 park_label", - "minzoom" : 5, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 10 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "public_attraction_and_landmark_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Public Attraction and Landmark_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "cemetery_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Cemetery_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "golf_course_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Golf Course_label", - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "zoo_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Zoo_label", - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "park_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Park_label", - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "building_general;_emergency_response_and_law_enforcement_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Building General; Emergency Response and Law Enforcement_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-padding" : 2 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "open_space_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Open Space_label", - "minzoom" : 12, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "transportation_facility_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Transportation Facility_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "port_facility_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "port Facility_label", - "minzoom" :6, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "military_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Military_label", - "minzoom" : 6, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "industry_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Industry_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "tribal_government_facility_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Tribal Government Facility_label", - "minzoom" : 8, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "mail_and_shipping_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Mail and Shipping_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "energy;_government;_information_and_communication_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Energy; Government; Information and Communication_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "commercial_and_retail_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Commercial and Retail_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_supply_and_treatment_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Supply and Treatment_label", - "minzoom" : 13, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "park_in_water_(label_only)_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Park In Water (label only)_label", - "minzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#6699CD", - "text-size" : 10 - } - }, { - "id" : "beach_(label_only)_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Beach (label only)_label", - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#908d89", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_body_577k_-_2m_label_lake_or_pond;lake_or_pond-intermittent", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Body_577k - 2m_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.33333, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 9.33333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_body_577k_-_2m_label_stream_or_river", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Body_577k - 2m_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_body_4m_-_9m_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Body_4m - 9m_label", - "minzoom" : 5, - "maxzoom" : 7, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - },{ - "id" : "water_body_18m_-_147m_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Body_18m - 147m_label", - "minzoom" : 1, - "maxzoom" : 5, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 4, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_small_island_(label_only)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#8C7962", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_bay_or_inlet;_estuary", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_canal_or_ditch", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_(large)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 11.3333, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 11.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_(large)_stream_or_river;_stream_or_river-intermittent;_wash", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 11.3333, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 11.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_large_island_(label_only)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#8C7962", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_(small)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 6], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_sea_label_(small)_stream_or_river;_stream_or_river-intermittent;_wash", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_Sea_label", - "filter" : ["==", "_label_class", 7], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - },{ - "id" : "waterbody_label_small_island_(label_only)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#8C7962", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_bay_or_inlet;_estuary", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_canal_or_ditch", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_(large)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 11.3333, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 11.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_(large)_stream_or_river;_stream_or_river-intermittent;_wash", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 11.3333, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 11.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_large_island_(label_only)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#8C7962", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_(small)_lake_or_pond;_lake_or_pond-intermittent;_reservoir;_reservoir-intermittent;_ice_mass;_swamp_or_marsh", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 6], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterbody_label_(small)_stream_or_river;_stream_or_river-intermittent;_wash", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterbody_label", - "filter" : ["==", "_label_class", 7], - "minzoom" : 11, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 5, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_flowline_577k_-_2m_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Flowline_577k - 2m_label", - "minzoom" : 7, - "maxzoom" : 11, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1, - "text-offset" : [0,-0.6] - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 9.33333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_flowline_4m_-_9m_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Flowline_4m - 9m_label", - "minzoom" : 5, - "maxzoom" : 7, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1, - "text-offset" : [0,-0.6] - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 9.33333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "water_flowline_18m_-_147m_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Water Flowline_18m - 147m_label", - "minzoom" : 4, - "maxzoom" : 5, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1, - "text-offset" : [0,-0.6] - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 9.33333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "waterline_label_canal_or_ditch", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Waterline_label", - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1, - "text-offset" : [0,-0.6] - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "building_footprint_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Building Footprint_label", - "minzoom" : 15, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "trails_and_paths_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Trails and Paths_label", - "minzoom" : 15, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#666666", - "text-size" : 9.33333, - "text-halo-color" : "#FDFDFD", - "text-halo-width" : 0.933333 - } - }, { - "id" : "ferry_label_ferries", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Ferry_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#6091c3", - "text-size" : 10.0, - "text-halo-color" : "#BFD9F2", - "text-halo-width" : 0.933333 - } - }, { - "id" : "ferry_label_rail_ferries", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Ferry_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 9.5, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#9d9d9d", - "text-size" : 9.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.933333 - } - }, { - "id" : "exits_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Exits", - "minzoom" : 15, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-anchor" : "center", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "exits_default_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_freeway_motorway;_highway_major_road", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#787878", - "text-size" : 10.6667, - "text-halo-color" : "#FFEC80", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_freeway_motorway;_highway_major_road_(alt_name)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#787878", - "text-size" : 10.5, - "text-halo-color" : "#FFEC80", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_major_arterial", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#878787", - "text-size" : 10.5, - "text-halo-color" : "#FFEBC4", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_major_arterial_(alt_name)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#878787", - "text-size" : 10.5, - "text-halo-color" : "#FFEBC4", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_minor_arterial", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#6d6d6d", - "text-size" : 10.0, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1 - } - }, { - "id" : "road_centerlines_label_local_road;_service_road;_4wd;_collector;_recreation;_resource", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#909090", - "text-size" : 9.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_pedestrian", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 6], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#909090", - "text-size" : 9.0, - "text-halo-color" : "#FDFDFD", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_label_primary_hwy_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 7], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_primary_hwy_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_primary_hwy_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 8], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_primary_hwy_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_primary_hwy_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 9], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_primary_hwy_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_primary_hwy_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 10], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_primary_hwy_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 11], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 12], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 13], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 14], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 15], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_secondary_hwy_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 16], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_secondary_hwy_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_u-shaped_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 17], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 18], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_white_green", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 19], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_white_green", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_u-shaped_white_green_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 20], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_white_green_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_u-shaped_green_leaf", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 21], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_green_leaf", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667, - "text-halo-blur" : 1.0 - } - }, { - "id" : "road_centerlines_label_u-shaped_green_leaf_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 22], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_green_leaf_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667, - "text-halo-blur" : 1.0 - } - }, { - "id" : "road_centerlines_label_u-shaped_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 23], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_yellow_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 24], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_yellow_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 25], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 26], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 27], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_u-shaped_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 28], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_u-shaped_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_v-shaped_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 29], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_v-shaped_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_v-shaped_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 30], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_v-shaped_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_stacked_rectangle_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 31], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_stacked_rectangle_white_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_stacked_rectangle_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 32], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_stacked_rectangle_white_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_rectangle_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 33], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_white_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 34], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_white_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 35], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_blue_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_rectangle_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 36], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_blue_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_rectangle_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 37], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_red_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 38], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_red_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 39], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_yellow_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 40], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_yellow_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 41], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_green_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 42], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_green_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_green_yellow", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 43], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_green_yellow_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_green_yellow_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 44], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_green_yellow_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.2], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_inverse_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 45], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_inverse_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_pentagon_inverse_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 46], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_inverse_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_pentagon_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 47], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 48], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 49], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_pentagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 50], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_pentagon_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 51], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_yellow_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 52], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_yellow_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 53], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 54], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_pentagon_green_yellow", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 55], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_green_yellow", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_pentagon_green_yellow_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 56], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_pentagon_green_yellow_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_label_hexagon_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 57], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 58], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 59], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 60], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 61], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 62], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 63], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 64], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_orange_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 65], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_orange_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_hexagon_orange_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 66], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_hexagon_orange_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 67], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#5B708F", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 68], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#5B708F", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 69], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#B66D58", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 70], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#B66D58", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 71], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#718574", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 72], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#718574", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_brown_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 73], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_brown_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#81695E", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_rectangle_hexagon_brown_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 74], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_rectangle_hexagon_brown_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#81695E", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_octagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 75], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_octagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_label_octagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines_label", - "filter" : ["==", "_label_class", 76], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_octagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.1], - "text-padding" : 50 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_freeway_motorway;_highway_major_road", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#787878", - "text-size" : 10.6667, - "text-halo-color" : "#FFEC80", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_freeway_motorway;_highway_major_road_(alt_name)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#787878", - "text-size" : 10.5, - "text-halo-color" : "#FFEC80", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_major_arterial", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#878787", - "text-size" : 10.5, - "text-halo-color" : "#FFEBC4", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_major_arterial_(alt_name)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Bold", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#878787", - "text-size" : 10.5, - "text-halo-color" : "#FFEBC4", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_minor_arterial", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 10, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#6d6d6d", - "text-size" : 10.0, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 1 - } - }, { - "id" : "road_centerlines_(tunnels)_label_local_road;_service_road;_4wd;_collector;_recreation;_resource", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 5], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#909090", - "text-size" : 9.5, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pedestrian", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 6], - "minzoom" : 12, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 10.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#909090", - "text-size" : 9.0, - "text-halo-color" : "#FDFDFD", - "text-halo-width" : 0.666667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_primary_hwy_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 7], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_primary_hwy_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_primary_hwy_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 8], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_primary_hwy_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_primary_hwy_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 9], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_primary_hwy_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_primary_hwy_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 10], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_primary_hwy_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 11], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 12], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 13], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 14], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 15], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_secondary_hwy_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 16], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_secondary_hwy_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 17], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 18], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_white_green", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 19], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_green", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_white_green_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 20], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_white_green_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_green_leaf", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 21], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_green_leaf", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667, - "text-halo-blur" : 1.0 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_green_leaf_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 22], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_green_leaf_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.666667, - "text-halo-blur" : 1.0 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 23], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_yellow_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 24], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_yellow_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 25], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 26], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 27], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_u-shaped_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 28], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_u-shaped_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_v-shaped_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 29], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_v-shaped_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_v-shaped_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 30], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_v-shaped_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_stacked_rectangle_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 31], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_stacked_rectangle_white_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_stacked_rectangle_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 32], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_stacked_rectangle_white_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#343434", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 33], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_white_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 34], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_white_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 35], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_blue_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 36], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_blue_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 37], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_red_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 38], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_red_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 39], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_yellow_black_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 40], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_yellow_black_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 41], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_green_white_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 42], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_green_white_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_green_yellow", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 43], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_green_yellow_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_green_yellow_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 44], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_green_yellow_(alt)_{_len}", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_inverse_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 45], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_inverse_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_inverse_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 46], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_inverse_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 47], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 48], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 49], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 50], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_yellow_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 51], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_yellow_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_yellow_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 52], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_yellow_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 53], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 54], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_green_yellow", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 55], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_green_yellow", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_pentagon_green_yellow_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 56], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 9.33333, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_pentagon_green_yellow_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFF73", - "text-size" : 9.33333 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_white_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 57], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_white_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_white_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 58], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_white_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 59], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 60], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 61], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 62], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FFFFFF", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 63], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 64], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_orange_black", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 65], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_orange_black", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_hexagon_orange_black_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 66], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_hexagon_orange_black_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#000000", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_blue_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 67], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_blue_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#5B708F", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_blue_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 68], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_blue_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#5B708F", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_red_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 69], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_red_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#B66D58", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_red_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 70], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_red_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#B66D58", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 71], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#718574", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 72], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#718574", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_brown_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 73], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_brown_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#81695E", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_rectangle_hexagon_brown_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 74], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_rectangle_hexagon_brown_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#81695E", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_octagon_green_white", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 75], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_octagon_green_white", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "road_centerlines_(tunnels)_label_octagon_green_white_(alt)", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Road Centerlines (Tunnels)_label", - "filter" : ["==", "_label_class", 76], - "minzoom" : 6, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 125, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-max-size" : 8.66667, - "text-max-width" : 8, - "text-field" : "{_name}", - "icon-image" : "road_centerlines_(tunnels)_octagon_green_white_(alt)", - "icon-rotation-alignment" : "viewport", - "text-rotation-alignment" : "viewport", - "text-offset" : [0, 0.3], - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#FDFDFD", - "text-size" : 8.66667 - } - }, { - "id" : "railroad_label_default", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Railroad_label", - "minzoom" : 14, - "layout" : { - "symbol-placement" : "line", - "symbol-min-distance" : 200, - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#9d9d9d", - "text-size" : 9.5, - "text-halo-color" : "#F6F1E7", - "text-halo-width" : 0.933333 - } - }, { - "id" : "points_of_interest_black_(poi)_label;_ferry_terminal", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Points of Interest", - "filter" : ["==", "_label_class", 0], - "minzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-anchor" : "center", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "points_of_interest_green_(park)_label", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Points of Interest", - "filter" : ["==", "_label_class", 1], - "minzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-anchor" : "center", - "text-max-size" : 10, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#408340", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "points_of_interest_bus_station;_rail_station", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Points of Interest", - "filter" : ["==", "_label_class", 2], - "minzoom" : 16, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Regular", - "text-anchor" : "bottom-left", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1 - }, - "paint" : { - "text-color" : "#545454", - "text-size" : 10, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "marine_waterbodies_label_1", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Marine Waterbodies_label", - "filter" : ["==", "_label_class", 0], - "minzoom" : 2, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 15.3333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-max-width" : 5, - "text-letter-spacing" : 0.3, - "text-line-height" : 1.6 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 15.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "marine_waterbodies_label_2", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Marine Waterbodies_label", - "filter" : ["==", "_label_class", 1], - "minzoom" : 2, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 13.3333, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-max-width" : 5, - "text-letter-spacing" : 0.2, - "text-line-height" : 1.5 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 13.3333, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "marine_waterbodies_label_3", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Marine Waterbodies_label", - "filter" : ["==", "_label_class", 2], - "minzoom" : 2, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 12.0, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-max-width" : 5, - "text-letter-spacing" : 0.2, - "text-line-height" : 1.4 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 12.0, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "marine_waterbodies_label_4", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Marine Waterbodies_label", - "filter" : ["==", "_label_class", 3], - "minzoom" : 2, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-max-width" : 5, - "text-letter-spacing" : 0.15, - "text-line-height" : 1.2 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - }, { - "id" : "marine_waterbodies_label_5", - "type" : "symbol", - "source" : "esri", - "source-layer" : "Marine Waterbodies_label", - "filter" : ["==", "_label_class", 4], - "minzoom" : 2, - "maxzoom" : 10, - "layout" : { - "symbol-avoid-edges" : true, - "text-font" : "@Arial Italic", - "text-max-size" : 10.6667, - "text-max-width" : 8, - "text-field" : "{_name}", - "text-allow-overlap" : false, - "text-padding" : 1, - "text-max-width" : 5 - }, - "paint" : { - "text-color" : "#497AAB", - "text-size" : 10.6667, - "text-halo-color" : "#FFFFFF", - "text-halo-width" : 0.7, - "text-halo-blur" : 1.0 - } - } - ] -} diff --git a/js/source/esri-source.js b/js/source/esri-source.js deleted file mode 100644 index b147fa71a23..00000000000 --- a/js/source/esri-source.js +++ /dev/null @@ -1,130 +0,0 @@ -'use strict'; - -var util = require('mapbox-gl/js/util/util'); -var ajax = require('mapbox-gl/js/util/ajax'); -var browser = require('mapbox-gl/js/util/browser'); -var TileCoord = require('mapbox-gl/js/source/tile_coord'); -var TilePyramid = require('./esri-tile-pyramid'); -var normalizeURL = require('mapbox-gl/js/util/mapbox').normalizeSourceURL; - -exports._loadTileJSON = function(options) { - var indexLoaded = function (err, index) { - if (err) { - this.fire('error', {error: err}); - return; - } - //util.extend(this._pyramid, util.pick(index, 'index')); - - this._pyramid = new TilePyramid({ - index: index.index, - tileSize: this.tileSize, - cacheSize: 20, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - reparseOverscaled: this.reparseOverscaled, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this) - }); - - this.fire('load'); - }; - - var loaded = function (err, tileJSON) { - if (err) { - this.fire('error', {error: err}); - return; - } - - util.extend(this, util.pick(tileJSON, - 'tiles', 'minzoom', 'maxzoom', 'attribution')); - - if (tileJSON.index) { - //console.log("Getting index from: ", tileJSON.index); - ajax.getJSON(normalizeURL(tileJSON.index), indexLoaded.bind(this)); - } else { - this._pyramid = new TilePyramid({ - tileSize: this.tileSize, - cacheSize: 20, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - reparseOverscaled: this.reparseOverscaled, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this) - }); - - this.fire('load'); - } - }.bind(this); - - if (options.url) { - ajax.getJSON(normalizeURL(options.url), loaded); - } - else { - browser.frame(loaded.bind(this, null, options)); - } -}; - -exports._renderTiles = function(layers, painter) { - if (!this._pyramid) - return; - - var ids = this._pyramid.renderedIDs(); - for (var i = 0; i < ids.length; i++) { - var pos = TileCoord.fromID(ids[i]), - tile = this._pyramid.getTile(ids[i]), - z = pos.z, - x = pos.x, - y = pos.y, - w = pos.w; - - // if z > maxzoom then the tile is actually a overscaled maxzoom tile, - // so calculate the matrix the maxzoom tile would use. - z = Math.min(z, this.maxzoom); - - x += w * (1 << z); - tile.calculateMatrices(z, x, y, painter.transform, painter); - - painter.drawTile(tile, layers); - } -}; - -exports._vectorFeaturesAt = function(point, params, callback) { - if (!this._pyramid) - return callback(null, []); - - var result = this._pyramid.tileAt(point); - if (!result) - return callback(null, []); - - this.dispatcher.send('query features', { - uid: result.tile.uid, - x: result.x, - y: result.y, - scale: result.scale, - source: this.id, - params: params - }, callback, result.tile.workerID); -}; - -exports.create = function(source) { - // This is not at file scope in order to avoid a circular require. - var sources = { - vector: require('mapbox-gl/js/source/vector_tile_source'), - indexedVector: require('mapbox-gl/js/source/vector_tile_source'), - raster: require('mapbox-gl/js/source/raster_tile_source') - }; - - for (var type in sources) { - if (source instanceof sources[type]) { - return source; - } - } - - return new sources[source.type](source); -}; diff --git a/js/source/esri-tile-pyramid.js b/js/source/esri-tile-pyramid.js deleted file mode 100644 index d8dd321d780..00000000000 --- a/js/source/esri-tile-pyramid.js +++ /dev/null @@ -1,321 +0,0 @@ -'use strict'; - -var Tile = require('mapbox-gl/js/source/tile'); -var TileCoord = require('mapbox-gl/js/source/tile_coord'); -var Point = require('mapbox-gl/node_modules/point-geometry'); -var Cache = require('mapbox-gl/js/util/mru_cache'); -var util = require('mapbox-gl/js/util/util'); - -module.exports = TilePyramid; - -function TilePyramid(options) { - this.tileSize = options.tileSize; - this.minzoom = options.minzoom; - this.maxzoom = options.maxzoom; - this.reparseOverscaled = options.reparseOverscaled; - this.index = options.index; - - this._load = options.load; - this._abort = options.abort; - this._unload = options.unload; - this._add = options.add; - this._remove = options.remove; - - this._tiles = {}; - this._cache = new Cache(options.cacheSize, function (tile) { - return this._unload(tile); - }.bind(this)); -} - -TilePyramid.prototype = { - loaded: function () { - for (var t in this._tiles) { - if (!this._tiles[t].loaded) - return false; - } - return true; - }, - - orderedIDs: function () { - return Object.keys(this._tiles) - .sort(function (a, b) { - return (b % 32) - (a % 32); - }) // z-order - .map(function (id) { - return +id; - }); - }, - - renderedIDs: function () { - return this.orderedIDs().filter(function (id) { - return this._tiles[id].loaded && !this._coveredTiles[id]; - }.bind(this)); - }, - - reload: function () { - this._cache.reset(); - for (var i in this._tiles) { - this._load(this._tiles[i]); - } - }, - - getTile: function (id) { - return this._tiles[id]; - }, - - // get the zoom level adjusted for the difference in map and source tilesizes - getZoom: function (transform) { - return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2; - }, - - coveringZoomLevel: function (transform) { - return Math.floor(this.getZoom(transform)); - }, - - coveringTiles: function (transform) { - var z = this.coveringZoomLevel(transform); - var actualZ = z; - - if (z < this.minzoom) return []; - if (z > this.maxzoom) z = this.maxzoom; - - var tr = transform, - tileCenter = TileCoord.zoomTo(tr.locationCoordinate(tr.center), z), - centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5); - - var tiles = TileCoord.cover(z, [ - TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: 0, y: 0}), z), - TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: tr.width, y: 0}), z), - TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: tr.width, y: tr.height}), z), - TileCoord.zoomTo(tr.pointCoordinate(tileCenter, {x: 0, y: tr.height}), z) - ], this.reparseOverscaled ? actualZ : z).sort(function (a, b) { - return centerPoint.dist(TileCoord.fromID(a)) - - centerPoint.dist(TileCoord.fromID(b)); - }); - - /*//the added logic to not try to download empty tiles - var indexed = tiles.map(function (t) { - return this._indexSearch(t); - }, this); - - tiles = []; - indexed.forEach(function (id) { - if (tiles.indexOf(id) === -1) { - tiles.push(id); - } - });*/ - - tiles.sort(function (a, b) { - return centerPoint.dist(TileCoord.fromID(a)) - - centerPoint.dist(TileCoord.fromID(b)); - }); - - return tiles; - }, - - // Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; - // adds found tiles to retain object; returns true if children completely cover the tile - findLoadedChildren: function (id, maxCoveringZoom, retain) { - var complete = true; - var z = TileCoord.fromID(id).z; - var ids = TileCoord.children(id, this.maxzoom); - for (var i = 0; i < ids.length; i++) { - if (this._tiles[ids[i]] && this._tiles[ids[i]].loaded) { - retain[ids[i]] = true; - } - else { - complete = false; - if (z < maxCoveringZoom) { - // Go further down the hierarchy to find more unloaded children. - this.findLoadedChildren(ids[i], maxCoveringZoom, retain); - } - } - } - return complete; - }, - - // Find a loaded parent of the given tile (up to minCoveringZoom); - // adds the found tile to retain object and returns the tile if found - findLoadedParent: function (id, minCoveringZoom, retain) { - for (var z = TileCoord.fromID(id).z; z >= minCoveringZoom; z--) { - id = TileCoord.parent(id, this.maxzoom); - var tile = this._tiles[id]; - if (tile && tile.loaded) { - retain[id] = true; - return tile; - } - } - }, - - // Removes tiles that are outside the viewport and adds new tiles that are inside the viewport. - update: function (used, transform, fadeDuration) { - var i; - var id; - var tile; - - // Determine the overzooming/underzooming amounts. - var zoom = Math.floor(this.getZoom(transform)); - var minCoveringZoom = util.clamp(zoom - 10, this.minzoom, this.maxzoom); - var maxCoveringZoom = util.clamp(zoom + 1, this.minzoom, this.maxzoom); - - // Retain is a list of tiles that we shouldn't delete, even if they are not - // the most ideal tile for the current viewport. This may include tiles like - // parent or child tiles that are *already* loaded. - var retain = {}; - var now = new Date().getTime(); - - // Covered is a list of retained tiles who's areas are full covered by other, - // better, retained tiles. They are not drawn separately. - this._coveredTiles = {}; - - var required = used ? this.coveringTiles(transform) : []; - for (i = 0; i < required.length; i++) { - id = +required[i]; - tile = this.addTile(id); - - retain[id] = true; - - if (tile.loaded) - continue; - - // The tile we require is not yet loaded. - // Retain child or parent tiles that cover the same area. - if (!this.findLoadedChildren(id, maxCoveringZoom, retain)) { - this.findLoadedParent(id, minCoveringZoom, retain); - } - } - - for (id in retain) { - tile = this._tiles[id]; - if (tile && tile.timeAdded > now - (fadeDuration || 0)) { - // This tile is still fading in. Find tiles to cross-fade with it. - if (this.findLoadedChildren(id, maxCoveringZoom, retain)) { - this._coveredTiles[id] = true; - retain[id] = true; - } - else { - this.findLoadedParent(id, minCoveringZoom, retain); - } - } - } - - // Remove the tiles we don't need anymore. - var remove = util.keysDifference(this._tiles, retain); - for (i = 0; i < remove.length; i++) { - this.removeTile(+remove[i]); - } - }, - - addTile: function (id) { - var tile = this._tiles[id]; - if (tile) - return tile; - - var wrapped = this._wrappedID(id); - tile = this._tiles[wrapped] || this._cache.get(wrapped); - - if (!tile) { - var zoom = TileCoord.fromID(id).z; - var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1; - tile = new Tile(wrapped, this.tileSize * overscaling); - - tile.parentId = this._indexSearch(id); // get the parent tile in the tile index - - this._load(tile); - } - - tile.uses++; - this._tiles[id] = tile; - this._add(tile, id); - - return tile; - }, - - removeTile: function (id) { - var tile = this._tiles[id]; - if (!tile) - return; - - tile.uses--; - delete this._tiles[id]; - this._remove(tile, id); - - if (tile.uses > 0) - return; - - if (tile.loaded) { - this._cache.add(this._wrappedID(id), tile); - } - else { - this._abort(tile); - this._unload(tile); - } - }, - - clearTiles: function () { - for (var id in this._tiles) - this.removeTile(id); - this._cache.reset(); - }, - - tileAt: function (point) { - var ids = this.orderedIDs(); - for (var i = 0; i < ids.length; i++) { - var tile = this._tiles[ids[i]]; - var pos = tile.positionAt(point); - if (pos && pos.x >= 0 && pos.x < 4096 && pos.y >= 0 && pos.y < 4096) { - // The click is within the viewport. There is only ever one tile in - // a layer that has this property. - return { - tile: tile, - x: pos.x, - y: pos.y, - scale: pos.scale - }; - } - } - }, - - _wrappedID: function (id) { - var pos = TileCoord.fromID(id); - return pos.w === 0 ? id : TileCoord.toID(pos.z, pos.x, pos.y, 0); - }, - - _indexSearch: function (id) { - //console.log("checking index for missing tile"); - var tile = TileCoord.fromID(id), - w = tile.w; - - var ids = []; - - id = TileCoord.toID(tile.z, tile.x, tile.y); - ids.push(id); - while (id !== 0) { - id = TileCoord.parent(id); - ids.push(id); - } - - var cursor = this.index, - cursorId = ids.pop(), - index; - - while (ids.length) { - id = ids.pop(); - index = TileCoord.children(cursorId).indexOf(id); - if (cursor[index] === 0) { - id = cursorId; - break; - } - else if (cursor[index] === 1) { - break; - } - else { - cursorId = id; - cursor = cursor[index]; - } - } - - tile = TileCoord.fromID(id); - return TileCoord.toID(tile.z, tile.x, tile.y, w); - } -}; diff --git a/js/source/esri-vector-tile-source.js b/js/source/esri-vector-tile-source.js deleted file mode 100644 index fd71d9e7cbf..00000000000 --- a/js/source/esri-vector-tile-source.js +++ /dev/null @@ -1,102 +0,0 @@ -'use strict'; - -var util = require('mapbox-gl/js/util/util'); -var Evented = require('mapbox-gl/js/util/evented'); -var TileCoord = require('mapbox-gl/js/source/tile_coord'); -var Source = require('./esri-source'); - -module.exports = VectorTileSource; - -function VectorTileSource(options) { - util.extend(this, util.pick(options, 'url', 'tileSize')); - - if (this.tileSize !== 512) { - throw new Error('vector tile sources must have a tileSize of 512'); - } - - Source._loadTileJSON.call(this, options); -} - -VectorTileSource.prototype = util.inherit(Evented, { - minzoom: 0, - maxzoom: 22, - tileSize: 512, - reparseOverscaled: true, - _loaded: false, - - onAdd: function (map) { - this.map = map; - }, - - loaded: function () { - return this._pyramid && this._pyramid.loaded(); - }, - - update: function (transform) { - if (this._pyramid) { - this._pyramid.update(this.used, transform); - } - }, - - reload: function () { - this._pyramid.reload(); - }, - - render: Source._renderTiles, - featuresAt: Source._vectorFeaturesAt, - - _loadTile: function (tile) { - var overscaling = tile.zoom > this.maxzoom ? Math.pow(2, tile.zoom - this.maxzoom) : 1; - var params = { - //url: TileCoord.url(tile.id, this.tiles, this.maxzoom), - url: TileCoord.url(tile.parentId, this.tiles, this.maxzoom), // MOB - uid: tile.uid, - id: tile.id, - parentId: tile.parentId, //MOB - zoom: tile.zoom, - maxZoom: this.maxzoom, - tileSize: this.tileSize * overscaling, - source: this.id, - overscaling: overscaling - }; - - if (tile.workerID) { - this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID); - } - else { - tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile)); - } - }, - - _tileLoaded: function (tile, err, data) { - if (tile.aborted) - return; - - if (err) { - this.fire('tile.error', {tile: tile}); - return; - } - - tile.loadVectorData(data); - this.fire('tile.load', {tile: tile}); - }, - - _abortTile: function (tile) { - tile.aborted = true; - this.dispatcher.send('abort tile', {uid: tile.uid, source: this.id}, null, tile.workerID); - }, - - _addTile: function (tile) { - this.fire('tile.add', {tile: tile}); - }, - - _removeTile: function (tile) { - this.fire('tile.remove', {tile: tile}); - }, - - _unloadTile: function (tile) { - tile.unloadVectorData(this.map.painter); - this.glyphAtlas.removeGlyphs(tile.uid); - this.dispatcher.send('remove tile', {uid: tile.uid, source: this.id}, null, tile.workerID); - } -}); diff --git a/js/source/esri-worker.js b/js/source/esri-worker.js deleted file mode 100644 index 1b8bfc2cfce..00000000000 --- a/js/source/esri-worker.js +++ /dev/null @@ -1,134 +0,0 @@ -'use strict'; - -var Actor = require('../util/actor'); -var WorkerTile = require('./worker_tile'); -var util = require('../util/util'); -var ajax = require('../util/ajax'); -var vt = require('vector-tile'); -var Protobuf = require('pbf'); -var TileCoord = require('./tile_coord'); - -var geojsonvt = require('geojson-vt'); -var GeoJSONWrapper = require('./geojson_wrapper'); - -module.exports = Worker; - -function Worker(self) { - this.self = self; - this.actor = new Actor(self, this); - this.loading = {}; - this.loaded = {}; - this.layers = []; - this.geoJSONIndexes = {}; -} - -util.extend(Worker.prototype, { - 'set layers': function(layers) { - this.layers = layers; - }, - - 'load tile': function(params, callback) { - //console.log("in load tile"); - var source = params.source, - uid = params.uid; - - if (!this.loading[source]) - this.loading[source] = {}; - - this.loading[source][uid] = ajax.getArrayBuffer(params.url, function(err, data) { - delete this.loading[source][uid]; - - if (err) return callback(err); - - var tile = new WorkerTile(params); - tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data))); - - if (params.id !== params.parentId && tile.data.layers) - { - var tilePos = TileCoord.fromID(params.id); - var parentPos = TileCoord.fromID(params.parentId); - //if (parentPos.z === 14 && parentPos.x === 4823 && parentPos.y ===6157) - //{ - //parentPos.z = parentPos.z; - //} - var dz = tilePos.z - parentPos.z; - var xPos = tilePos.x & ((1 << dz) - 1); - var yPos = tilePos.y & ((1 << dz) - 1); - tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); - } - else - tile.parse(tile.data, this.layers, this.actor, callback); - - this.loaded[source] = this.loaded[source] || {}; - this.loaded[source][uid] = tile; - }.bind(this)); - }, - - 'reload tile': function(params, callback) { - var loaded = this.loaded[params.source], - uid = params.uid; - if (loaded && loaded[uid]) { - var tile = loaded[uid]; - tile.parse(tile.data, this.layers, this.actor, callback); - } - }, - - 'abort tile': function(params) { - var loading = this.loading[params.source], - uid = params.uid; - if (loading && loading[uid]) { - loading[uid].abort(); - delete loading[uid]; - } - }, - - 'remove tile': function(params) { - var loaded = this.loaded[params.source], - uid = params.uid; - if (loaded && loaded[uid]) { - delete loaded[uid]; - } - }, - - 'parse geojson': function(params, callback) { - var indexData = function(err, data) { - if (err) return callback(err); - this.geoJSONIndexes[params.source] = geojsonvt(data, {baseZoom: params.maxZoom}); - callback(null); - }.bind(this); - - // TODO accept params.url for urls instead - if (typeof params.data === 'string') ajax.getJSON(params.data, indexData); - else indexData(null, params.data); - }, - - 'load geojson tile': function(params, callback) { - var source = params.source, - coord = TileCoord.fromID(params.id); - - // console.time('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); - - var geoJSONTile = this.geoJSONIndexes[source].getTile(coord.z, coord.x, coord.y); - - // console.timeEnd('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y); - - // if (!geoJSONTile) console.log('not found', this.geoJSONIndexes[source], coord); - - if (!geoJSONTile) return callback(null, null); // nothing in the given tile - - var tile = new WorkerTile(params); - tile.parse(new GeoJSONWrapper(geoJSONTile.features), this.layers, this.actor, callback); - - this.loaded[source] = this.loaded[source] || {}; - this.loaded[source][params.uid] = tile; - }, - - 'query features': function(params, callback) { - var tile = this.loaded[params.source] && this.loaded[params.source][params.uid]; - if (tile) { - tile.featureTree.query(params, callback); - } else { - callback(null, []); - } - } -}); diff --git a/js/source/esri-worker_tile.js b/js/source/esri-worker_tile.js deleted file mode 100644 index d233c3144b5..00000000000 --- a/js/source/esri-worker_tile.js +++ /dev/null @@ -1,215 +0,0 @@ -'use strict'; - -var FeatureTree = require('../data/feature_tree'); -var Collision = require('../symbol/collision'); -var BufferSet = require('../data/buffer/buffer_set'); -var createBucket = require('../data/create_bucket'); - -module.exports = WorkerTile; - -function WorkerTile(params) { - this.id = params.id; - this.uid = params.uid; - this.zoom = params.zoom; - this.maxZoom = params.maxZoom; - this.tileSize = params.tileSize; - this.source = params.source; - this.overscaling = params.overscaling; -} - -WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, yPos) { - this.featureTree = new FeatureTree(this.id); - - var i, k, - tile = this, - layer, - bucket, - buffers = new BufferSet(), - collision = new Collision(this.zoom, 4096, this.tileSize), - buckets = {}, - bucketsInOrder = [], - bucketsBySourceLayer = {}; - - // Map non-ref layers to buckets. - for (i = 0; i < layers.length; i++) { - layer = layers[i]; - - if (layer.source !== this.source) - continue; - - if (layer.ref) - continue; - - var minzoom = layer.minzoom; - if (minzoom && this.zoom < minzoom && minzoom < this.maxZoom) - continue; - - var maxzoom = layer.maxzoom; - if (maxzoom && this.zoom >= maxzoom) - continue; - - var visibility = layer.layout.visibility; - if (visibility === 'none') - continue; - - bucket = createBucket(layer, buffers, collision, this.zoom, this.overscaling); - bucket.layers = [layer.id]; - - buckets[bucket.id] = bucket; - bucketsInOrder.push(bucket); - - if (data.layers) { - // vectortile - var sourceLayer = layer['source-layer']; - if (!bucketsBySourceLayer[sourceLayer]) - bucketsBySourceLayer[sourceLayer] = {}; - bucketsBySourceLayer[sourceLayer][bucket.id] = bucket; - } else { - // geojson tile - bucketsBySourceLayer[bucket.id] = bucket; - } - } - - // Index ref layers. - for (i = 0; i < layers.length; i++) { - layer = layers[i]; - - if (layer.source !== this.source) - continue; - - if (!layer.ref) - continue; - - bucket = buckets[layer.ref]; - if (!bucket) - continue; - - bucket.layers.push(layer.id); - } - - // read each layer, and sort its features into buckets - if (data.layers) { - // vectortile - for (k in bucketsBySourceLayer) { - layer = data.layers[k]; - if (!layer) continue; - sortLayerIntoBuckets(layer, bucketsBySourceLayer[k], dz, xPos, yPos); - } - } else { - // geojson - sortLayerIntoBuckets(data, bucketsBySourceLayer); - } - - function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { - for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i); - - //MOB - feature.dz = dz; - feature.xPos = xPos; - feature.yPos = yPos; - - for (var key in buckets) { - var bucket = buckets[key]; - if (bucket.filter(feature)) { - bucket.features.push(feature); - } - } - } - } - - var prevPlacementBucket; - var remaining = bucketsInOrder.length; - - /* - * The async parsing here is a bit tricky. - * Some buckets depend on resources that may need to be loaded async (glyphs). - * Some buckets need to be parsed in order (to get placement priorities right). - * - * Dependencies calls are initiated first to get those rolling. - * Buckets that don't need to be parsed in order, aren't to save time. - */ - - for (i = 0; i < bucketsInOrder.length; i++) { - bucket = bucketsInOrder[i]; - - // Link buckets that need to be parsed in order - if (bucket.collision) { - if (prevPlacementBucket) { - prevPlacementBucket.next = bucket; - } else { - bucket.previousPlaced = true; - } - prevPlacementBucket = bucket; - } - - if (bucket.getDependencies) { - bucket.getDependencies(this, actor, dependenciesDone(bucket)); - } - - // immediately parse buckets where order doesn't matter and no dependencies - if (!bucket.collision && !bucket.getDependencies) { - parseBucket(tile, bucket); - } - } - - function dependenciesDone(bucket) { - return function(err) { - bucket.dependenciesLoaded = true; - parseBucket(tile, bucket, err); - }; - } - - function parseBucket(tile, bucket, skip) { - if (bucket.getDependencies && !bucket.dependenciesLoaded) return; - if (bucket.collision && !bucket.previousPlaced) return; - - if (!skip) { - var now = Date.now(); - if (bucket.features.length) bucket.addFeatures(); - var time = Date.now() - now; - if (bucket.interactive) { - for (var i = 0; i < bucket.features.length; i++) { - var feature = bucket.features[i]; - tile.featureTree.insert(feature.bbox(), bucket.layers, feature); - } - } - if (typeof self !== 'undefined') { - self.bucketStats = self.bucketStats || {_total: 0}; - self.bucketStats._total += time; - self.bucketStats[bucket.id] = (self.bucketStats[bucket.id] || 0) + time; - } - } - - remaining--; - - if (!remaining) { - done(); - return; - } - - // try parsing the next bucket, if it is ready - if (bucket.next) { - bucket.next.previousPlaced = true; - parseBucket(tile, bucket.next); - } - } - - function done() { - var transferables = [], - elementGroups = {}; - - for (k in buffers) { - transferables.push(buffers[k].array); - } - - for (k in buckets) { - elementGroups[k] = buckets[k].elementGroups; - } - - callback(null, { - elementGroups: elementGroups, - buffers: buffers - }, transferables); - } -}; From e6e773623cf34c533b1d81123319cbec260cc340 Mon Sep 17 00:00:00 2001 From: chelm Date: Mon, 20 Jul 2015 08:14:13 -0600 Subject: [PATCH 15/27] dont create a tile pyramid until we have the index --- js/source/source.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/js/source/source.js b/js/source/source.js index 9b1f06e15aa..371d8593d3c 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -18,21 +18,6 @@ exports._loadTileJSON = function(options) { util.extend(this, util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution'])); - this._pyramid = new TilePyramid({ - tileSize: this.tileSize, - cacheSize: 20, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - roundZoom: this.roundZoom, - reparseOverscaled: this.reparseOverscaled, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this), - redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined - }); - // if index is defined, fetch the index json, then extend the pyramid if (tileJSON.index) { ajax.getJSON(normalizeURL(tileJSON.index), function (err, index) { @@ -41,15 +26,34 @@ exports._loadTileJSON = function(options) { return; } - util.extend(this._pyramid, index); + buildPyramid(null, index); this.fire('load'); }.bind(this)); } else { + buildPyramid(null, {}); this.fire('load'); } }.bind(this); + + var buildPyramid = function (err, index) { + this._pyramid = new TilePyramid({ + index: index.index, + tileSize: this.tileSize, + cacheSize: 20, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + roundZoom: this.roundZoom, + reparseOverscaled: this.reparseOverscaled, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this), + redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined + }); + }.bind(this); if (options.url) { ajax.getJSON(normalizeURL(options.url), loaded); From b8c3092848e154aa1bd03399fddc2ae70c5401af Mon Sep 17 00:00:00 2001 From: chelm Date: Mon, 20 Jul 2015 11:43:24 -0600 Subject: [PATCH 16/27] adding tests for searching an index in the tile_pyramid --- test/fixtures/index.json | 1 + test/js/source/tile_pyramid.test.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 test/fixtures/index.json diff --git a/test/fixtures/index.json b/test/fixtures/index.json new file mode 100644 index 00000000000..90fbdfb3ca2 --- /dev/null +++ b/test/fixtures/index.json @@ -0,0 +1 @@ +{"index":[[[1,[1,[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]]],[1,1,[1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[1,[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1]],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,[1,1,1,1],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]]]],[[1,1,[1,1,[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],1],1,[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[1,1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]]]]],[[[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1]]]],[[[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1]],[[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]]],[[1,[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]]]],1,[1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[[[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,[1,1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]]]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]]]],[[[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],1]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1],[[1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],1,1,1]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1]],[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,[1,1,1,1]],1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1]]],[[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[[1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]]]]]],[[[1,1,1,[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]],[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,1,1,1]],[1,1,1,1],[[[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]]],[1,1,[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],1,1],1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[[[1,1,1,1],1,1,1],1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],1,1,1],1],1,1,1]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[1,[1,1,1,1],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,[1,1,1,1],1],1,1,1],1],1,[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[1,[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1]],[1,1,1,1]]],[[[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1],[[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]]],[1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[1,1,[1,[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]],1,[[[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[1,[1,1,1,1],1,1],[1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],[[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1]],1],[1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1],1],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1],[[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1]]],1,[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],1,[1,[[1,1,1,1],[1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1]]],1,[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[[1,1,1,1],1,1,1]]],1,1]]]],[[1,1,[1,1,1,1],1],[[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],1],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,1],1,1],[1,1,1,1]],[[[[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]]]],[[[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],1],1,[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1]],1],1],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]]]],[[[[[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],1]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1]],1,[1,1,1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[1,[[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1]],1,1,1],1,1],[[[[1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]]]]],[[[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],1,[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]]]]]],[1,[1,[[1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],1,[1,[1,[1,[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]]],1,[1,[1,[1,[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]]],1,[1,[1,[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]],1,[1,[1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1],1]],[[1,1,1,1],1,1,1],[1,1,[1,1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[1,1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],1],[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]],1,[1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,[1,[1,1,1,1],1,1],1],1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]]],1,[1,[1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1]],1],1,[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1],1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]]],[[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]]],[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[[1,1,1,1],1,1,1]]]]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[1,[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],1],1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1]]]],[[[[1,1,1,1],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,1],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1]],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1]]]]],[[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1]]]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,[[1,1,1,1],[1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1]],1,1],1,1],1,1],1,[1,1,1,1]],[[[[[1,1,[1,[1,1,1,1],1,1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],1,1,1]]],1,[1,[[1,1,1,1],1,1,1],1,1],1],1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,[1,[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],1,1],1,1],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1]]],1,[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,1,[[[1,1,1,1],1,1,1],1,1,1]],1],1]],[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],1],1,[[[1,[1,1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],1,1],1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]]]],[[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1,1,1]],[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],1,[1,1,1,1],1]]],[1,[1,[1,[[[1,[1,1,[1,1,1,1],1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],1,1],[[[1,[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,[1,1,1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[[[1,1,1,[1,1,1,1]],1,1,1],[[1,1,1,1],1,1,1],1,1],1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1],1,1],1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1]]]],[[1,[[1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],1,[[1,1,1,1],[[[1,[[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1,1],1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[1,1,1,1]]],[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]]]],1,[1,[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1,1,1],1,1],1,[[1,1,1,1],1,1,1]]],1,[1,[1,1,1,1],1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]]]],[1,1,[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],1,1],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,1,1,1]]]]],[[[[[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,[1,[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1]],1,1],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],1],1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[1,1,[1,1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,1,1],1],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],1,[[1,[1,1,1,1],1,1],[1,[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],1],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1],1]],1,[[1,[1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],1,1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,1],1,[1,1,1,1],1],1]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]]]],1,[1,[[1,[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,[1,[1,1,1,1],1,1],1],1,[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,1]],[[[[[[1,[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1]]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,1],[1,1,1,1],1],[[[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]],[[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1]],[[1,[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],1,[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,[1,1,1,1]]],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1],[1,[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[1,1,1,1],1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],[[1,[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,[1,1,1,1],1],1]],[[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1],1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,1,1],[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,1,1,1]]],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,[1,1,1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,1,1,1],1],1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1]],[1,1,1,1],[[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[1,1,[[1,1,1,1],1,[[[1,1,1,1],1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,1]],1,1],[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],[[1,1,1,1],[1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[1,1,1,1]],[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1]],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1],1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]]],[[[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,[1,[1,1,1,1],1,1],1],1,1,[1,[1,1,[1,[1,1,1,1],1,1],1],1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,[1,[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],1,1],[[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1]]],[1,[1,[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[[1,[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,1,1]],[1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1,1],[[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,[1,1,1,1]],1]]]],[[[[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,1,1],[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,1],[[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,1],1,1]],[[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[[[1,1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,[1,1,1,1],1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[[[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1]],[[1,[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1]],1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1],1,1,1],[[1,[[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,1,1],1,1],[[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[[[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],[[[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1]],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,[[[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],[1,1,1,1]],1],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1]],1],1]],1]],[1,1,1,1],[[1,[[1,[[[1,1,1,1],1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,[1,1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1]],1],[[1,1,1,1],[1,1,1,1],1,1]],1,[[[1,[[1,[1,[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1],1,1],1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1]]]]],[1,[1,1,1,1],[1,1,[[1,1,1,1],1,[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1]],1],[1,[1,1,1,1],1,1]]],[[[1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],1,1],[[[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1]],1,[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,[1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,1],[[[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]]],1,1],[[[[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],1,1,1],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],1,1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1]]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,[1,1,1,1]],1,1],1,[1,1,1,[1,1,1,1]],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[1,1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],1],[1,[[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,[[1,1,1,1],1,1,1],1],[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]]]],[1,[1,1,1,[1,[1,1,1,1],1,[[1,[1,1,1,1],1,1],1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],1,1],[[[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,[1,1,1,1],1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1]]],1,1]],1,1]]],[[[[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1],1,[[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1]],[[[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1,1],1,1],[[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],1,1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,1,[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],1,1,1],1],[[1,[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1],[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1]]]],[[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1]],[1,[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],1,1,1]],[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[1,[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1]]]],[1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1]],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1],1,[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1]]],[[[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,1,1,1],1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1,1]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1],1,1,1]],1],[[1,1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],1]],[[[1,[1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],1,[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1]],1,[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1],1]],[1,[1,[1,1,1,1],1,1],1,1]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]]],[[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1]],[1,[1,1,1,1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],1],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[1,[1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]]],[[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],1]]],[[[1,1,1,1],1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,1,1,1],1],[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],1]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],1,[[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,1],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[[[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]]]],[[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,[1,1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[1,1,[1,1,[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1],1]]],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1]],[[[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]]],[[1,1,1,1],[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],1,1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]]],1,[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,[1,1,1,1],1],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1]],1,[1,[1,1,1,1],1,1]],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[1,1,[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]]]],[[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,1,1,1],1,1,1],1]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]]],1,[1,[1,[1,1,1,1],1,1],1,1],1],[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1,1],1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],1,1,1],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],1,[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],1,1,1],1],[[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1,1],1,1,1],1,1]]],[1,1,[[[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,[[1,1,1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1]],1,1,1],1],1]]]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[1,1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]]]]],[[1,1,[[1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1],1],1,[[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1],1],1],1,[[[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],1],1,[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],1],1],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,[[1,1,1,1],1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],1],[[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,[[1,1,1,1],1,1,1],1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],1,1],1],[[[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1],1],[[[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],1,1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,1,1],1,1,1]],1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],1,[1,[1,[1,1,1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],1,1]],1,[1,[1,[1,[1,[1,1,1,1],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1],1],[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1]],[[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[[1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,[1,1,1,1],1,1],1],1]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1,[1,1,[1,1,[1,1,1,1],1],1],1],1],1,1,1]],[[[[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,1]],[1,1,1,1],1],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1],1],[[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1]],1,1],[[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1],1,1,1],1,1,1]],1,1,[[1,1,1,1],[1,[1,1,[1,1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1]],1]],[1,1,1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]]]],[[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1],1],1],1]],[1,[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]]],1,[[1,[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[1,[1,1,1,1],1,1],1,1,1]],[[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[[[1,1,1,1],[1,1,1,1],1,1],1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[1,1,[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1],1]],1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,[1,1,[1,1,1,1],1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1],1],1,[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1]]]],[1,1,1,1],[1,[[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[1,[1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1],1,[[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],1],1]]]],[[1,[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[1,[[1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]]],1,[1,[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]]],[1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],1,1,1],1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]]],[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,[1,1,1,1],1,1]],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1],[1,[[1,1,1,1],1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]]],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1],1,[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1]],1,1]],[[[1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,[1,[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],[1,1,1,[1,[1,1,1,1],[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,1]]],[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],1],1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],1],1]]]],[[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],[1,1,1,1],1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],[1,1,1,[1,1,1,1]],1,1]]]]],[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1],[1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1],1],1,1],[[[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1],1,1],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[1,[1,1,1,1],1,1],1],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],1,1],[[[[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,1,1,1],1],1,1,1],1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]]]],1,[1,[[[1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],1,[[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[[1,1,1,1],1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],1,[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]]]],[[1,1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,[1,1,1,1],1],[1,1,[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],1,[1,[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]]],[[1,1,[1,1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]]],[1,[[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[[1,1,1,1],1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]]]],[[[[[[[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1]],1],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],1,[1,1,1,1],1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],1]],[1,1,1,1],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1],1]]]],[[[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]]]],[[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]]]]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[1,1,1,1],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[1,1,1,1],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1],[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],1,1]],[[[[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,[1,1,1,1],1,[[1,[1,1,1,1],1,[1,1,1,1]],1,1,1]],1,[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],1],1]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]]]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[1,[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,1,1,1],1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],[1,1,1,1],1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1]]],[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[[1,1,1,1],1,1,1],1,1],1,1]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1],[1,1,1,1],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],1],[[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,1]],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1],1,1,1]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],1,[[1,1,[1,1,1,1],1],1,1,1],1],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],1],1,[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,1,1],1]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1]]],[[1,1,1,1],[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1]]]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[[1,1,1,1],1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1],1,[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],1,[1,1,1,1]],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],1,[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1,[1,1,[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1],1],1],1]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1],1,1,1],[[[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,[1,1,1,1],1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],1]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],[1,1,1,1],1,[1,1,1,1]],1],1,1,1]]],[[[[[[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],1],1,[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1],1,[[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1,[1,[1,1,1,1],1,1]],1,1,[[1,1,1,1],1,1,1]],1],1,[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],1,1,1],1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,1],1],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],1,1,1],1],1,1],1,1,1],1],1],[[[[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[1,[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],1,1]]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1]]],[[[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],1,[1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]]],[[1,1,[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],1,[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1],1],1,1],1,1,1],1],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1],1,[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1,[[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,1,1],1,[1,1,1,1],1],1],1],1],1,[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1],1],1],[[1,[1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],1,1],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]],1,[[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]]],[[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1],1]],[[[[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[1,1,[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]]],1]],1,[[1,[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,1,[1,1,1,1]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1]]],1,[1,[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]]],[1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],1,[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],1,1]]]],1,[1,1,1,[1,1,1,[1,1,[1,1,1,[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]]],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1,[[[[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1],1,[[1,1,1,1],1,[1,1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],1],1],1,[[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],1],1],1],[[[1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1,[[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1],1,1,1]],[1,1,[1,[1,1,1,1],[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[1,1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,1]]]]],[1,1,[[[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1]],1,[[1,[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],1],[[1,1,1,1],1,1,[1,1,1,1]]],1]],[[1,1,[1,1,[1,1,1,[1,1,1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1]]],1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[[[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[[1,[1,1,1,[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]]],1,[1,1,1,1]],[[1,1,[1,1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,[1,1,1,[1,1,1,1]],1,1],1,1,[1,1,1,1]],1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,1,1,1],1]],1],[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,1],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]],[[[[[1,1,1,1],[1,[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1],1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,[[1,1,1,1],1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],1,[[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1,1],1],[[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],1],[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1]],[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]]]],[[1,[1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],1,1],[[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],1,[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,[1,1,1,1]]]],[1,[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,1],1,1]],1,[1,1,1,[1,1,1,[[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]]],[[[1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,[1,[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1],1],[1,[[[1,1,[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],1,1]],1,1],[[[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],1,1],[[1,1,[[[1,1,1,1],1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1],[[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1],[[1,1,1,[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1]],1],1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,[1,[1,[1,1,1,1],1,1],1,1],1]],[1,1,1,[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1],1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[[1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,1]],1,1,1],1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,1],1,[1,[1,1,1,1],1,1],1],[1,1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1]],1],1,[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1],[1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1,1]],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1]]]],[[[1,1,[[1,1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,1,1,1]]],[[1,[[1,1,1,1],1,1,1],1,1],[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],1,1],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1]]],[1,1,[1,1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1],1],1,[[[[[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],1],1,[1,[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],1,[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],1,1,1]],1],1,[[1,[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],1],[1,1,1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[1,1,[1,1,1,1],1],1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],1],1]],[1,1,1,1],[[[[[1,1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],1,[[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1],1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1]]],[1,1,[1,1,1,1],1]],1],1,[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,[[1,1,1,1],1,1,1],1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,1,1,1]]]],[[1,[[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],1,1,[1,[1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,1],1,1]],[1,1,[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],1,1],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1]],1,1],[1,1,1,1],1],[[1,1,[1,1,1,[1,1,1,[1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],1,1]]],[1,1,[1,1,[[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],1,1,1],1],1]],[[[1,[1,[1,[1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[[1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,[1,1,1,1],1,[[1,[1,1,1,1],[1,1,1,1],1],1,1,1]]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1]]]],[[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],1,1],1,1],[[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1,1],1,1],1,1,1]]],[1,[1,[1,[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1]],1,[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1,[[1,1,1,1],1,1,1]]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]]],[[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1]],[[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1]],[[[1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]]],[[1,1,1,[1,[1,1,[[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1]],1],1,[[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,1]]],[1,1,[[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],1,1,1]]],1],1,[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],1,1],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],1],1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[[[1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,[1,1,[1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],1],1,[[[1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],1,1],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1],1,1],1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1]],1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1]],1,1],[[1,[1,1,[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,1,1],1],[1,[1,1,1,[1,[1,1,[1,[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,1]],1,[1,[1,1,1,1],1,1]]],1,1],[[[[1,1,1,[1,1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1]],1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1]]],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1]]],1,[1,[1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,1],1,1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1,[1,1,1,1]]],[[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],1,1],[[1,1,[1,1,1,[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[[1,1,[[1,1,1,[1,1,1,1]],1,1,[1,1,1,1]],1],1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,[1,[1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],1,1],[[1,1,1,1],1,1,1]]]],[1,[[1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],1],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1]],1,1],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],1,1],1,1]],1,[1,[[1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1]],1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]]]]]],[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],[[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,1,1],1,1,1],1,1],[[1,[1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],1,[[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1],1,1]],[1,[[1,[[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],1,1,1]],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,1,1],1],1,1,1],1,1],1,1],1,1],1,1],1,1]]]]]],[[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],1,[1,1,1,[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],1,[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,[1,1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]],[1,1,1,1]],1,[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[1,1,1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1]],[1,1,1,[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],1,1],[1,1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1]]]]],[[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]]],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[1,1,[[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[[1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,1,1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],1,[[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]]]],[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1,[1,1,1,1],1]]]],1,[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[1,[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[1,1,1,1],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]]]],[1,[1,1,[1,1,[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],1],1],[[1,1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]]],[1,1,1,1]]],[1,[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],[1,1,1,1],1]],1,[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]]],1,[1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]]]]],[[[1,1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1]]]],[[[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1]],[1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1]],1],[[[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,[1,1,1,1],1,1],1]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],1],[[1,1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],1],[1,[1,1,1,1],[1,1,1,1],1],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1],1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1]],1],[[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1]],[[[1,[1,1,1,1],1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]]]],[1,[[1,[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],1,[1,1,1,1],1]],[[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,1],1,1]],1,[1,1,1,[1,1,1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[1,1,1,1]],[1,[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,1,1]],1,1],[[[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1]]],[[[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1],1]],[1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]]],1,[1,[[1,1,1,1],1,1,1],[1,1,1,[1,1,[1,[1,1,[1,1,1,1],1],1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1],[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],[1,[1,[1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[[[[[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,1,1,1]]]],[[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[1,[1,[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]]],[[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],1],[[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],1,[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],1],1],1],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]]],[[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1]],[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]]]],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[[1,1,1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,[1,1,1,1],1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,1],1,1]],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]]],[[[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1],1,[1,1,1,1]],[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[1,1,1,1]]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,[[1,1,1,1],1,1,1],1,1],1,1],1,[1,1,1,[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,[1,[1,1,1,1],1,1],1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1],1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],1],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1]],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1]]],[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1,[1,[1,1,1,[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],1,1]],1,[1,1,1,1]]],[[1,[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]]]],[[[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,[1,1,1,1]],1],1,1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],1]],[[1,1,[1,[1,1,1,1],[1,1,1,1],1],1],1,1,1],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1,1,1]]],[[[1,1,[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,[1,1,1,1]],1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]]],[[1,1,1,1],[[1,[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],1,1],1,[[[1,1,1,1],1,1,1],1,1,[1,1,1,[1,1,[1,1,1,1],1]]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,[1,1,1,1],1],1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]]],[[1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1,1],1]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,[[1,1,1,1],1,1,1],1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]]]],[[[1,1,1,[[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,[[1,1,1,1],1,1,1],1,1],1,1]],[[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1]],1],1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],1],[[1,1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1]],[[[1,1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1]],[[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[[1,1,1,1],1,1,1]],1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,1]],[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,[1,1,1,1]],1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],1,1],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1],1,1],1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]]]],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,1,1]],[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,1,[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]]],1]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,[[1,1,1,1],1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]]],[[1,[1,1,1,1],1,1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1]],[[1,1,1,[1,1,1,1]],1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1]]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],1,1],1,1,1],[1,1,1,1]],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],1,[[1,1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1],1,1,1]],[1,[1,1,[1,1,1,1],1],1,1]],[[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[1,1,[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],1],[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,1],[1,1,1,1]]],[[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1],1]],1,1],[[1,1,1,1],1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1]],[[1,1,1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,[1,1,1,1],1],1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[[1,1,1,[1,1,1,1]],1,1,1]],[1,1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],1]],[[1,[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1,[[1,1,1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,1]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]]],[[1,[[1,1,1,1],1,1,1],1,1],1,[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],1]],[1,[1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1],1,1],[[1,1,[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[[1,[1,[1,1,1,1],1,1],1,1],1,1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1]]],[[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]],1],1,[[1,1,1,1],1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1]],[1,1,[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1],[1,1,1,1],1]],[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],1],[1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],1],[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1]],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1],1,1]],[[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1]],[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[[1,1,[1,1,1,1],1],1,1,[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1]],1]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1]]],1,[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1]]]]]],[[[[1,1,1,1],1,[[1,1,[[[1,1,1,1],1,1,1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1],1],1,[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],1,[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[1,1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]],[1,1,[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],1],1]],[1,1,1,[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]]]]]],[[1,[1,[1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],1,1],1,1],[[[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1]],[[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1]]]],[[1,1,1,1],[[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],1,1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,1],1,[1,1,1,1],1],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],1,1],1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]],[[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1,1,1]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1],1],1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1,1],1]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],1,1,1],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1]],[[1,1,[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],1],1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[1,1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]]],[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1],1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,[1,[1,1,1,1],1,1],1],1,1,1],1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,1],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[1,1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1]],[1,1,[1,1,1,1],1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1]]]],[[[[[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,1,1,[1,[1,1,1,1],1,1]],1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]]],[[[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],[1,[1,1,1,1],1,1],[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1],1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1]],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[1,1,[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]],1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1]]]]],[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]]]]]],[[[[[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,1,1],1]]],[[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]],[1,1,[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,1],1],1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]],1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[[[1,1,1,1],1,1,1],1,1,1],1]]],1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1]]],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]]]],[[1,1,[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[1,1,1,1]]],[1,[[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],1]],[[1,[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],1,1],1,[1,1,1,1]],[[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1],[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]]],[[[[[[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,1,1],1],1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]]],[[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]]],[[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]]],[[[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]]]]],[[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]]]],[[[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],1,[[[1,1,1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1],1,1,1]]],[[[[1,1,1,1],1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],1,[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1]],[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],1,1],[[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1],1]],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,1],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1,[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],[1,1,1,1]]],[1,[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,1],1],1]],[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]]],1]]],[[[[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[1,1,1,1],[[1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],1,[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[[1,[1,1,1,1],1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1]]]],[[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[1,[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],1]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]]]],[[[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]]],[[[1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1]],1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1,[1,1,1,1]],[1,1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,[[1,[1,1,1,1],1,[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[1,1,1,1],1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,1,1],1]]]],[[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,[[1,[1,[1,1,1,1],1,1],1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1]],1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],1],[1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,[1,1,1,1]]],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1]],[1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,1],1,1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]],[1,[[1,1,1,1],[[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1],[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],[1,1,1,1],1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]]],[[1,1,[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1],[[1,[1,[1,1,1,1],1,1],1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]]]]],[[[[[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1],1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],1],1,[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[1,1,1,1],[1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,[1,1,1,1]]]],1,[1,[1,1,1,1],1,1]]],[[1,1,[1,1,[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],1],1,[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],1,1],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1]],[1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1]],[1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1]]]],[1,1,[1,1,[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],1],1],[1,[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,1]],1],1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],1,[1,[1,[1,1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,1],[1,1,1,1]],1,[1,[[1,1,1,[1,1,1,1]],1,1,1],1,[1,1,1,1]]]]],[[[[[[1,1,1,1],1,1,1],1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]]]]]]],[[[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,[1,[1,1,1,1],1,1]],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],1],[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]],[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,[1,1,1,1]],1,1,1],1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1],[1,1,[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1]],[[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[[1,[1,1,1,1],1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[1,1,1,1],1,[1,[1,1,1,1],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]]],[[1,1,1,1],1,1,[1,[1,1,1,[[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[1,1,1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]],1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],1],1],[1,1,[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1]],[1,1,1,[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,[1,[1,1,1,1],1,1],1],1,1]],[1,1,[1,1,[1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1],1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]],1],[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]]],[[[1,[1,1,1,1],1,1],1,[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,1],[[1,1,1,1],1,1,[1,[[1,1,1,1],1,1,1],1,1]],1,[1,[1,1,1,[1,1,1,1]],1,1]]],[[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]]],[[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1],1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1],[[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1],[[[1,1,1,[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,[1,1,1,1],1,1],1]],[1,[1,[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],1]],[[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]]]]]],[[1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,[1,1,1,1],1,1],1,1],1,1,1]],[1,1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]]]],[[[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],1],[1,1,[1,[1,[1,1,1,1],1,1],1,1],[1,[1,1,1,1],1,1]]],[[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[1,1,[1,[1,1,1,1],1,1],1],1,1,1]]],[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,1,[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1]],[[1,1,1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1]],1,1,1]],[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],1,[1,1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1]],1],[1,1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1]]]],[[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,1,[1,1,[1,1,1,1],1]],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1]],[[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1]]]],[[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],1,[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1]]],[[[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[[1,[1,1,1,1],1,1],1,1,1]],[1,1,[1,1,1,1],1],1]]],[[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],1,1,1]],[[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],1,[1,1,1,1],1]],[[[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,1]]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],1,1,1],[[1,1,1,1],1,1,[1,1,1,[1,[1,1,1,1],1,1]]],[1,[1,1,1,1],[1,1,1,1],1]],[1,[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1]],[1,[[1,1,1,[1,1,1,1]],1,1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,[1,1,1,1],1],1],[1,1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1]],[[1,[1,1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1]],[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1]]]],[[1,1,1,1],[[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1],[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]]]]]]],[[[[1,[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1]],[1,1,1,1],[[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1]],[1,1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,1,1,1],1],[1,1,1,1],1]]],[[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]]],[[[1,[1,[1,1,[1,1,1,1],1],1,1],1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],1,1],[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1]],[[[1,1,1,1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,[1,1,[1,1,1,1],1],1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,1],[[[1,1,[1,1,1,1],1],1,1,1],1,[1,1,[1,[1,1,1,1],1,1],1],1]],[[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1]],1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1]],[[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],1],1]],[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[1,1,1,[1,1,1,1]]],1,[[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,1,[1,1,1,1]],1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1]],1,[[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[1,1,1,1],1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]]]],[[[1,1,[[1,1,1,1],1,1,[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]],1],[1,1,1,1],[[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1],1],[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,[1,1,1,1]],1,1,1],1]],[[[[1,[[1,1,1,1],1,1,1],1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]]],[1,[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]]],[[[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[1,1,[1,[1,[1,1,1,1],1,1],1,1],1],[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,[1,[1,1,1,1],1,1]],1,[1,1,1,1],1],[1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],1],[1,1,[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1],[1,1,[1,[1,1,1,1],1,1],1]],[1,[[1,1,[1,[1,[1,1,1,1],1,1],1,1],1],1,1,[1,1,1,1]],[1,1,1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1],1,1],[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],1,1],1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1],1],[1,1,1,1]],[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,[1,1,1,[1,1,1,[1,1,1,1]]]]]],[[[1,1,1,1],[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[[1,[1,1,[1,1,1,1],1],1,1],1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]]],[[[1,1,1,1],1,1,1],[1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,1,[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]]],[[1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],[[[1,[1,1,[1,1,1,1],1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1]],1,1],[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,1],[1,1,1,[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1]]]],[[[1,1,1,1],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1,[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,1],1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]]],[[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1,[1,1,1,1]],[[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,[1,1,1,[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1]],[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1]]],[[1,[1,1,1,1],1,1],[[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],1,1,1],[[[1,1,1,[1,1,1,1]],1,1,1],1,[1,1,1,[1,[1,1,1,1],1,1]],1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1]],[[[[1,[1,1,1,1],1,1],1,1,1],1,[[1,1,[1,1,1,1],1],1,1,[1,[1,1,[1,1,1,1],1],1,1]],1],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,1],[1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,1],[[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1],1,[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]]]],[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],[[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[[1,1,1,1],1,1,1]],1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[1,1,1,1]],[1,1,[[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],1,[1,1,1,1],1]]]],[[[[[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1],[1,1,[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],1]],[[[[[1,1,1,1],1,1,1],1,1,[1,1,[1,1,1,1],1]],1,1,1],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],[[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]],1,1],1,1],[1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1,[1,1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]]]],[1,[1,[1,1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1],1,[1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1,1]],1,[[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1],1,1,[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],1,1,1],1,[[[1,1,[1,1,1,1],1],1,1,[1,1,1,1]],1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,[[1,1,[1,1,1,1],1],1,1,[1,1,1,1]],1,1]],[[[[1,[1,1,1,1],1,1],1,1,1],[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,[1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,1]],[[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],[[1,[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],1,1]]],[[[[[[1,1,1,1],1,1,1],1,1,1],1,[1,[1,1,[1,1,1,1],1],1,1],1],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],[[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1,1,1],[[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],1,1,[1,1,[1,[[1,1,1,1],1,1,1],1,1],1]]],[[[[1,1,1,[1,1,1,1]],1,1,1],1,[1,[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,1],1],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1],1],[[1,[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,1,1],[[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,[1,1,1,1],1],1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],1]]]]]],[[[[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],1]],[[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1]],[[1,1,1,1],1,[[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,[1,[1,1,1,1],1,1]],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,[1,[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],1,[[1,1,[1,1,1,1],1],1,1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[1,[1,1,1,1],1,1],1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],[1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,1],1],[1,1,[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1],1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[1,1,[1,[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1,[[[1,1,[1,1,1,1],1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,[[1,1,1,1],1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,1],[[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,[1,1,1,1],1],1,1],1,1,[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]]],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,[1,1,[1,1,1,1],1],1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[[1,1,1,1],[1,1,[1,1,1,[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],1,1,1]],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1,1],1,1,1],1],[1,1,1,[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],1,1],[1,1,1,[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1]]],[[[1,1,1,[1,1,1,1]],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,[1,1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1]],1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1]],[[1,[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,[1,1,1,1]],1,1]],[[1,1,1,1],1,1,[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]],[[1,1,1,[1,1,1,1]],1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],1,[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],1]]]],[1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],[1,[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]]],[[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]],[1,[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],1,1],[[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,[1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],1,1]]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,[1,1,1,1],1],1,1,1],1]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[1,1,1,1]],[[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,1]],[[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1]],[1,[1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1],[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1]],1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]]]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1]],[[1,1,1,1],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,[1,1,1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1]]],[1,1,1,1]],[[1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]],[[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]]],[1,1,1,1]],[[1,1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,[1,1,1,1]],1],[1,[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,[[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,1],1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[1,1,1,1],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,[1,1,1,1]]],[1,1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1]],1,1,1],1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],1]],1],[1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,1,1,1],1],1,1,[1,[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,[1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1],1,1],[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],1]],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,[1,[1,1,1,1],1,1],1],[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]]]]],[[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,[1,[1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[[1,1,1,1],1,1,1],1,1]],1]],1],1,[[1,1,1,1],1,[[1,1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],1,1],1],1],[1,[1,[1,1,1,[1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],1,[1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1,1]],1,1],[1,1,[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]]]],[1,1,[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1]]],[1,1,[1,1,[[1,1,[1,[1,1,1,1],1,1],1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]]],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1],1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]]],[1,[[1,[1,1,[1,1,1,1],1],1,1],1,1,1],[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],1],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1]]],[[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]]],[1,[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],1,1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1],[[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1]],[[[[1,1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],[1,1,1,1]],[1,1,1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],1,1,1],1,1,1],[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]]],[1,[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1]],[[[1,1,1,[1,1,1,1]],1,1,1],1,1,[[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1]],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1]]],[[[1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],1]],[[1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],1,[[1,1,[1,1,1,1],1],1,1,1],1],[1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[1,[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],1,[1,1,1,1]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]]],[[[[1,1,1,1],1,1,1],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]]]]],[[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1]]]],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,[1,1,1,1]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,[1,1,1,1],1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],1],[1,1,[[1,1,1,1],1,[1,[1,1,[1,1,1,1],1],1,1],1],1],[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1,1],[1,1,1,1]]]],[[[1,[1,1,1,[1,1,1,1]],1,1],1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1]]],[[[1,1,[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],1,1,1],1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,[1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1]]],1,[1,[[1,1,1,1],1,1,1],1,1]]]],[[[1,[1,[1,1,1,[1,1,1,1]],1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],1],[[[1,1,[1,1,1,1],1],1,1,1],1,1,[1,1,1,1]],1,1],[[1,1,[1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1]],[1,1,[[1,1,[1,1,[1,1,1,1],1],1],1,1,[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],1],1]]],[[[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1],[[1,[1,1,1,1],1,1],1,[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[1,1,1,1]],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]]]]]],[[[[1,1,[[1,[1,1,[1,1,1,1],1],1,1],1,[1,1,1,1],1],1],[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],1,1,1],[[1,[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1]],[1,1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,[[1,1,1,1],1,1,1]],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[1,1,1,1],1,1]],[[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1],1],1,1],1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]]],[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1],[1,[1,1,1,[1,1,1,1]],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],1,1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,[1,1,1,1]]],1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1]]],[[[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,1,1],1,1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1]],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,[[1,[1,1,1,1],1,1],1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],1],1],[1,[1,1,1,1],[1,1,1,1],1]],[[[[1,[1,1,1,[1,1,1,1]],1,1],1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],1],[[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]],1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]]],[[1,[[1,[1,1,1,1],1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,1,1],[[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],1]],[1,1,1,1]],[1,[1,[1,1,1,[[1,1,1,1],1,1,1]],[1,[1,1,[1,1,1,1],1],1,1],1],[[1,[1,1,1,1],1,1],1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],1],[[[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],1],1],[1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,[1,1,1,1]],1],[[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],1],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,1,1,1]]],[[[[1,1,1,1],1,1,1],1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],[1,[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],1,[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1]]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,[1,1,1,1],1,1],1],[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[1,1,1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]]]],[1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1]]],[[[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,1,1],1],[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1,1],1],[[[[1,1,1,1],[[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1],1],1,1,1],1,1,1],1,1],[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1]],1,1],[[[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1]]],1,[1,[1,[[1,1,1,1],1,1,[1,[1,1,1,1],1,1]],1,1],1,1]],[1,1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]]]],[[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1,[1,1,1,[1,1,1,[1,1,1,1]]]]],[[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,1]],1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[1,[1,1,1,1],1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]]],[[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],1,1]],[[[1,[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,1,1,1]],[[1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1,1,1],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],1,1]],1,1],1],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,1,1,1]]],[[1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]],[1,1,[1,[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[1,1,1,[1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,1]],[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],1,1,1],[1,1,1,1]],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1]],1,1],[[[[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,1],1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1]]]],[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]]],[1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[1,[1,1,1,1],1,1],[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]]]]]]],[[[[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1],1],1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1],[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1],[1,[1,1,[1,1,1,1],1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1]],[1,1,1,1]]],[[[[1,1,1,1],1,[1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1],1,1],1],[1,1,1,1],[1,[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],[1,[1,1,1,1],1,1],1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1],[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],[1,1,1,1]],[1,1,1,[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],1,1]]],[[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],1],1],[1,1,1,1]]]],[[[1,1,[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1],1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1]]],[[1,1,1,[[1,1,1,1],1,1,1]],[1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],[1,1,1,1],[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],1,1]],[[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],1],1]]],1,[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]]],1,[[[1,1,1,1],1,1,1],1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],[1,1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,1,1]]],[[[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1]],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],1,1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[[[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],1],[1,1,1,[1,1,1,1]],[[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1],1,1,[1,[1,[1,1,1,1],1,1],1,1]]],[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],1],[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],[1,[1,1,[1,1,[1,1,1,1],1],1],1,1]]]]],[[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,[1,1,1,1],1]],1],1,[[1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,1],[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[1,1,1,1]],[[1,[[1,[1,1,[1,1,1,1],1],1,1],1,1,1],1,[[1,1,1,[[1,1,1,1],1,1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1]],[1,1,[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],1],1],[1,1,1,1],[1,1,[[1,1,[1,[1,1,1,1],1,1],1],1,[1,1,1,[1,1,1,1]],1],1]]],[[1,[[1,1,[1,[1,1,1,1],[1,1,1,1],1],1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1,[[1,1,1,1],1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],1],[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],1],1],[[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1]],[1,1,1,1]],[[[1,[1,1,[[1,1,1,1],1,1,1],1],1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1]],1],1,[1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,1,1],[1,[1,1,1,1],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],1,[1,1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]]]],[[[1,[1,1,1,1],1,1],[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],1],1],[1,1,1,1]],[1,[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,[[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,[1,1,1,1],1,1],1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[[[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],1],[[1,1,[1,1,1,1],1],1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,1,1,1],1]],[[1,1,1,1],[1,[[1,1,1,[[1,1,1,1],1,1,1]],1,[[1,1,1,1],1,1,1],1],1,1],[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],[1,[1,1,[1,[1,1,1,1],1,1],1],1,1]],[[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[1,1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1],1],1]]],[[[1,1,1,1],1,[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1]],[[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1]],[[1,1,1,1],1,[[1,[1,[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],1,1],1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[1,1,1,[1,1,[1,[1,1,[1,1,1,1],1],1,1],1]],1,1,1],[[[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],1,1],[1,1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],1]],[[[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],1,[[1,1,1,1],1,1,1]],[1,1,[1,1,[1,[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1]],1],1],[1,1,1,1],[[1,[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],1,1],1,1,1]]]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[[1,[1,1,1,1],1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[[1,1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1],1,[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[1,[[1,[1,1,1,1],1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],1,1],[[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1]],1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,[[1,1,1,1],[1,1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1,1],1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,[1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],1,1]],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1],[[1,[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1]],[1,1,[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1]],1,1,1],1]],[1,1,[1,1,1,1],[1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],1,1]]]]],[[[[[[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],1],[1,1,[1,[1,1,1,1],1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[[1,1,[1,1,1,1],1],1,1,1]],[[[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1]],[[[1,1,1,1],[1,[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1,1],[[1,[1,1,1,1],1,1],1,1,[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1]],[[1,1,1,1],1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1]],[1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1]],[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],1],1],[1,[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,1,1],[1,1,1,1],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[[1,1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],1,[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],1],[[[1,1,1,1],1,1,1],1,1,1],1]]],[[[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]]],[1,1,[[1,1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]]],[[1,[1,1,1,[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1]]],1,[1,[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,1]],[[1,1,[[1,1,[1,1,1,1],1],1,1,[1,1,1,1]],[1,1,1,1]],1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1],[[[1,1,1,1],1,1,1],1,1,[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],1]],[[1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1]]],[[[[1,1,1,1],[[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1],[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],1,1]],[[[[[[1,1,1,1],1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1],[1,1,1,1]],[[[1,[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],1]],[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,1]]],[[[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],[1,1,1,1],[[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,1,[1,1,1,1]],1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1]]],[[[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],1,[1,1,1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,1,[[1,1,1,1],1,1,1],1],1],1]],[[1,1,1,1],1,[[[1,1,[1,1,1,1],1],1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1],1,1],[1,1,1,1]],[[[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1],1,1,1],[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]],1,1],[1,[1,1,1,1],[[1,1,1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1,1]],1,1,1],[1,1,[1,1,1,1],1]]],[[[1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],1,1],[1,1,1,1],[[1,[1,1,[[1,1,1,1],1,1,1],1],1,1],1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,1]],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]],1,[[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1]],1,1,1]]]],[[[[1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]],1]]],[[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1]],[[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],1,1]],[1,[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,[1,1,1,1],1,1]],1]],[[[1,1,1,1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,1,1]],[1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,1],[[1,1,1,[[1,[1,1,[1,1,1,1],1],1,1],1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1],1,1],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,1,1]],[[1,1,[[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1],1,[[[1,1,1,1],1,1,1],1,1,1]],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,[1,1,1,1],1,1],1],1,1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,[1,[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1,1,1],1,1],1,1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1],1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],1,1,[[1,1,1,1],1,1,1]],[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],1,[1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1,1,1],[[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,[[1,1,1,1],1,1,1]]]],[[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],[[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],1],[[1,[[1,1,1,1],1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1]],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,1]],[[1,[1,1,1,[1,1,1,1]],[1,[[[1,1,1,1],1,1,1],1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],1,1]],[1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[1,1,1,[1,1,1,1]]]],[[[[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],1,1],1,1,[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,[1,1,1,1],1],1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1]]],[1,[[1,[1,1,1,1],1,1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],1,1],[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1]],[1,[[1,[1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1],[1,1,1,1],[[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1]]],[[[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],1,1,1],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,[1,1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]]]],[1,[1,1,1,1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1],[1,[1,1,1,1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1]]],[[[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1,[1,1,[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1],1],1],[[1,1,[1,1,1,1],1],[1,[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],1],1,1,1]]],[[[1,1,[[1,1,1,1],1,1,1],1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1]],[1,1,1,1]],[[[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[[[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[[1,[1,1,1,1],1,1],1,1,1],1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,[[1,1,1,1],1,1,1],[1,1,1,[1,1,[1,1,1,1],1]]],1,[1,[1,1,1,1],1,1]],1,1],[[1,1,1,[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]]],[[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],1,[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1]],[1,[1,[1,1,1,1],1,1],1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],1],1,[[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[[1,1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1],1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,1,1]]],[[1,[1,1,1,1],[[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[1,1,[1,1,1,1],1],[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1]]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,1,[1,1,1,1]],1,[1,1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1]],[1,1,1,1]]],1,[[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[[1,1,1,1],[[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[[1,1,[1,1,1,1],1],1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[1,1,[[[1,1,1,1],1,1,1],1,1,1],1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,[[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]]]],1],[[1,1,[[[1,1,[1,1,1,1],1],1,1,1],1,1,[[1,[1,1,1,1],1,1],1,1,1]],1],[1,1,1,1],[1,[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],1,1],[1,1,[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],[1,1,[1,1,1,1],1]]]],[[[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,[[1,1,[1,1,1,1],1],1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1]],1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],1],1],1],[[1,[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1],1,1,[[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],1,1,[[1,1,1,1],1,1,1]]]],1]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],[[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1],1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1],1],1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],[1,1,1,1]],[[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,[1,1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,1],1,1,1],1,1],[[1,1,1,1],[[1,[[1,1,1,1],1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],1],[1,1,1,1]]],[[[[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1,[1,1,[[1,1,1,1],1,[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]],[1,1,1,1]],[1,1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1],[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],1,[[1,1,1,1],1,1,1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],1,[1,1,1,1],1],1,1],1,1,1],[1,1,1,1]],[[1,1,[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],1],[1,[1,1,[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1]],1],1,[[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,1,[1,1,1,[[1,[1,1,1,1],1,1],1,1,1]]],1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],1,1],1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]]],[1,1,1,1],[1,[1,[[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],1,1],1,1]]],[[[1,1,1,1],[1,1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[[1,1,1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,[[1,1,[1,1,1,[1,1,1,1]],1],1,1,1],1],[1,1,1,[[1,[1,1,[1,1,1,1],1],1,1],1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]]],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]]]],[1,[1,1,1,1],[1,[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1],[1,1,1,1]],[1,[1,[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],1,1],[1,1,1,1],1],[[[[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],1,[[1,[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1,[1,[1,1,1,1],1,1]],1],1,[1,[1,1,1,1],1,[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1]],[1,1,1,1]]],[[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],1,1,1],[1,[1,1,1,[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]],1,1],[1,1,[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1],[1,[[1,1,1,1],1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]]],1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1]],1]],[1,1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1]]],[[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1,1]]],[[[[[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1],[[1,1,1,[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1]],[1,[[1,1,1,[1,1,1,1]],1,1,[1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],1,1]],1,1],[[[1,1,1,1],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,[1,[1,1,1,1],1,1]],1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1]],1]],1],[[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],1,1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,1,1]],1,[1,1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],1],1]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1],1,1],1,[1,[1,1,1,[1,1,1,1]],1,1]]],[[1,[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1],[[1,1,1,1],1,1,1],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1],1],1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,[1,[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1]],[[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1,[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,1],1,1,1],1]],[[1,1,[1,1,1,1],1],1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],1,1,1]],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1]],[[1,[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,1,1]],1,[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],1,1],1]],[[1,1,1,1],1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[[1,[1,1,1,1],1,1],1,1,1]],[1,1,1,1],[[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1,1],1,1,1],1]],[[[1,1,1,1],[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],1,1],1,1],[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[[1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],[1,1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]]],[[1,1,1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1],1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,[1,[1,1,1,1],1,[[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[1,[1,1,1,1],[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1],1,1]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],1]],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],1,1,1],1],[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1]],[[[[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1],1],1,1,1],1,1,1],[[[[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1],1],1,1,1],1,1,1],1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,1,1,[1,[1,1,1,1],1,1]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,[1,1,1,1],1]],[1,1,1,1]]]],[[[1,[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1,1],1,1],1,[1,1,1,1]],[[[[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,[[1,1,1,1],1,1,1]]],1,[[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]]],[[[1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],1,1],[[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],1,[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1]]]],[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]]],[1,1,[[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,[[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],[[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1],1],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1]],1]],[[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]]],1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[[[[[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1],[[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1],1]]],[[1,[1,[1,1,1,1],1,1],1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1]],[1,[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]],1,1],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,[1,1,1,1],1],1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]],[[1,1,[[1,1,1,1],1,1,1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,[[1,1,1,1],[1,1,1,1],1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1]],1,1],[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,[1,1,[1,1,1,1],1],1,1]],[1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,[1,1,1,1]],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],[1,[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1,[1,1,1,1]]]]]],1,[[1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,[1,[1,1,1,1],1,1]],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,[[1,[1,1,[1,1,1,1],1],1,1],1,1,[1,1,1,1]],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[[1,[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],1,[[[1,[1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],1,1],1,1],[[[1,1,[1,1,1,1],1],1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,[[1,1,1,1],1,1,1],1]],1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],[1,1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],1,1],[1,[[1,1,1,1],1,[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]]]]],[[1,1,1,1],[[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1],1],1,1,1],[1,1,[1,[1,1,1,1],1,1],[[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1],1]],[1,1,[[1,1,[1,1,1,1],1],1,[1,[[1,1,1,1],1,1,1],1,1],1],1]],[1,[1,1,1,1],1,[1,1,[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1],[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[[[[[1,1,1,1],1,[1,1,[1,[1,1,1,1],1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1],1],[1,1,[1,1,1,1],1],1],[[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[1,1,[1,1,1,1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],1],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],1,1,1],1,1],[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1]],[[1,1,1,1],1,[1,1,1,1],1]]],1,[[1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],1,[[1,1,1,[1,1,1,1]],1,1,1]],[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],[[1,[1,1,1,1],1,1],1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1]],[1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1]],[[[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1],1,1],1,1],[[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1],1,1]]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1],1,[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],1],[[[1,1,1,[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]]],[[1,1,[1,[1,1,[1,1,1,1],1],1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]]],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[[1,1,1,1],1,1,[1,1,1,1]],1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[[[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],1,1],[[[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],1],[1,[1,1,[1,1,1,1],1],1,1]],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]]]],[[[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1],1,[[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],1],1],[1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1]],[[[[1,1,1,1],[1,1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],1],[[[[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]]]],[[1,1,1,1],1,1,[[1,1,[1,1,1,1],1],1,1,1]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1],[1,1,1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1],1,[1,1,1,1]]]],[[[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,[1,[[1,1,1,[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[[1,1,1,1],1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1],1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],1,1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1]],[1,[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1]]]]],[[[[1,[1,[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,1],[1,1,1,1],1]],1,1],[[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],1]]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[1,[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,[1,1,1,1],1],1,1,[[1,1,1,[1,1,1,1]],1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,[1,1,[1,1,1,1],1],1,1],1,[[1,1,1,1],1,1,1]],1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[1,1,[1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],1],1],[1,[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[1,[1,1,1,1],[1,1,1,1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],1,1]],1,1]],[[[[1,1,[1,1,1,1],1],1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1,1],[[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],[[[1,1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,[1,1,[1,1,1,1],1],1,1]],[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],1],1,1],[[1,1,1,1],1,1,1]],1,1],[[[[[1,1,[[1,1,[1,[1,1,1,1],1,1],1],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1,1,1],[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],1,1,1],1,1],1,1],[[1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],1,[[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],1,1]]],1,1]],[[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1]]]],[[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,[1,1,1,1],1]],1],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1],1,1,1],[1,1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1]]]],[1,1,1,1],[1,[[1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,[[1,1,1,1],1,1,1],1],1],[[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1]],[1,[1,[1,[1,[1,1,1,1],1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1]]],1,[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]]],1,[1,[[1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]]]],[[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,[1,1,1,1]],[[1,[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1,1,1],1,1],[[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1]],1,[[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]]]]],[[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[1,1,1,[1,1,1,1]],1,[1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1],[1,[1,1,[1,1,1,1],1],1,1]],1,1],1,[[[1,1,[1,1,1,1],1],1,1,1],1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1],1],1]],[[1,[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1]],[[1,1,[1,1,1,1],1],1,1,1],[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],1,[[1,[1,[1,1,1,1],1,1],1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],1,[1,[1,1,1,[1,1,1,1]],1,1]]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]],1,1,1],1]],[[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,[1,[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,[1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1,1]]],[[[[1,1,1,1],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,[[1,[1,1,1,1],1,1],1,1,1]],1],1],[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]]]],1,[1,[[[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]],1]],1,[1,[[1,[1,[[1,1,1,1],1,1,1],1,1],1,[1,[1,1,[1,1,1,1],1],1,1]],1,[1,[1,1,1,1],1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1]]]],[[[[[1,1,1,[1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],1,[1,[1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]]],[[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1]],[[1,1,1,1],1,1,[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],1],[[1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],[1,1,1,1]],1,1],1,1],[[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[1,1,1,1],1,1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1]]],[[[[[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1,1,1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,1,1],[[[1,1,[1,[1,1,1,1],1,1],1],1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1],1],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,1,1]],[[1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,1,1,[[1,1,1,1],1,1,1]],1],[1,1,1,1],[1,1,1,[1,1,1,[[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1,1,1]]],[1,1,[1,1,1,1],1]],[[[[[1,1,1,1],1,1,1],1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],1],[1,1,1,[1,1,1,1]],[1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],[[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1],1],1,1],1,1,1],1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1]]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[[1,1,1,1],1,[1,[1,1,[1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,1],[1,1,1,1]],1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[1,[1,1,1,1],1,1]],1,[1,1,[1,1,[1,1,[1,1,[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],1],1],1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1,[[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1]],1,[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],[1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,1,1,1]],1,1],[[[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],1,1,1],1],1,1,1]]],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,[[1,1,1,1],1,1,1],1,1],1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[[1,1,1,1],[[1,[1,1,[1,1,1,1],1],1,1],1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,[1,[1,1,[1,[1,1,1,1],1,1],1],1,1]],1],[[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1,1,1],1,1],1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1]],1,1],1,[1,1,[1,1,[[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],1,1,1],1],1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],1,1,1],1],1,[1,[[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1],1,1]],[1,1,1,[1,[1,1,[1,[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],1,1],1],1,1]]],[[1,1,[[[1,1,1,[1,1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]]],1,[1,[[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1],1],1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,[1,1,[1,[1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],1]],1,[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1],1,1],1,1]],[1,1,[1,1,1,1],1]],1],1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,[1,1,1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1],1],1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1]]],[[1,[1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,[1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1]],1],1,[1,1,1,1]]],1,1],1,1],1,[1,1,1,1]],[[[[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,1,1],1,1],1]],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,1]],[1,1,1,1],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]]]],[1,1,[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],1,[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1]]],[1,[1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],1],[[1,1,1,1],1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1,1],1,1,1]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,[[1,[1,1,1,1],1,1],1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,[1,1,[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],1]],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],[1,1,[1,1,1,1],1],1]]]]],[[[[[[[1,1,1,1],[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],[1,[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,1],1,1]],1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[[1,1,[1,1,[1,1,1,1],1],1],1,1,1]],[1,1,[[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1,1,1],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1]],1,[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,1,1]]],[1,1,[1,[1,1,[[1,[1,1,1,1],1,1],1,1,1],1],1,1],1],[[1,1,1,1],[1,[1,1,[1,[1,[1,1,1,1],1,1],1,1],1],1,1],1,1]],[[[[[[[1,1,1,1],1,1,1],1,1,1],1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1]],[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,1,[[1,[[1,1,1,1],1,1,1],1,1],1,1,1]]],[1,1,[[1,1,1,[[1,[1,1,1,1],1,1],1,1,1]],1,1,1],1],[[1,[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],1,1],1,1,[1,1,1,[1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,[1,1,1,1],1,1],1],1]]],[1,1,1,[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,1,1],1],1]]],[[[1,1,1,1],1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[[1,1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]]],[1,1,[[1,1,1,1],1,[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1]]],1],[1,[[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],1],[1,[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,[1,1,1,1],1]],1],[[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,1],[[[1,1,1,1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1,1]],[[[1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],1,1],1,1,1],[1,1,[1,1,[[1,1,[1,[1,1,1,1],1,1],1],1,1,1],1],[[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],1,1,1]],[1,[1,1,1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],1,1]],1,[1,1,[1,1,1,1],1]],[[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],1,1,1],[1,1,1,1]]],[[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[1,1,1,1],[[[1,[1,[1,1,1,1],1,1],1,1],[[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],1,1,[[1,1,1,1],1,1,1]],1,1],1,1,1]],[1,1,1,[1,1,1,1]],[[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[1,1,[[[1,1,[1,1,1,1],1],1,1,1],1,[1,1,1,1],1],1],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1,1],1,1],[[[[1,1,[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1],1,[1,1,1,1],1],1,[1,1,1,1],[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[1,1,1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],1]],[1,[[1,[[1,1,1,1],1,1,1],1,1],[1,1,[1,1,[1,1,1,[1,1,1,[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]]],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1]],1],1,[[[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,[[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],1,[[1,1,[1,[1,1,1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1],1],1,[1,1,1,1]],1],[[[1,1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1]],1],1,[1,1,1,1]],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,[1,1,[1,1,1,1],1],[1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,[1,[1,1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,1]],1,[1,1,1,1]],[[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1],1],[1,1,1,1],1,1],1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,[[1,[[1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1,1],[[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,[[1,1,1,1],1,1,1],1],1,1],[1,1,1,1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],1],1]],1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[[[1,1,1,1],[[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1],1,1,1],1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,[1,1,1,1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]]]]],[[1,1,1,1],[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]]],[[1,[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]]],[1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,[1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],1,1],1,1],[[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],1,1,1],1,1,1],[1,1,1,1],[1,[1,1,[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1]]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[[[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],1,[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[[1,1,1,1],1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],1],1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1]],[[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,[[1,1,1,1],1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1]]]]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[[1,1,1,1],1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,[1,1,1,1],1],1,1,[1,1,1,1]],1],1],[[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,[1,[1,1,1,1],1,1],1]],[[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]],[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]]]],[[1,1,1,1],[[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1]],[1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]],[[1,1,1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],1]],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]]],1],[1,1,1,1],[[1,[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1,1],1,1],1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1],[[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1],1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],1,[1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,1]]]]],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,1,1,1]],[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,1]]],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[1,1,1,1]],[1,1,1,1],[[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[1,1,1,1],[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,1],1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]]]]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[[[1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]]],[[[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1],[[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1],1,[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[1,1,1,1],1],1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1]],1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]]],[[[[[1,1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1,1],1]]],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[1,[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,[1,1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,[1,1,1,[1,1,1,1]],1]],1]],[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,[1,1,1,1]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1],1,1,1],1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]]],[1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1],[1,1,1,1],[[[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],[[[1,1,1,1],1,1,[1,1,1,1]],1,1,1],1,1],[1,1,1,1],1,1]],[[1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1]],[1,1,1,1],[1,1,[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],1,1,1]],1],[1,1,1,1]],[1,[1,1,1,1],[1,[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,1,1,[[1,1,1,1],1,1,1]],[1,1,[1,1,[1,1,1,1],1],1]]]],[1,1,1,1],[[1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],1,1],[[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,[1,1,1,1]]],1,[1,1,1,1]],[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,1,1],1,1,1]],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,[1,[1,1,1,1],1,1]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1]]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],1],1,[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]]]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[[[[1,1,[1,1,1,[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],1,1]],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[1,1,[[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,1,1],1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1],1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]]]],[1,1,1,1],[1,[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,1,1]]],1],[1,1,1,1],[[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1]],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]]],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,[1,1,1,1],1],1],1],1,[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1],1],[1,1,[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],1,[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],1,1],1,1,1],1]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,1],1,1,1],1,1,1],1]],[[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[1,1,[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[[1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1]]],[1,1,1,1],[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1],[1,[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1,[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],1],[[[1,1,1,1],1,1,1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],1],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,[[1,1,1,1],1,1,1],1],1],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],1],[1,1,1,1]]]]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[[[1,1,1,1],1,1,1],1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1],1,1,1],1],1],[1,1,1,1]],[[[[1,[[1,[1,1,1,1],1,1],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1,[[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,[1,1,1,1],1,1],[[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]]],1,[1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],1],[1,1,1,1]]]]],1,[1,[1,[1,[[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1]],[[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,[[1,1,1,1],1,1,[1,1,1,1]],1]],1,[1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]]],1,[[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],1,1]],[[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[[1,[1,1,1,1],1,1],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],1],1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[[1,1,1,1],1,1,1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],1,[1,[[1,1,1,1],1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[[[1,1,1,1],1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],[1,1,1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,1,1],[1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]]],1,[[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,1,1],[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,[[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,1],1]],1,[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1]],[[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,1,1]]]],[[1,1,1,1],1,[[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1],1],[[1,[1,1,1,1],1,1],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,1],1,1],[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1]],[[[1,1,1,1],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]]]]],[[[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,[1,1,1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]]],1,[[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],1,1]],[[1,1,[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],1,[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],1,1,1],1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[1,[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[[1,1,1,1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],[[[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],1,1,1]]],[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1]],[[[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1,1],1,1,1],1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],1],[[1,[1,1,1,1],1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]]],1],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1,1,1],[[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,[1,1,1,1]]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1],1]],1],1,[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1],1],1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],1],1],1],[1,[[1,[1,[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],1,1],1,1],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],1,[1,[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1,1],1,1]],[[1,1,[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],1,[1,[[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[1,[1,1,1,1],1,1]],1,1]],[[[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1]],1,1],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],1],1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]]],1,[[1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],1,1,1],1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1]],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],1,[1,[1,1,1,1],1,1]],[[[[[1,1,1,1],1,[1,1,1,1],1],1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]],1,[[1,[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]]],[[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],1,1,1]]]],[[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]]],1,[1,1,1,[[1,1,1,1],1,1,1]]],[1,1,[1,1,1,1],1],[1,1,[[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1]],1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]]],[[1,1,1,1],[[1,1,1,1],1,1,[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1]],[[1,1,1,[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[1,1,1,1],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,1],1],1],[1,1,[1,[1,1,1,1],[1,1,[1,1,1,[[1,1,1,1],1,1,1]],1],[1,1,1,1]],1]]],[[1,[1,1,[1,[[1,1,[1,1,1,1],1],1,1,1],1,1],1],1,1],[1,1,1,1],[[1,1,[1,1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,1,1]],1],1,[[1,1,[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,[1,1,[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1,1],1]]],[1,1,[1,1,1,[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1]],[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1,1,1]],[1,1,1,1],[1,1,[[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],1],1],[[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],[1,1,[[1,1,1,[1,1,1,1]],1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],1],1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],1,1,1],1],[1,1,1,1]]],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[[1,1,[1,[1,[1,1,1,1],1,1],1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[1,[1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1,1],1,1],[[1,[1,1,1,[1,1,1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1]]],1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1]],[1,[1,1,1,[1,[1,1,1,1],1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1],1],1,1,1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,[[1,[1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],1],1,1],1,1],1,1,1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],1,[[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1,1,1]]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,1,[1,1,[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],1],1],1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,[1,1,[1,1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1],1],1],[1,1,1,1],[[1,[[1,[1,1,1,1],1,1],1,[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1],1,[1,[1,1,1,[1,1,[1,1,1,1],1]],1,1]],[1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],1,[[1,[1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]],1],1,[1,[1,[1,1,1,1],1,1],1,1]],1,1,[[1,1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]]],1,1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]]]],[1,[[1,1,1,1],1,1,1],[1,1,[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,[1,[1,1,1,1],1,1]],1,[1,1,1,1]],1,1],[[[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[1,1,[1,1,1,1],1],1],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],1,1],[[1,1,[1,1,1,1],1],1,1,1]],1,1,1],1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]]],1,[1,[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,[1,1,1,1]],1,1]],[[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,1],[[1,1,[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],1,[[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1,1],[1,1,1,1],1,1]],1,1,[1,1,[1,[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],1,1],1]],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,[1,1,1,[1,1,[1,[1,[1,1,1,1],1,1],1,1],1]],1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1]],1,1,[1,1,[1,1,1,[1,1,1,1]],1]],[1,1,1,1],[[1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]]],1],1,[[1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1],1,1,1]],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1,1,1],1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],1,[1,[1,1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1]],1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,[1,[1,1,[1,1,1,1],1],1,[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,1]],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1]]]],[[[1,1,1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]]],1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]]],1,[1,1,[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,[1,1,[1,1,1,[1,1,1,1]],1],1],1],1],[[1,1,1,1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1,1],[[[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],1,1],1,1,1]]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,[[1,1,1,[1,1,1,1]],1,1,1]],1,1],1],[[1,1,1,1],[1,1,1,1],[1,[[1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1],1,1]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],1,1],[1,1,1,[1,1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1]]]],[[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,[1,1,1,1]]],1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]],1],1,[[[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],1,1],1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[[1,[1,[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1],1,1],1],[[[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[1,1,1,1]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1],1]],1,1],1],1],1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,[1,1,1,1]],1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,[[1,1,1,1],1,1,1],1],1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,[1,[1,1,1,1],1,1]]]],[[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1]],[[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,[1,[1,1,1,1],1,[1,1,1,1]],1],1,1],[[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],1],1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,1],[1,1,1,1]]],[[[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],1,[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1],1],1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1],1,[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[1,1,[[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1,[[1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[1,1,1,1],[1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],1],[1,1,1,[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1]],1],[[[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1,1,[1,1,1,1]],[1,[[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]]],1,[[1,[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,1,1],[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[[1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],1],1,[[[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],1],1],1,[1,1,1,1],1],1]]],[1,[1,1,1,1],1,1]],[[[[1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]],[[1,1,1,1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]]]]],[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,1]]],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[[[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]]],1,[[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]]],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]],1]],1],1],[[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[1,1,1,1]],[1,[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[[1,[[1,[1,1,1,1],1,1],1,1,1],1,1],1,[1,1,1,1],1],1,[1,1,1,1],1],1,1,1]]]],[[[[1,1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,[1,1,[1,1,1,1],1]],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1],[[[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],1,[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],1],[1,[1,[1,1,1,1],[1,1,1,1],1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[1,1,1,1],[1,1,1,1]]],1,[[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],1,[1,1,1,[1,1,[1,1,1,1],1]]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],[1,[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,1]]],1]],[[[1,[1,[1,1,1,1],1,1],1,1],1,1,[[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1],1]],[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,1,1]],1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,1,1],1,[1,1,[1,1,[1,1,1,1],1],1],1]],[1,[1,[1,[1,1,1,1],1,[1,[1,1,[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],1,[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],1,1],[1,[[1,1,1,1],1,1,1],1,1],1]]],1,1],1,1],[[[[1,1,1,1],[1,1,[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],1]],1],1,[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,1],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1,[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[[1,1,1,[1,1,1,1]],1,1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[1,[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,[[1,[[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1]],1],1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],1,1]],[1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]]],[[[1,[1,1,1,[1,1,1,1]],1,1],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],[1,1,1,1],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,[[1,1,1,1],1,1,1]]]],[1,1,[[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],1],1],[[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1],1],1,1,1],1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1]],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,[[1,1,1,1],1,1,1],[1,1,1,1],1]],[[1,[1,1,1,1],1,[1,[1,[1,1,1,1],1,1],1,1]],1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],[[[1,[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,1,1]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1]]],[1,1,[1,1,1,1],1]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],1,1],[1,1,[1,[1,1,1,1],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]]],[1,1,[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]]]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[[1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],1,1],[[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],1]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,1,1,1],1,1],1],1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],1,[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,1,1],1]],[[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,[1,1,1,1],1],1,1,1],1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]]]],[[1,[1,1,[1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]]],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],1,[[1,[[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[1,[1,1,1,[1,1,1,1]],1,1],[[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],1,1]]]],1,[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1],1],1,[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1]],1,[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],1]],1],[1,1,1,1],[[[[[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1]],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],1]],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],[[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],1],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]]],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]],[1,[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],1,[[1,1,1,[1,1,1,1]],1,[1,1,1,1],1]],[[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]]]]],[1,1,[1,1,[[[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1]],1],1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[[1,1,[1,1,1,[1,1,1,1]],1],1,[[[1,1,1,1],1,1,1],1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[1,1,1,1],[[1,1,1,1],1,1,[1,[1,1,1,1],1,1]]]]],[[[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1],[[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[1,[1,[[1,1,1,1],1,1,1],1,1],1,1],1]],[[1,[1,[1,1,[1,1,1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[1,[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],1],[[1,1,1,1],1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]]]],[[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,[1,1,1,1]],1],[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,1]],[1,1,1,1],1]],[1,1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]]]],[[[[[[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],1,1,1],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[[[1,1,1,1],1,1,1],1,1,1],1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],1],[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,[[1,1,1,1],1,1,1],1,1],1]],[1,1,[[1,1,1,1],1,1,1],1],[[1,1,1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],1],[[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]],[[1,1,1,[1,1,1,1]],1,[1,1,[1,1,1,1],1],1],[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],1]]],[[[[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,1,1],[[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1],1,[1,[1,1,[1,1,1,[1,1,[1,1,[1,1,1,1],1],1]],1],1,[[1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,1,1],[[1,1,1,1],1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[[[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,[1,[[1,[1,1,1,[1,1,1,1]],1,[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],1]],[1,[1,[1,1,1,1],1,1],1,[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]]]],1,[1,[[1,1,1,1],[1,1,[1,1,[1,[1,1,1,[1,1,1,1]],1,1],1],[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]]]],1,1]],[[[[[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],[[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]]]],1,[[[1,[[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1],[1,1,1,1],[[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[[1,1,[[1,1,1,1],1,1,1],1],1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,1],1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1]]]],1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1,[[1,[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,[1,[1,1,1,1],[1,[1,1,1,[1,1,[1,1,1,1],1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1]],1],1,[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1]],[1,1,1,1],[[1,1,1,1],[[[[[1,1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,1,1]],1,1,1],1,1,1],1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],1],[[1,1,1,1],[1,1,1,1],1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[[1,1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,1,[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]]],[1,1,[1,[1,1,1,1],1,1],1],[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,1,[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,[1,1,[1,[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1]],1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,[[1,1,1,1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1]],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1],[1,1,1,1],1],[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,[1,1,[1,1,1,1],1]],1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1]],[1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],[1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,1,1],1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,[1,1,[[1,1,1,1],1,1,1],1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]]]]]]],[1,[1,[[1,1,1,[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,[1,[1,1,1,1],1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[[1,1,1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,[1,1,[1,1,1,1],1],1,1],1]]]],1,[1,[[1,[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[1,1,1,1]],1,[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,[[1,1,1,1],[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[[[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[[[[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1]],1,1,1],1,1,1],1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1]],[1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]]],[[[[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1],1]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,[[1,1,1,[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1]],[[1,1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1,1],1],1,1],1]]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],1],[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,[1,[[1,1,1,1],1,1,1],1,1],1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[[1,[1,1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,1]],1,1]],[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,[1,1,1,[1,1,1,1]],1],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]]]],[[[[[1,1,1,1],1,[1,1,1,1],1],[[[1,1,[1,1,1,1],1],1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,[[1,1,1,1],1,1,1],1,1],1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]]],[[[[1,[1,1,1,[1,1,1,1]],1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[[1,1,1,1],1,1,1],1]],[[1,[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,1,1],1,1]],[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,[1,1,1,1],1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,[1,1,1,1]],1]],1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[[1,1,1,1],1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1]]],[[[1,1,1,[1,1,1,1]],1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1],[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1]],[[[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1,1]],[1,1,1,1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[1,1,1,1],1]],[[[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[[1,[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1],1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[[1,1,1,[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],1,1,1],1,1,1],1]],[[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[1,1,1,1]]]],1,[1,[1,[1,1,1,1],1,1],1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],1]],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1]],[[[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,[1,1,1,[1,1,1,1]],1],1,[1,1,1,1],[1,1,1,1]]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[[1,1,1,[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],1],1],1,1],[[1,1,1,1],1,1,1]],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],1,1,1]]],[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1]]]],[1,1,[[1,1,1,1],1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1]],1,[[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1,1],1,1,1],1]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,[[1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1],[1,1,[1,1,[1,1,1,1],1],1]],1,[1,[[1,[1,1,1,1],1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1]]],[1,1,[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],1],1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1]],[[[[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]]]]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[[[[1,1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],1,1,1],1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,[1,1,1,[1,1,[1,1,1,[1,1,1,1]],1]]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[[1,1,[1,1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1]],1],1,[[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1,1,1],1,1],1,1,1],1],1,1,1]],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],[[[1,1,[1,1,[1,1,[1,1,1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],1,1],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],1,1,1],1,1],1,1,1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],1,1],1],1,1,1]]],[[[[[1,1,[[1,1,1,1],1,[1,1,1,[1,[1,1,1,1],1,1]],[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],[1,1,1,1]]],[1,1,[1,1,[[1,1,1,1],1,1,1],1],1]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1,1,1]]],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[1,1,[[1,1,[1,[1,1,1,1],1,1],[[1,1,[[1,1,1,1],[1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],1],1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,[1,1,1,1]]],1,1,1],1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],1],1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,[1,[1,1,[1,1,1,1],1],1,[1,[[1,1,1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[1,1,[1,1,1,[1,1,1,1]],1]],1,[1,[1,[[1,1,1,1],1,1,1],1,1],1,1]]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,1],[1,1,1,1],[1,1,1,[1,1,1,[[1,1,1,1],1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,1],1],1,[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1]]],1,[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],1],1],1]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1],1]]],[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1]],[[[[1,1,1,1],1,1,1],1,1,1],1,1,1],[[1,1,1,1],1,1,1],1]]],1,[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]]]],[[[[1,1,1,1],1,[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,[1,[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],1],1,1,1],1],1,1],1],[1,1,1,1],1],1],1,[[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1],1],[[[1,[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,[[1,1,1,1],1,1,1]],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1]]]],[[1,1,[1,1,1,1],1],1,[[1,1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1],1,[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],1],1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,[1,1,1,1],1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,[1,1,[1,1,1,[1,1,1,1]],1],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],1],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1]],1],[[1,1,1,1],1,1,[[1,1,1,1],1,1,1]],[[[[[[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]],1,1],[[[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1,1],1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],1]],1,1],[[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,1,[1,1,1,1],1],1,1,1],1],1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,[[1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],1,[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1]]]],[[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,1]],[1,1,1,1],[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[1,[[1,1,1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],1,[[1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,1],1]],[1,[1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]]]],[[[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1,[1,1,[1,1,1,1],1],1],1,[1,[1,1,[1,1,1,1],1],[1,1,[[1,1,1,1],1,1,1],1],1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1]],[[[[[1,[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],1]],1]],[1,1,1,1]],[1,1,[1,[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1],1,1],1]],[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,[[1,1,1,[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]]],[[1,1,1,1],1,[[[1,[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],1],1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],1],1,[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,[1,[1,1,1,1],1,1],1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[[1,[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],1,[1,[[[[1,1,1,1],1,[1,1,1,1],1],1,1,1],1,1,1],1,1]],[[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,1,1],1,1],[[[1,[1,1,1,[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],1,1]],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[1,[1,1,1,[[1,1,[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],1,1],[1,1,[1,1,1,1],1],1]]],[[[[1,1,1,1],[1,1,1,[1,[1,[1,[1,[[1,1,1,[1,1,1,1]],1,1,1],1,1],1,1],1,1],1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,[1,1,1,[1,1,1,[[1,1,1,1],1,[1,1,1,1],[[1,1,1,1],1,1,1]]]],[1,1,[1,[1,1,1,1],1,[[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,[1,1,1,1],1],1,1,1]]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[1,[[1,[1,1,[1,1,1,[1,1,[[1,1,1,1],1,1,1],1]],1],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],1]],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]],[1,[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],1,[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]]],[[[[1,1,1,1],1,1,1],1,[[1,1,1,1],1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[[[1,1,1,1],1,1,1],1,1,1]]],[1,1,[1,1,1,1],1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]],[[1,[[1,1,1,1],1,1,1],1,1],1,1,[1,1,[1,1,1,[1,[[1,1,1,1],1,1,1],1,1]],[1,1,1,1]]],[[1,[1,1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1]],[[1,1,[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1],1,1,1]]],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[1,1,1,1],[1,1,1,1]]]],[[[[[1,[[1,1,1,1],1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],[1,1,1,1]],1],1,[1,1,1,1],1],[[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],1],[[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],[[1,1,[1,1,[1,1,1,1],1],1],1,[1,1,1,1],1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,[1,1,1,1],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,1,[1,[[1,1,1,1],1,[1,1,1,1],1],1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,[1,[1,[1,1,1,1],1,1],1,1],1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],1,[1,1,1,1],[1,[1,1,1,1],1,1]],1,[1,[1,1,1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,1],[1,[1,1,1,1],1,1]],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1],1],1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]]],[1,[[1,[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]],[[[[1,1,[1,1,1,[1,1,1,1]],1],1,[1,1,1,1],1],1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,1,1,1],[1,[[[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,[1,1,1,1],1],[1,[1,1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[1,1,1,1],1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],[1,1,1,1],1]]],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1]],1,1]],[[[1,[[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[1,1,1,1],[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,[1,1,1,1],1]]],[1,1,1,1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]]]]],[[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],1],[[[1,1,1,1],1,1,1],1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]],[1,1,1,1]],[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,[1,1,[1,1,1,1],[1,1,1,1]],1,1],[[1,1,[1,1,1,1],1],1,1,1]],[1,1,[1,1,1,1],1]],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],1],[[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],1,1,1],1,[1,1,1,[1,1,[1,1,1,1],1]],1]]],[[[1,[[1,1,1,1],1,1,1],1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,[1,1,1,1]],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,[1,1,1,1],1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1],[1,[1,1,1,1],1,1]],[[1,[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],[1,1,1,1],1],1],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],1],1],1],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],1]],[[[[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],1],1,[[[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1,1],1],1,1,1],1,1,1]]],[[[1,1,[1,1,1,1],1],1,1,1],[1,[1,[1,1,1,1],1,[[[[1,1,[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,1],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1]],1,1,1],1,1,1],[[1,1,[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1]],1,1]],1,1],1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,[1,1,1,1],1,1],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,[[1,[1,1,1,1],1,[1,1,1,1]],1,1,1]]],1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],1,1],[[[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[1,1,1,1],1],1,1,1],1,1,1],1,1],1]],[[[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,1],[1,1,1,1],[[[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],1],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]]],1,[[1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],[1,1,1,[[1,1,1,1],[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,1,1,1],1,1,1]]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,[[1,1,1,1],1,1,1],1]],[1,1,1,[1,1,1,[[1,[1,1,[1,1,1,[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[1,1,1,[1,1,1,1]],1,[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]]]],1,[[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,1,1],1],1],[[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],1,[[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[[[1,1,1,1],1,1,1],1,1,1],[1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]],[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]]]]]],[[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],1],1,[[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,[1,1,1,1],1],[[1,[1,[1,1,1,1],1,1],1,1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1]],1],[1,[1,[[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],1],[[1,1,1,1],1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1]],1,1],1,1],1,1],[[[[1,1,[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[[1,1,1,1],[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,1,1],1,1],1,1,1]]]]],[1,1,[1,1,[[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]],[1,1,[1,1,1,1],1],1,1],1],[1,1,[1,[[1,1,[[1,1,1,1],1,1,1],1],1,1,1],1,1],1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,[1,1,1,[[1,1,1,1],1,1,1]],1,1],[1,1,1,1],1,1],1],1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,[1,[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,[[1,1,1,1],1,1,1]],1,[1,1,1,1]],[1,1,1,1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]]],1,[1,1,1,1]],1,1],[[[[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],1],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],[1,1,1,1]]],[[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,[1,1,1,1],1],[1,1,1,1]],1,[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[[[1,1,[1,1,1,1],1],1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[[1,1,1,[1,1,1,1]],1,1,1]]],[[1,1,1,1],1,1,1]]],[[1,[1,[1,[1,1,1,1],1,[1,1,[1,1,1,1],1]],1,[1,[1,1,1,1],1,1]],[1,1,1,[1,1,[1,1,1,1],1]],1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1],1,1,1],1],[1,[[1,1,1,1],[[1,1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],1,[1,1,1,1]]]]],[1,[[1,1,1,1],1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,1,1],[1,[1,[1,1,1,1],1,1],1,1]]],1,[1,[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1]],1,1]],1,1],[[[[1,1,[[1,1,[1,1,[[1,1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],1],1],1],[1,1,1,1],[[[[1,1,[1,1,1,1],1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1]],[1,1,1,1],[[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,1]]],[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,1]],1,1],[[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1]],[[[1,1,1,1],1,1,1],1,1,1],1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[1,1,1,1]],[[[[1,1,1,1],1,1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1]]],[1,[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,1]],1,1],[[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1],1,[1,1,1,1]]],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1]]]],1,1]],[1,[[[1,1,1,[1,[1,1,1,1],1,1]],1,1,1],1,1,1],1,1],[1,1,1,1]],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,[1,1,1,1],1],[1,1,[[1,1,1,1],1,[1,[1,1,1,1],1,1],1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[1,1,1,1],[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,[1,1,1,1],[1,1,1,[1,1,1,1]],1],1,[[1,1,1,1],1,1,1]],1,1],[[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1],1],1,1,1]],[[1,[[1,1,1,1],1,[[1,1,1,1],1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,[[1,1,1,1],1,1,1]],1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,1],[[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,[1,1,1,[[1,1,1,1],[1,1,1,1],1,1]],1,[1,1,1,[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,1,1],1,[1,1,[1,[1,1,1,1],1,1],1],1],[[1,[1,[1,1,1,1],1,1],1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],1],[1,1,1,1]]]],[[[1,1,1,1],1,[[[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,1,1]],1],1,[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,[1,1,1,1],1,1]]]],[1,1,[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[1,[1,[1,[1,[1,1,1,1],1,[[1,1,1,[1,1,1,[1,[1,1,1,1],1,[1,1,1,1]]]],[1,1,[1,1,[[1,1,1,1],1,[1,1,1,1],1],1],1],[[1,1,1,[[1,1,1,1],1,1,[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1],[[[1,1,1,1],1,1,[1,1,1,1]],1,1,1]]],1,[1,[[[1,[1,[1,1,1,1],1,1],1,1],1,1,1],1,1,1],1,1]],1,1],1,1],[[[[[1,1,1,1],1,1,1],1,1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1,1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],1,1],1,1]],[[1,[[[1,1,1,1],1,1,1],1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]]],[1,1,[1,1,1,1],[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,[1,1,1,1],1]],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],1,1],1,[1,[1,[1,1,1,1],1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],[1,[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],[1,1,1,1],1],1,1,1]]]]],[[[1,1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],1,[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],1],[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,[1,1,1,1]],[1,1,1,1],1,1],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,[1,1,1,1],1,1],1,1,1],1],1,1]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[[1,1,1,1],1,1,1]],1,[1,[1,1,1,1],1,1]],[[[1,1,1,1],1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[1,1,1,1],[1,1,[[1,1,1,1],[1,1,1,1],1,1],1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],1,[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,[1,[1,1,1,1],1,1],1,1]],[1,1,1,1],1,1],[[[[[1,1,1,1],1,1,1],1,1,[1,1,1,1]],1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,[1,1,1,[1,1,1,1]],[1,1,1,[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],1,1,1],1,1],1],1],[[1,1,1,[[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1]],[[[1,[1,1,1,1],1,1],1,1,1],[1,[1,1,[1,1,1,1],1],1,[1,1,1,1]],1,1],1,1]],[1,[1,1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,[1,1,[1,1,1,1],[[1,1,1,1],1,1,1]]],[1,[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1]],[[1,1,[[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,[1,1,[1,1,[1,1,1,1],1],1],1],[1,1,1,1],[[1,1,1,1],1,1,1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,1,1,1],[[[[1,[1,1,[1,[1,1,1,1],1,1],1],1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],[1,[1,1,1,1],1,1],1],[1,[[1,1,1,1],1,1,1],1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[[1,1,1,[1,[1,1,[1,1,1,1],1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1]]]],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[[1,1,1,[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,1]]]],[[[1,[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,[1,1,1,1],1,1],1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],1,[[[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],1,1]],1,1]],[[[1,1,1,1],1,[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1],1],1,1],[1,[1,[[1,1,1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],1,1],1,1]]],[[[[[[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,[1,1,1,1],[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],[1,1,[[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],1],[1,1,1,1],1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,[1,1,[1,1,1,1],1]],[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,[[1,1,1,1],1,1,1],1],[1,1,[1,1,1,1],1]]],[[1,1,[1,1,[1,1,[[1,1,1,1],1,1,1],1],1],1],1,[[[[1,1,1,1],1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[1,[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],[1,1,1,1]],[1,1,1,[1,1,1,[1,1,1,1]]]],1,1],[[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]],1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],1]],[1,[1,1,1,1],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],1,[1,1,1,1]],1,[1,1,1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],[[[1,1,1,1],1,1,1],[[1,1,1,1],[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,1,1,1],[1,[1,1,1,1],1,1]]],[1,1,[[1,1,[1,1,[1,1,1,[1,1,[1,1,1,1],[1,1,1,1]]],1],1],1,[[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[[1,1,1,1],1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[1,[1,1,1,1],1,1],[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[[1,1,[1,1,1,1],1],1,1,1],1]],1]],[[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1],[1,1,1,1],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,[1,1,1,1]],1,1],[[1,1,1,[1,1,1,1]],1,1,[1,1,1,[1,1,1,[1,1,1,1]]]],[1,1,1,1]]],[1,1,1,[1,[1,1,1,1],1,1]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,1,1],1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,[1,1,1,1]],[[[[1,1,1,1],1,1,1],1,1,[1,[1,1,1,[1,1,1,1]],1,1]],[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],[1,[1,1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,1],1,1,1]]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,[1,1,1,1]]]]],[1,1,[[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]]],1,[[1,1,1,1],[[1,1,1,1],[[1,1,1,1],1,1,1],[[1,1,1,1],1,1,1],[1,1,[1,1,1,1],1]],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1]]],1],1],[[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],[1,[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[1,1,1,1]],[1,[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]]]],[[[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,[1,1,1,[1,1,1,1]],1,1],[[[1,1,1,1],1,[1,1,1,1],1],1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,1,[1,1,1,1],1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],1,[[1,1,1,1],1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1],1,[[1,[1,[1,1,[1,1,1,1],1],1,1],1,[1,1,1,1]],1,1,[[1,1,1,1],1,1,1]],1],1],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],1,1,1],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,[1,1,1,1],1],1],1]],1,[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],1,1,1]]],1,[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[[1,1,1,1],1,1,1],1]],1],1]],[[[[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,[1,1,1,1]]],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[[1,1,1,1],[1,1,[1,1,1,1],1],1,1],[1,1,1,1],1,[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,[1,1,1,1]],[1,1,[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1]],1],[1,[1,1,1,1],1,1],[[[[1,[1,1,1,[1,[1,1,1,1],1,1]],1,[1,[1,1,1,1],1,1]],[[1,1,[1,1,1,1],1],1,[[[1,1,1,1],1,1,1],1,1,1],1],[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,1,1],1],[1,1,1,1],[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,1,1]]],[[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,[1,1,1,1],1],1],1]],[1,1,[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[1,[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1]],[1,[1,1,1,1],1,[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,[1,1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,[1,1,1,1]],1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]]]],[1,[1,[1,1,1,[1,1,1,1]],1,1],1,1],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,[1,1,1,1],1]],[[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,[1,1,1,1]]]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,[1,1,1,1],1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,1]],[[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1]],[[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,[1,[1,1,1,1],1,1],[1,1,1,1],[[1,1,1,1],1,1,1]],[1,[1,1,1,1],1,[[1,1,1,1],1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[[[1,1,1,1],[1,1,[1,1,[1,1,1,1],1],1],[1,[1,[1,[1,1,1,1],1,1],1,1],1,1],[[[[1,1,1,1],1,1,[1,1,1,1]],[1,1,[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,[1,1,1,1],1],1,1,1]]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,1,[1,1,1,1],1],[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1]],[1,[1,1,1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]]],1,[[1,1,[1,1,1,[1,1,1,1]],1],1,[[1,[1,1,1,1],1,1],1,1,[1,1,1,[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,1,1]],1]]]],[[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1]],[[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,[[1,1,1,1],1,1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],[[1,1,1,1],[1,1,1,1],1,1],1,1]],[[[[1,1,1,1],1,[1,1,[1,1,1,[1,1,1,1]],1],1],1,[[[1,[1,1,1,1],1,1],[1,1,1,1],1,1],1,1,1],1],1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]]],[[[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],1,[[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,[1,1,1,1]],[[1,1,[1,1,1,1],1],1,[1,1,1,1],1],[1,1,1,1],1],1,[[1,1,1,1],1,1,1],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],1,[1,1,1,1],1]],1]],[[[[[1,1,1,1],[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],1,[[[1,1,1,1],1,1,[1,1,1,1]],1,1,1],1],1,1,1],1,1,1],[[[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1]],1],[[[1,1,[1,1,1,1],1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],1,1]],[[[[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]],[1,1,1,1]],[[1,1,1,1],1,[[1,1,1,1],1,[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[[1,1,1,1],1,1,1]],1,1,1],[[[1,1,1,1],1,1,1],[1,1,[1,1,[1,1,1,1],1],1],1,[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],1,[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],1]],1],1]],[[1,[1,[[[1,1,1,1],1,1,1],1,1,1],1,1],1,1],1,1,[[1,1,1,[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,1,1],1,[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],1,1,[[1,1,1,1],[1,1,1,1],1,1]]],1,[1,[1,[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,[1,1,1,1],1,1]]]],[1,1,[1,1,[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,1,1],1,[1,1,1,1],1],[[1,1,1,1],1,1,1]],1],1],[1,1,1,[1,[1,[1,[1,1,[1,1,1,1],1],1,1],1,1],[1,1,1,[1,1,1,1]],[1,1,1,[1,1,[1,[1,1,1,1],1,1],1]]]],[[[[[1,1,1,[1,1,1,1]],[1,1,[1,1,[1,1,[1,[1,1,1,1],1,1],1],1],1],[1,[1,1,1,1],1,1],[[1,[1,1,1,1],1,1],[1,1,1,1],1,1]],[1,[1,1,1,1],[1,1,1,1],1],[1,[1,1,1,1],1,1],[1,1,1,1]],[[1,1,1,1],1,[1,1,[1,1,1,1],[1,1,1,1]],1],[[1,[1,1,1,1],1,[1,1,1,1]],[[1,[1,1,1,1],1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[[1,[1,1,1,1],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1],[1,1,1,1]]],[1,1,[1,1,[1,1,1,1],[1,1,[1,1,1,1],1]],1],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[1,[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],[1,[1,1,1,[1,1,1,[1,1,1,1]]],1,[1,1,1,1]],[[1,1,1,1],1,[1,1,1,1],1]],[[[1,1,1,1],1,1,1],1,1,1]]]]],[[1,1,1,1],1,1,1],[[[1,[1,[[1,[1,[1,1,1,1],1,1],1,1],[[[1,1,1,1],[1,1,1,1],1,[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],1,1],[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,[1,[1,1,1,1],1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,[1,1,1,1]]]],1,[[1,[1,1,1,1],1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],1,1],[1,[1,1,1,1],1,1],[1,[1,1,1,1],1,[1,1,1,1]]]],1,[1,[1,[[1,1,1,[1,1,1,1]],[1,1,[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],1,1]],1,1],1,1]],1,1],[[[[[[1,1,[1,1,1,[1,1,1,1]],[1,1,1,1]],[1,1,1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,[1,1,1,1]],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,[1,[1,[1,1,1,1],1,1],1,[1,1,1,[1,1,1,1]]],1,[1,[1,[1,1,1,1],1,[1,1,1,1]],1,1]],[[[[1,1,1,1],1,[1,1,1,1],1],1,[[1,1,[1,1,1,1],1],1,[1,1,[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1]],[[1,1,1,1],1,[1,1,1,1],1]],1,[[[[1,1,1,1],[1,1,1,1],1,1],[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1]],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1],[[1,1,1,1],1,1,1]],1]],[[1,1,1,1],1,1,1]],[[1,1,1,1],[1,1,1,1],[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1],[[1,1,1,1],[1,1,1,1],1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,[1,1,1,1],1,1]],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1],[[[1,1,1,1],1,[1,1,1,1],1],[1,1,1,[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[1,1,[1,1,1,1],[1,1,1,1]],[1,1,1,1],[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],1,1,1],[1,1,1,1],[1,1,1,1],1]]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1,[[1,1,1,1],[1,1,1,1],[1,1,1,1],1],1]],1,[[[1,[1,1,1,1],[1,1,1,1],[1,1,1,1]],[[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],1,[1,1,1,1],1],[1,1,1,1],1],[[[1,[1,1,1,1],1,1],1,1,1],1,1,1],1,1],1],1,1,1],1,1],[[1,[1,1,1,[1,1,1,[1,1,[1,1,1,1],1]]],1,[1,[[1,[[1,1,1,1],1,[1,1,1,1],1],[1,[1,1,1,[1,1,1,1]],1,[[1,[1,1,1,1],1,1],1,1,[1,1,1,1]]],[[1,1,1,1],1,1,1]],[1,1,1,1],[1,[[1,1,1,1],1,1,1],1,1],[1,[1,1,[1,1,1,1],1],[1,1,1,1],[1,1,[1,1,1,1],1]]],1,[1,[[[1,1,1,[1,1,1,1]],1,1,1],1,1,1],1,1]]],[[[1,1,1,[1,[1,1,1,1],1,1]],[[1,[1,[1,1,1,1],1,1],1,1],[[1,1,[1,[1,1,1,1],1,1],1],[[1,1,1,1],[1,1,1,[1,1,1,1]],1,[1,1,1,1]],1,[1,1,1,1]],[1,1,1,1],[1,1,1,1]],[[1,1,1,1],[1,1,1,1],[1,1,[1,1,1,1],1],[1,[1,1,1,1],1,1]],[[1,[1,1,[1,1,1,[1,1,1,1]],[1,1,[1,1,[[[1,1,1,1],1,1,1],1,1,1],1],1]],1,[1,[1,1,1,1],1,1]],1,1,1]],[[[[1,[1,1,[1,1,1,1],1],1,[[[1,1,1,[[1,1,[1,1,1,1],1],1,1,1]],1,1,1],1,1,1]],[1,1,1,1],1,1],1,1,1],1,1,1],[[[1,1,1,[1,1,1,1]],[1,1,[1,[1,1,1,1],[1,[1,1,1,1],1,1],[1,1,1,1]],1],[[1,1,1,1],[1,1,1,1],1,1],1],1,1,1],1],[1,[1,[1,1,[1,1,[1,1,1,1],1],1],1,1],[1,1,[[1,1,1,[1,[1,[1,1,1,1],1,1],1,1]],1,1,1],1],1],[1,1,1,1]],[1,1,1,1],[1,1,1,1]]],[[1,1,1,1],1,1,1],[1,[1,[1,1,1,1],1,1],1,1]]]} \ No newline at end of file diff --git a/test/js/source/tile_pyramid.test.js b/test/js/source/tile_pyramid.test.js index b81b6de5977..4bd80fdb722 100644 --- a/test/js/source/tile_pyramid.test.js +++ b/test/js/source/tile_pyramid.test.js @@ -7,6 +7,8 @@ var Transform = require('../../../js/geo/transform'); var LngLat = require('../../../js/geo/lng_lat'); var Coordinate = require('../../../js/geo/coordinate'); var util = require('../../../js/util/util'); +var path = require('path'); +var fs = require('fs'); test('TilePyramid#coveringTiles', function(t) { var pyramid = new TilePyramid({ @@ -373,6 +375,25 @@ test('TilePyramid#clearTiles', function(t) { }); }); +test('TilePyramid#indexSearch', function(t) { + t.test('finds the covering tile for a missing tile in an index index', function(t) { + var coord1 = TileCoord.fromID(53542); + var coord2 = TileCoord.fromID(47430); + + var pyramid = createPyramid({ + index: JSON.parse(fs.readFileSync(path.join(__dirname, '../../fixtures/index.json')).toString()).index + }); + + var tile1 = pyramid.addTile(coord1); + t.equal(tile1.parentId, 3140); + + var tile2 = pyramid.addTile(coord2); + t.equal(tile2.parentId, false); + + t.end(); + }); +}); + test('TilePyramid#tilesIn', function (t) { var transform = new Transform(); transform.width = 511; From a3b3371dde1873b4301755068f4c759f3c348a93 Mon Sep 17 00:00:00 2001 From: chelm Date: Mon, 20 Jul 2015 11:44:01 -0600 Subject: [PATCH 17/27] better pyramid creation when using an index --- js/source/source.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/js/source/source.js b/js/source/source.js index 371d8593d3c..5fec2d888f4 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -9,6 +9,24 @@ var normalizeURL = require('../util/mapbox').normalizeSourceURL; exports._loadTileJSON = function(options) { + var buildPyramid = function (index) { + this._pyramid = new TilePyramid({ + index: index, + tileSize: this.tileSize, + cacheSize: 20, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + roundZoom: this.roundZoom, + reparseOverscaled: this.reparseOverscaled, + load: this._loadTile.bind(this), + abort: this._abortTile.bind(this), + unload: this._unloadTile.bind(this), + add: this._addTile.bind(this), + remove: this._removeTile.bind(this), + redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined + }); + }.bind(this); + var loaded = function(err, tileJSON) { if (err) { this.fire('error', {error: err}); @@ -26,34 +44,16 @@ exports._loadTileJSON = function(options) { return; } - buildPyramid(null, index); + buildPyramid(index.index); this.fire('load'); }.bind(this)); } else { - buildPyramid(null, {}); + buildPyramid({}); this.fire('load'); } }.bind(this); - - var buildPyramid = function (err, index) { - this._pyramid = new TilePyramid({ - index: index.index, - tileSize: this.tileSize, - cacheSize: 20, - minzoom: this.minzoom, - maxzoom: this.maxzoom, - roundZoom: this.roundZoom, - reparseOverscaled: this.reparseOverscaled, - load: this._loadTile.bind(this), - abort: this._abortTile.bind(this), - unload: this._unloadTile.bind(this), - add: this._addTile.bind(this), - remove: this._removeTile.bind(this), - redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined - }); - }.bind(this); if (options.url) { ajax.getJSON(normalizeURL(options.url), loaded); From b7fd5d7f6e1e05e2496f624001a71498a2674b30 Mon Sep 17 00:00:00 2001 From: chelm Date: Mon, 20 Jul 2015 11:45:04 -0600 Subject: [PATCH 18/27] a bit cleaner indexSearch function --- js/source/tile_pyramid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index 7eed2b098f3..021322ecac0 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -422,8 +422,8 @@ TilePyramid.prototype = { } } } - return (id !== cursorId) ? cursorId : false; } + }; From a94d882b97906079139530126f71809e85e90b17 Mon Sep 17 00:00:00 2001 From: James Cardona Date: Wed, 16 Sep 2015 18:26:29 -0400 Subject: [PATCH 19/27] do not add empty object as parameter to buildPyramid if there is not an index --- js/source/source.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/source/source.js b/js/source/source.js index 5fec2d888f4..e2ba0355ae4 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -49,7 +49,7 @@ exports._loadTileJSON = function(options) { }.bind(this)); } else { - buildPyramid({}); + buildPyramid(); this.fire('load'); } From 8362c6d62acfc2b8f4bedf1489ecf2ee0bfa8b55 Mon Sep 17 00:00:00 2001 From: James Cardona Date: Thu, 17 Sep 2015 14:25:00 -0400 Subject: [PATCH 20/27] check for null lines --- js/data/symbol_bucket.js | 3 +++ js/symbol/mergelines.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/js/data/symbol_bucket.js b/js/data/symbol_bucket.js index 3196d5dea2e..11615b3df62 100644 --- a/js/data/symbol_bucket.js +++ b/js/data/symbol_bucket.js @@ -159,6 +159,9 @@ SymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon) { for (var i = 0; i < lines.length; i++) { var line = lines[i]; + if(line.length === 0){ + continue; + } // Calculate the anchor points around which you want to place labels var anchors = isLine ? diff --git a/js/symbol/mergelines.js b/js/symbol/mergelines.js index 0ab9c467e1d..16cc5f747e1 100644 --- a/js/symbol/mergelines.js +++ b/js/symbol/mergelines.js @@ -38,6 +38,7 @@ module.exports = function (features, textFeatures, geometries) { } function getKey(text, geom, onRight) { + if (!geom || geom.length === 0 || !geom[0] || geom[0].length === 0) return; var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return text + ':' + point.x + ':' + point.y; } @@ -53,6 +54,7 @@ module.exports = function (features, textFeatures, geometries) { var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); + if (!leftKey || !rightKey) continue; if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three From 4a854bef51399487012c9ab77984a4eaba8ecf7d Mon Sep 17 00:00:00 2001 From: James Cardona Date: Thu, 17 Sep 2015 20:35:35 -0400 Subject: [PATCH 21/27] fix index search to return correct tile id --- js/source/source.js | 2 ++ js/source/tile_pyramid.js | 33 ++++++++++++++++----------------- js/source/worker.js | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/js/source/source.js b/js/source/source.js index e2ba0355ae4..f0eadcb9d16 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -81,6 +81,8 @@ exports._renderTiles = function(layers, painter) { // so calculate the matrix the maxzoom tile would use. z = Math.min(z, this.maxzoom); + tile.tileExtent = 4096; + x += w * (1 << z); tile.calculateMatrices(z, x, y, painter.transform, painter); diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index 021322ecac0..c2fa1f7a214 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -379,7 +379,7 @@ TilePyramid.prototype = { return result; }, - + /** * For a given tile id find its parent tile from the index * @param {string|number} id tile id @@ -393,9 +393,9 @@ TilePyramid.prototype = { var parentTile = tile; while (id !== 0) { - parentTile = parentTile.parent(); - id = parentTile.id; - ids.push(id); + parentTile = parentTile.parent(); + id = parentTile.id; + ids.push(id); } var cursor = this.index, @@ -403,7 +403,7 @@ TilePyramid.prototype = { index; var pluckId = function (coord) { - return coord.id; + return coord.id; }; while (ids.length) { @@ -411,19 +411,18 @@ TilePyramid.prototype = { tile = TileCoord.fromID(cursorId); index = tile.children(this.maxzoom).map(pluckId).indexOf(id); if (cursor) { - if (cursor[index] === 0) { - id = cursorId; - break; - } else if (cursor[index] === 1) { - break; - } else { - cursorId = id; - cursor = cursor[index]; - } + if (cursor[index] === 0) { + id = cursorId; + break; + } else if (cursor[index] === 1) { + cursorId = id; + break; + } else { + cursorId = id; + cursor = cursor[index]; + } } } - return (id !== cursorId) ? cursorId : false; + return cursorId; } - - }; diff --git a/js/source/worker.js b/js/source/worker.js index cebfe761c19..cac0faecad3 100644 --- a/js/source/worker.js +++ b/js/source/worker.js @@ -52,7 +52,7 @@ util.extend(Worker.prototype, { // if a parentTile is defined it means the index is missing a tile for this coord // here the difference between the requested tile and its indexed parent is found // we pass the dz, x/y pos of the tile's relationship to its parent - if (params.parentId && tile.data.layers) { + if (params.parentId !== params.coord.id && tile.data.layers) { var tilePos = TileCoord.fromID(params.coord.id); var parentPos = TileCoord.fromID(params.parentId); var dz = tilePos.z - parentPos.z; From c5f91bdb83d5f07f3177c01154981db6ee05ecb0 Mon Sep 17 00:00:00 2001 From: marc4025 Date: Fri, 18 Sep 2015 13:53:29 -0700 Subject: [PATCH 22/27] only update tileExtent for clipped tiles --- js/source/source.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/source/source.js b/js/source/source.js index f0eadcb9d16..1af02f2bd48 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -81,7 +81,9 @@ exports._renderTiles = function(layers, painter) { // so calculate the matrix the maxzoom tile would use. z = Math.min(z, this.maxzoom); - tile.tileExtent = 4096; + // clipped tiles always use 4096 + if (tile.parentId !== tile.coord.id) + tile.tileExtent = 4096; x += w * (1 << z); tile.calculateMatrices(z, x, y, painter.transform, painter); From fa0e42ae4300725f037c645ba5f5b9c53f77371e Mon Sep 17 00:00:00 2001 From: marc4025 Date: Fri, 18 Sep 2015 13:54:35 -0700 Subject: [PATCH 23/27] account for coord.w --- js/source/tile_pyramid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index c2fa1f7a214..11e5832845e 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -392,7 +392,7 @@ TilePyramid.prototype = { var ids = []; var parentTile = tile; - while (id !== 0) { + while (id % 32 !== 0) { parentTile = parentTile.parent(); id = parentTile.id; ids.push(id); From 64b09169b5419e6168c196bd735a5ea287436691 Mon Sep 17 00:00:00 2001 From: marc4025 Date: Fri, 18 Sep 2015 15:00:36 -0700 Subject: [PATCH 24/27] modify tests for null geometries --- js/data/line_bucket.js | 4 +++- js/data/symbol_bucket.js | 3 --- js/symbol/mergelines.js | 5 +++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/data/line_bucket.js b/js/data/line_bucket.js index f6e075738be..266eeb0a46c 100644 --- a/js/data/line_bucket.js +++ b/js/data/line_bucket.js @@ -18,7 +18,9 @@ LineBucket.prototype.addFeatures = function() { var features = this.features; for (var i = 0; i < features.length; i++) { var feature = features[i]; - this.addFeature(feature.loadGeometry()); + var geom = feature.loadGeometry(); + if (geom) + this.addFeature(geom); } }; diff --git a/js/data/symbol_bucket.js b/js/data/symbol_bucket.js index 11615b3df62..3196d5dea2e 100644 --- a/js/data/symbol_bucket.js +++ b/js/data/symbol_bucket.js @@ -159,9 +159,6 @@ SymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon) { for (var i = 0; i < lines.length; i++) { var line = lines[i]; - if(line.length === 0){ - continue; - } // Calculate the anchor points around which you want to place labels var anchors = isLine ? diff --git a/js/symbol/mergelines.js b/js/symbol/mergelines.js index 16cc5f747e1..7882836d4f1 100644 --- a/js/symbol/mergelines.js +++ b/js/symbol/mergelines.js @@ -38,7 +38,6 @@ module.exports = function (features, textFeatures, geometries) { } function getKey(text, geom, onRight) { - if (!geom || geom.length === 0 || !geom[0] || geom[0].length === 0) return; var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return text + ':' + point.x + ':' + point.y; } @@ -47,6 +46,9 @@ module.exports = function (features, textFeatures, geometries) { var geom = geometries[k], text = textFeatures[k]; + if (!geom) + continue; + if (!text) { add(k); continue; @@ -54,7 +56,6 @@ module.exports = function (features, textFeatures, geometries) { var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); - if (!leftKey || !rightKey) continue; if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three From bc547958a67732f1a56daf410f918bbdf9762f9f Mon Sep 17 00:00:00 2001 From: marc4025 Date: Mon, 21 Sep 2015 11:12:37 -0700 Subject: [PATCH 25/27] fixed parentId and tileExtent>4096 --- js/source/source.js | 4 ++-- js/source/tile_pyramid.js | 13 ++++++++----- js/source/worker.js | 4 ++-- js/source/worker_tile.js | 5 +++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/js/source/source.js b/js/source/source.js index 1af02f2bd48..452b5526133 100644 --- a/js/source/source.js +++ b/js/source/source.js @@ -81,8 +81,8 @@ exports._renderTiles = function(layers, painter) { // so calculate the matrix the maxzoom tile would use. z = Math.min(z, this.maxzoom); - // clipped tiles always use 4096 - if (tile.parentId !== tile.coord.id) + // leaf tiles and clipped tiles always use 4096 + if (tile.tileExtent > 4096 || tile.parentId) tile.tileExtent = 4096; x += w * (1 << z); diff --git a/js/source/tile_pyramid.js b/js/source/tile_pyramid.js index 11e5832845e..65a2d8386ce 100644 --- a/js/source/tile_pyramid.js +++ b/js/source/tile_pyramid.js @@ -389,13 +389,12 @@ TilePyramid.prototype = { indexSearch: function (id) { var tile = TileCoord.fromID(id); - var ids = []; + var ids = [id]; var parentTile = tile; - while (id % 32 !== 0) { + while (parentTile.z !== 0) { parentTile = parentTile.parent(); - id = parentTile.id; - ids.push(id); + ids.push(parentTile.id); } var cursor = this.index, @@ -412,7 +411,7 @@ TilePyramid.prototype = { index = tile.children(this.maxzoom).map(pluckId).indexOf(id); if (cursor) { if (cursor[index] === 0) { - id = cursorId; + cursorId = id; break; } else if (cursor[index] === 1) { cursorId = id; @@ -423,6 +422,10 @@ TilePyramid.prototype = { } } } + + // don't return a parentId if we found the original tile + if (ids.length === 0) return null; + return cursorId; } }; diff --git a/js/source/worker.js b/js/source/worker.js index cac0faecad3..56387f04885 100644 --- a/js/source/worker.js +++ b/js/source/worker.js @@ -52,7 +52,7 @@ util.extend(Worker.prototype, { // if a parentTile is defined it means the index is missing a tile for this coord // here the difference between the requested tile and its indexed parent is found // we pass the dz, x/y pos of the tile's relationship to its parent - if (params.parentId !== params.coord.id && tile.data.layers) { + if (params.parentId && tile.data.layers) { var tilePos = TileCoord.fromID(params.coord.id); var parentPos = TileCoord.fromID(params.parentId); var dz = tilePos.z - parentPos.z; @@ -62,7 +62,7 @@ util.extend(Worker.prototype, { // chelm - i'd prefer to not just tack on params here... tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); } else { - tile.parse(tile.data, this.layers, this.actor, callback); + tile.parse(tile.data, this.layers, this.actor, callback); } this.loaded[source] = this.loaded[source] || {}; diff --git a/js/source/worker_tile.js b/js/source/worker_tile.js index f11228c27ef..1871829bc37 100644 --- a/js/source/worker_tile.js +++ b/js/source/worker_tile.js @@ -113,8 +113,9 @@ WorkerTile.prototype.parse = function(data, layers, actor, callback, dz, xPos, y function sortLayerIntoBuckets(layer, buckets, dz, xPos, yPos) { for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i); - //MOB + var feature = layer.feature(i); + + // propagate clipped position in tile at the feature level feature.dz = dz; feature.xPos = xPos; feature.yPos = yPos; From 0a6807b4715c634a5722dea53e1c4b71014d42ba Mon Sep 17 00:00:00 2001 From: James Cardona Date: Tue, 29 Sep 2015 09:41:20 -0400 Subject: [PATCH 26/27] pulled child position calc to separate function --- js/source/worker.js | 21 +++++++++++++++------ test/js/source/tile_pyramid.test.js | 16 ++++++++++++---- test/js/source/worker.test.js | 9 +++++++++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/js/source/worker.js b/js/source/worker.js index 56387f04885..3d1f68e5e71 100644 --- a/js/source/worker.js +++ b/js/source/worker.js @@ -53,14 +53,10 @@ util.extend(Worker.prototype, { // here the difference between the requested tile and its indexed parent is found // we pass the dz, x/y pos of the tile's relationship to its parent if (params.parentId && tile.data.layers) { - var tilePos = TileCoord.fromID(params.coord.id); - var parentPos = TileCoord.fromID(params.parentId); - var dz = tilePos.z - parentPos.z; - var xPos = tilePos.x & ((1 << dz) - 1); - var yPos = tilePos.y & ((1 << dz) - 1); + var childPos = this.getChildPosition(params.coord.id, params.parentId); // chelm - i'd prefer to not just tack on params here... - tile.parse(tile.data, this.layers, this.actor, callback, dz, xPos, yPos); + tile.parse(tile.data, this.layers, this.actor, callback, childPos.dz, childPos.xPos, childPos.yPos); } else { tile.parse(tile.data, this.layers, this.actor, callback); } @@ -161,5 +157,18 @@ util.extend(Worker.prototype, { } else { callback(null, []); } + }, + + 'getChildPosition': function(childId, parentId) { + var tilePos = TileCoord.fromID(childId); + var parentPos = TileCoord.fromID(parentId); + var dz = tilePos.z - parentPos.z; + var xPos = tilePos.x & ((1 << dz) - 1); + var yPos = tilePos.y & ((1 << dz) - 1); + return { + dz: dz, + xPos: xPos, + yPos: yPos + }; } }); diff --git a/test/js/source/tile_pyramid.test.js b/test/js/source/tile_pyramid.test.js index 4bd80fdb722..65ded68620d 100644 --- a/test/js/source/tile_pyramid.test.js +++ b/test/js/source/tile_pyramid.test.js @@ -377,21 +377,29 @@ test('TilePyramid#clearTiles', function(t) { test('TilePyramid#indexSearch', function(t) { t.test('finds the covering tile for a missing tile in an index index', function(t) { - var coord1 = TileCoord.fromID(53542); - var coord2 = TileCoord.fromID(47430); + var coord1 = TileCoord.fromID(81830); + var coord2 = TileCoord.fromID(83878); var pyramid = createPyramid({ index: JSON.parse(fs.readFileSync(path.join(__dirname, '../../fixtures/index.json')).toString()).index }); var tile1 = pyramid.addTile(coord1); - t.equal(tile1.parentId, 3140); + t.equal(tile1.parentId, 20421); var tile2 = pyramid.addTile(coord2); - t.equal(tile2.parentId, false); + t.equal(tile2.parentId, null); t.end(); }); + + t.test('indexSearch not called if tile pyramid does not have an index', function(t) { + var coord1 = TileCoord.fromID(81830); + var pyramid = createPyramid(); + var tile1 = pyramid.addTile(coord1); + t.equal(tile1.parentId, undefined); + t.end(); + }); }); test('TilePyramid#tilesIn', function (t) { diff --git a/test/js/source/worker.test.js b/test/js/source/worker.test.js index 9a148f475ec..98f0feb8b9b 100644 --- a/test/js/source/worker.test.js +++ b/test/js/source/worker.test.js @@ -77,6 +77,15 @@ test('remove tile', function(t) { }); }); +test('overzoomed tile position', function(t) { + t.test('x, y pos calculated for overzoomed tile', function(t) { + var worker = new Worker(_self); + var ul = worker.getChildPosition(319335, 20421); + t.deepEqual(ul, { dz: 2, xPos: 3, yPos: 1 }); + t.end(); + }); +}); + test('after', function(t) { server.close(t.end); }); From 8140de442f93a8d5b4694c9e1b029d69da516df0 Mon Sep 17 00:00:00 2001 From: James Cardona Date: Mon, 5 Oct 2015 12:38:17 -0400 Subject: [PATCH 27/27] check for null polygon geometry --- js/data/fill_bucket.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/data/fill_bucket.js b/js/data/fill_bucket.js index cbd261b6cdf..7d260808f33 100644 --- a/js/data/fill_bucket.js +++ b/js/data/fill_bucket.js @@ -13,7 +13,10 @@ FillBucket.prototype.addFeatures = function() { var features = this.features; for (var i = 0; i < features.length; i++) { var feature = features[i]; - this.addFeature(feature.loadGeometry()); + var geom = feature.loadGeometry(); + if (geom) { + this.addFeature(geom); + } } };