static/media/js/wisp/terrain3.js @ 2fc3e28a1225

Add Mastodon link
author Steve Losh <steve@stevelosh.com>
date Sat, 21 Jul 2018 17:42:25 +0000
parents e7bc59b9ebda
children (none)
{
    var _ns_ = {
        id: 'demo',
        doc: void 0
    };
    var ndarray = require('ndarray');
}
var width = exports.width = 610;
var height = exports.height = 400;
var wireframe = exports.wireframe = true;
var wireframeWidth = exports.wireframeWidth = 1.2;
var terrainHeight = exports.terrainHeight = 50;
var terrainSize = exports.terrainSize = 100;
void 0;
void 0;
void 0;
var inc = exports.inc = function inc(x) {
    return x + 1;
};
var dec = exports.dec = function dec(x) {
    return x - 1;
};
void 0;
void 0;
void 0;
void 0;
void 0;
void 0;
void 0;
void 0;
var midpoint = exports.midpoint = function midpoint(a, b) {
    return (a + b) / 2;
};
var average2 = exports.average2 = function average2(a, b) {
    return (a + b) / 2;
};
var average4 = exports.average4 = function average4(a, b, c, d) {
    return (a + b + c + d) / 4;
};
var safeAverage = exports.safeAverage = function safeAverage(a, b, c, d) {
    return function () {
        var totalø1 = 0;
        var countø1 = 0;
        a ? (function () {
            totalø1 = totalø1 + a;
            return countø1 = inc(countø1);
        })() : void 0;
        b ? (function () {
            totalø1 = totalø1 + b;
            return countø1 = inc(countø1);
        })() : void 0;
        c ? (function () {
            totalø1 = totalø1 + c;
            return countø1 = inc(countø1);
        })() : void 0;
        d ? (function () {
            totalø1 = totalø1 + d;
            return countø1 = inc(countø1);
        })() : void 0;
        return totalø1 / countø1;
    }.call(this);
};
var isEven = exports.isEven = function isEven(n) {
    return 0 == n % 2;
};
var isOdd = exports.isOdd = function isOdd(n) {
    return 1 == n % 2;
};
var rand = exports.rand = function rand() {
    return Math.random();
};
var randAroundZero = exports.randAroundZero = function randAroundZero(spread) {
    return spread * rand() * 2 - spread;
};
var jitter = exports.jitter = function jitter(value, spread) {
    return value + randAroundZero(spread);
};
var heightmapResolution = exports.heightmapResolution = function heightmapResolution(heightmap) {
    return heightmap.shape[0];
};
var heightmapLastIndex = exports.heightmapLastIndex = function heightmapLastIndex(heightmap) {
    return dec(heightmapResolution(heightmap));
};
var heightmapCenterIndex = exports.heightmapCenterIndex = function heightmapCenterIndex(heightmap) {
    return midpoint(0, heightmapLastIndex(heightmap));
};
var heightmapGet = exports.heightmapGet = function heightmapGet(heightmap, x, y) {
    return heightmap.get(x, y);
};
var heightmapGetSafe = exports.heightmapGetSafe = function heightmapGetSafe(heightmap, x, y) {
    return function () {
        var lastø1 = heightmapLastIndex(heightmap);
        return 0 <= x && x <= lastø1 && (0 <= y && y <= lastø1) ? (function () {
            return heightmapGet(heightmap, x, y);
        })() : void 0;
    }.call(this);
};
var heightmapSet = exports.heightmapSet = function heightmapSet(heightmap, x, y, val) {
    return heightmap.set(x, y, val);
};
var heightmapSetIfUnset = exports.heightmapSetIfUnset = function heightmapSetIfUnset(heightmap, x, y, val) {
    return 0 == heightmapGet(heightmap, x, y) ? (function () {
        return heightmapSet(heightmap, x, y, val);
    })() : void 0;
};
var normalize = exports.normalize = function normalize(heightmap) {
    return function () {
        var maxø1 = 0 - Infinity;
        var minø1 = Infinity;
        (function () {
            var array2ø1 = heightmap;
            return function () {
                var G__3ø1 = array2ø1.data.length;
                return function loop() {
                    var recur = loop;
                    var index1ø1 = 0;
                    do {
                        recur = index1ø1 < G__3ø1 ? (function () {
                            (function () {
                                var elø1 = array2ø1.data[index1ø1];
                                maxø1 < elø1 ? (function () {
                                    return maxø1 = elø1;
                                })() : void 0;
                                return minø1 > elø1 ? (function () {
                                    return minø1 = elø1;
                                })() : void 0;
                            }.call(this));
                            return loop[0] = inc(index1ø1), loop;
                        })() : void 0;
                    } while (index1ø1 = loop[0], recur === loop);
                    return recur;
                }.call(this);
            }.call(this);
        }.call(this));
        return function () {
            var spanø1 = maxø1 - minø1;
            return function () {
                var array4ø1 = heightmap;
                return function () {
                    var G__5ø1 = array4ø1.shape[0];
                    return function loop() {
                        var recur = loop;
                        var xø1 = 0;
                        do {
                            recur = xø1 < G__5ø1 ? (function () {
                                (function () {
                                    var G__6ø1 = array4ø1.shape[1];
                                    return function loop() {
                                        var recur = loop;
                                        var yø1 = 0;
                                        do {
                                            recur = yø1 < G__6ø1 ? (function () {
                                                (function () {
                                                    return heightmapSet(heightmap, xø1, yø1, (heightmapGet(heightmap, xø1, yø1) - minø1) / spanø1);
                                                })();
                                                return loop[0] = inc(yø1), loop;
                                            })() : void 0;
                                        } while (yø1 = loop[0], recur === loop);
                                        return recur;
                                    }.call(this);
                                }.call(this));
                                return loop[0] = inc(xø1), loop;
                            })() : void 0;
                        } while (xø1 = loop[0], recur === loop);
                        return recur;
                    }.call(this);
                }.call(this);
            }.call(this);
        }.call(this);
    }.call(this);
};
var makeHeightmap = exports.makeHeightmap = function makeHeightmap(exponent) {
    return function () {
        var resolutionø1 = Math.pow(2, exponent) + 1;
        return function () {
            var heightmapø1 = ndarray(new Float64Array(resolutionø1 * resolutionø1), [
                resolutionø1,
                resolutionø1
            ]);
            heightmapø1.exponent = exponent;
            heightmapø1.resolution = resolutionø1;
            heightmapø1.last = dec(resolutionø1);
            return heightmapø1;
        }.call(this);
    }.call(this);
};
var topLeftCorner = exports.topLeftCorner = function topLeftCorner(heightmap) {
    return function () {
        var centerø1 = heightmapCenterIndex(heightmap);
        return heightmap.lo(0, 0).hi(inc(centerø1), inc(centerø1));
    }.call(this);
};
var topRightCorner = exports.topRightCorner = function topRightCorner(heightmap) {
    return function () {
        var centerø1 = heightmapCenterIndex(heightmap);
        return heightmap.lo(centerø1, 0).hi(inc(centerø1), inc(centerø1));
    }.call(this);
};
var bottomLeftCorner = exports.bottomLeftCorner = function bottomLeftCorner(heightmap) {
    return function () {
        var centerø1 = heightmapCenterIndex(heightmap);
        return heightmap.lo(0, centerø1).hi(inc(centerø1), inc(centerø1));
    }.call(this);
};
var bottomRightCorner = exports.bottomRightCorner = function bottomRightCorner(heightmap) {
    return function () {
        var centerø1 = heightmapCenterIndex(heightmap);
        return heightmap.lo(centerø1, centerø1).hi(inc(centerø1), inc(centerø1));
    }.call(this);
};
var dsInitCorners = exports.dsInitCorners = function dsInitCorners(heightmap) {
    return function () {
        var lastø1 = heightmapLastIndex(heightmap);
        heightmapSet(heightmap, 0, 0, rand());
        heightmapSet(heightmap, 0, lastø1, rand());
        heightmapSet(heightmap, lastø1, 0, rand());
        return heightmapSet(heightmap, lastø1, lastø1, rand());
    }.call(this);
};
var dsSquare = exports.dsSquare = function dsSquare(heightmap, x, y, radius, spread) {
    return function () {
        var newHeightø1 = jitter(average4(heightmapGet(heightmap, x - radius, y - radius), heightmapGet(heightmap, x - radius, y + radius), heightmapGet(heightmap, x + radius, y - radius), heightmapGet(heightmap, x + radius, y + radius)), spread);
        return heightmapSet(heightmap, x, y, newHeightø1);
    }.call(this);
};
var dsDiamond = exports.dsDiamond = function dsDiamond(heightmap, x, y, radius, spread) {
    return function () {
        var newHeightø1 = jitter(safeAverage(heightmapGetSafe(heightmap, x - radius, y), heightmapGetSafe(heightmap, x + radius, y), heightmapGetSafe(heightmap, x, y - radius), heightmapGetSafe(heightmap, x, y + radius)), spread);
        return heightmapSet(heightmap, x, y, newHeightø1);
    }.call(this);
};
var dsSquares = exports.dsSquares = function dsSquares(heightmap, radius, spread) {
    return function () {
        var start8ø1 = radius;
        var end9ø1 = heightmapResolution(heightmap);
        var stride7ø1 = 2 * radius;
        return function loop() {
            var recur = loop;
            var xø1 = start8ø1;
            do {
                recur = xø1 < end9ø1 ? (function () {
                    (function loop() {
                        var recur = loop;
                        var yø1 = start8ø1;
                        do {
                            recur = yø1 < end9ø1 ? (function () {
                                (function () {
                                    return dsSquare(heightmap, xø1, yø1, radius, spread);
                                })();
                                return loop[0] = yø1 + stride7ø1, loop;
                            })() : void 0;
                        } while (yø1 = loop[0], recur === loop);
                        return recur;
                    }.call(this));
                    return loop[0] = xø1 + stride7ø1, loop;
                })() : void 0;
            } while (xø1 = loop[0], recur === loop);
            return recur;
        }.call(this);
    }.call(this);
};
var dsDiamonds = exports.dsDiamonds = function dsDiamonds(heightmap, radius, spread) {
    return function () {
        var sizeø1 = heightmapResolution(heightmap);
        return function () {
            var start11ø1 = 0;
            var end12ø1 = sizeø1;
            var stride10ø1 = radius;
            return function loop() {
                var recur = loop;
                var yø1 = start11ø1;
                do {
                    recur = yø1 < end12ø1 ? (function () {
                        (function () {
                            return function () {
                                var shiftø1 = isEven(yø1 / radius) ? radius : 0;
                                return function () {
                                    var start14ø1 = shiftø1;
                                    var end15ø1 = sizeø1;
                                    var stride13ø1 = 2 * radius;
                                    return function loop() {
                                        var recur = loop;
                                        var xø1 = start14ø1;
                                        do {
                                            recur = xø1 < end15ø1 ? (function () {
                                                (function () {
                                                    return dsDiamond(heightmap, xø1, yø1, radius, spread);
                                                })();
                                                return loop[0] = xø1 + stride13ø1, loop;
                                            })() : void 0;
                                        } while (xø1 = loop[0], recur === loop);
                                        return recur;
                                    }.call(this);
                                }.call(this);
                            }.call(this);
                        })();
                        return loop[0] = yø1 + stride10ø1, loop;
                    })() : void 0;
                } while (yø1 = loop[0], recur === loop);
                return recur;
            }.call(this);
        }.call(this);
    }.call(this);
};
var diamondSquare = exports.diamondSquare = function diamondSquare(heightmap) {
    return function () {
        var initialSpreadø1 = 0.3;
        var spreadReductionø1 = 0.5;
        var centerø1 = heightmapCenterIndex(heightmap);
        var sizeø1 = heightmap.shape[0];
        dsInitCorners(heightmap);
        (function loop() {
            var recur = loop;
            var radiusø1 = centerø1;
            var spreadø1 = initialSpreadø1;
            do {
                recur = radiusø1 >= 1 ? (function () {
                    dsSquares(heightmap, radiusø1, spreadø1);
                    dsDiamonds(heightmap, radiusø1, spreadø1);
                    return loop[0] = radiusø1 / 2, loop[1] = spreadø1 * spreadReductionø1, loop;
                })() : void 0;
            } while (radiusø1 = loop[0], spreadø1 = loop[1], recur === loop);
            return recur;
        }.call(this));
        return normalize(heightmap);
    }.call(this);
};
var diamondSquare1 = exports.diamondSquare1 = function diamondSquare1(heightmap) {
    dsInitCorners(heightmap);
    return normalize(heightmap);
};
var diamondSquare2 = exports.diamondSquare2 = function diamondSquare2(heightmap) {
    return function () {
        var initialSpreadø1 = 0.3;
        var spreadReductionø1 = 0.5;
        var centerø1 = heightmapCenterIndex(heightmap);
        var sizeø1 = heightmap.shape[0];
        dsInitCorners(heightmap);
        dsSquares(heightmap, centerø1, initialSpreadø1);
        return normalize(heightmap);
    }.call(this);
};
var diamondSquare3 = exports.diamondSquare3 = function diamondSquare3(heightmap) {
    return function () {
        var initialSpreadø1 = 0.3;
        var spreadReductionø1 = 0.5;
        var centerø1 = heightmapCenterIndex(heightmap);
        var sizeø1 = heightmap.shape[0];
        dsInitCorners(heightmap);
        dsSquares(heightmap, centerø1, initialSpreadø1);
        dsDiamonds(heightmap, centerø1, initialSpreadø1);
        dsSquares(heightmap, centerø1 / 2, spreadReductionø1 * initialSpreadø1);
        dsDiamonds(heightmap, centerø1 / 2, spreadReductionø1 * initialSpreadø1);
        return normalize(heightmap);
    }.call(this);
};
var makeDirectionalLight = exports.makeDirectionalLight = function makeDirectionalLight() {
    return function () {
        var lightø1 = new THREE.DirectionalLight(16777215, 1);
        lightø1.position.set(100, 0, 150);
        return lightø1;
    }.call(this);
};
var makeCamera = exports.makeCamera = function makeCamera() {
    return function () {
        var cameraø1 = new THREE.PerspectiveCamera(55, width / height, 0.1, 1000);
        cameraø1.position.set(0, -100, 150);
        return cameraø1;
    }.call(this);
};
var makeRenderer = exports.makeRenderer = function makeRenderer() {
    return function () {
        var rendererø1 = new THREE.WebGLRenderer({ 'antialias': false });
        rendererø1.setClearColor(16777215);
        rendererø1.setSize(width, height);
        rendererø1.setPixelRatio(2);
        return rendererø1;
    }.call(this);
};
var makeGeometry = exports.makeGeometry = function makeGeometry(heightmap) {
    return function () {
        var resolutionø1 = heightmap.shape[0];
        var geometryø1 = new THREE.PlaneGeometry(terrainSize, terrainSize, resolutionø1 - 1, resolutionø1 - 1);
        return geometryø1;
    }.call(this);
};
var makeControls = exports.makeControls = function makeControls(camera, renderer) {
    return function () {
        var controlsø1 = new THREE.TrackballControls(camera, renderer.domElement);
        controlsø1.rotateSpeed = 1.4;
        controlsø1.zoomSpeed = 0.5;
        controlsø1.staticMoving = true;
        controlsø1.dynamicDampingFactor = 0.3;
        return controlsø1;
    }.call(this);
};
var makePlane = exports.makePlane = function makePlane(geometry) {
    return function () {
        var materialø1 = new THREE.MeshLambertMaterial({
            'wireframe': wireframe,
            'wireframeLinewidth': wireframeWidth,
            'color': 47872
        });
        return new THREE.Mesh(geometry, materialø1);
    }.call(this);
};
var attachToDom = exports.attachToDom = function attachToDom(renderer, elName, refreshFn) {
    return function () {
        var containerø1 = document.getElementById(elName);
        var settingsø1 = document.createElement('div');
        var refreshButtonø1 = document.createElement('button');
        var buttonTextø1 = document.createTextNode('Refresh');
        var cancelScrollø1 = function (e) {
            return e.preventDefault();
        };
        refreshButtonø1.onclick = refreshFn;
        renderer.domElement.onmousewheel = cancelScrollø1;
        renderer.domElement.addEventListener('MozMousePixelScroll', cancelScrollø1, false);
        refreshButtonø1.appendChild(buttonTextø1);
        containerø1.appendChild(renderer.domElement);
        containerø1.appendChild(settingsø1);
        return settingsø1.appendChild(refreshButtonø1);
    }.call(this);
};
var updateGeometry = exports.updateGeometry = function updateGeometry(geometry, heightmap) {
    (function loop() {
        var recur = loop;
        var iø1 = 0;
        do {
            recur = iø1 < geometry.vertices.length ? (function () {
                geometry.vertices[iø1].z = terrainHeight * heightmap.data[iø1];
                return loop[0] = iø1 + 1, loop;
            })() : void 0;
        } while (iø1 = loop[0], recur === loop);
        return recur;
    }.call(this));
    geometry.computeVertexNormals();
    return geometry;
};
var makeDemo = exports.makeDemo = function makeDemo(elementId, algorithm, size) {
    var scene = new THREE.Scene();
    scene.add(new THREE.AxisHelper(100));
    var clock = new THREE.Clock();
    var camera = makeCamera();
    var renderer = makeRenderer();
    var geometry = void 0;
    var plane = void 0;
    scene.add(makeDirectionalLight());
    scene.add(new THREE.AmbientLight(16777215, 0.05));
    var refresh = function refresh() {
        return function () {
            var heightmapø1 = makeHeightmap(size);
            console.log('Generating terrain...');
            (function () {
                var G__16ø1 = new Date().getTime();
                var G__18ø1 = (function () {
                    return algorithm(heightmapø1);
                })();
                var G__17ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__17ø1 - G__16ø1) + 'ms.');
                return G__18ø1;
            }.call(this));
            console.log('Rebuilding geometry...');
            (function () {
                var G__19ø1 = new Date().getTime();
                var G__21ø1 = (function () {
                    geometry = makeGeometry(heightmapø1);
                    return updateGeometry(geometry, heightmapø1);
                })();
                var G__20ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__20ø1 - G__19ø1) + 'ms.');
                return G__21ø1;
            }.call(this));
            console.log('Rebuilding plane...');
            return function () {
                var G__22ø1 = new Date().getTime();
                var G__24ø1 = (function () {
                    scene.remove(plane);
                    plane = makePlane(geometry);
                    return scene.add(plane);
                })();
                var G__23ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__23ø1 - G__22ø1) + 'ms.');
                return G__24ø1;
            }.call(this);
        }.call(this);
    };
    attachToDom(renderer, elementId, refresh);
    var controls = makeControls(camera, renderer);
    var render = function render() {
        return function () {
            var deltaø1 = clock.getDelta();
            requestAnimationFrame(render);
            controls.update(deltaø1);
            return renderer.render(scene, camera);
        }.call(this);
    };
    refresh();
    render();
    return void 0;
};
var makeFinal = exports.makeFinal = function makeFinal(elementId) {
    var scene = new THREE.Scene();
    scene.add(new THREE.AxisHelper(100));
    var clock = new THREE.Clock();
    var camera = makeCamera();
    var renderer = makeRenderer();
    var geometry = void 0;
    var plane = void 0;
    scene.add(makeDirectionalLight());
    scene.add(new THREE.AmbientLight(16777215, 0.05));
    var refresh = function refresh() {
        return function () {
            var heightmapø1 = makeHeightmap(6);
            console.log('Generating terrain...');
            (function () {
                var G__25ø1 = new Date().getTime();
                var G__27ø1 = (function () {
                    return diamondSquare(heightmapø1);
                })();
                var G__26ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__26ø1 - G__25ø1) + 'ms.');
                return G__27ø1;
            }.call(this));
            console.log('Rebuilding geometry...');
            (function () {
                var G__28ø1 = new Date().getTime();
                var G__30ø1 = (function () {
                    geometry = makeGeometry(heightmapø1);
                    return updateGeometry(geometry, heightmapø1);
                })();
                var G__29ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__29ø1 - G__28ø1) + 'ms.');
                return G__30ø1;
            }.call(this));
            console.log('Rebuilding plane...');
            return function () {
                var G__31ø1 = new Date().getTime();
                var G__33ø1 = (function () {
                    scene.remove(plane);
                    plane = makePlane(geometry);
                    return scene.add(plane);
                })();
                var G__32ø1 = new Date().getTime();
                console.log('Elapsed time: ' + (G__32ø1 - G__31ø1) + 'ms.');
                return G__33ø1;
            }.call(this);
        }.call(this);
    };
    attachToDom(renderer, elementId, refresh);
    var controls = makeControls(camera, renderer);
    var render = function render() {
        return function () {
            var deltaø1 = clock.getDelta();
            requestAnimationFrame(render);
            controls.update(deltaø1);
            return renderer.render(scene, camera);
        }.call(this);
    };
    refresh();
    render();
    return void 0;
};
var run = exports.run = function run() {
    makeDemo('demo-1', diamondSquare1, 2);
    makeDemo('demo-2', diamondSquare2, 4);
    makeDemo('demo-3', diamondSquare3, 4);
    return makeFinal('demo-final');
};
$(run);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsIndpZHRoIiwiZXhwb3J0cyIsImhlaWdodCIsIndpcmVmcmFtZSIsIndpcmVmcmFtZVdpZHRoIiwidGVycmFpbkhlaWdodCIsInRlcnJhaW5TaXplIiwiaW5jIiwieCIsImRlYyIsIm1pZHBvaW50IiwiYSIsImIiLCJhdmVyYWdlMiIsImF2ZXJhZ2U0IiwiYyIsImQiLCJzYWZlQXZlcmFnZSIsInRvdGFsw7gxIiwiY291bnTDuDEiLCJpc0V2ZW4iLCJuIiwiaXNPZGQiLCJyYW5kIiwiTWF0aCIsInJhbmRvbSIsInJhbmRBcm91bmRaZXJvIiwic3ByZWFkIiwiaml0dGVyIiwidmFsdWUiLCJoZWlnaHRtYXBSZXNvbHV0aW9uIiwiaGVpZ2h0bWFwIiwic2hhcGUiLCJoZWlnaHRtYXBMYXN0SW5kZXgiLCJoZWlnaHRtYXBDZW50ZXJJbmRleCIsImhlaWdodG1hcEdldCIsInkiLCJnZXQiLCJoZWlnaHRtYXBHZXRTYWZlIiwibGFzdMO4MSIsImhlaWdodG1hcFNldCIsInZhbCIsInNldCIsImhlaWdodG1hcFNldElmVW5zZXQiLCJub3JtYWxpemUiLCJtYXjDuDEiLCJJbmZpbml0eSIsIm1pbsO4MSIsImVsw7gxIiwic3BhbsO4MSIsInjDuDEiLCJ5w7gxIiwibWFrZUhlaWdodG1hcCIsImV4cG9uZW50IiwicmVzb2x1dGlvbsO4MSIsInBvdyIsImhlaWdodG1hcMO4MSIsIm5kYXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJyZXNvbHV0aW9uIiwibGFzdCIsInRvcExlZnRDb3JuZXIiLCJjZW50ZXLDuDEiLCJsbyIsImhpIiwidG9wUmlnaHRDb3JuZXIiLCJib3R0b21MZWZ0Q29ybmVyIiwiYm90dG9tUmlnaHRDb3JuZXIiLCJkc0luaXRDb3JuZXJzIiwiZHNTcXVhcmUiLCJyYWRpdXMiLCJuZXdIZWlnaHTDuDEiLCJkc0RpYW1vbmQiLCJkc1NxdWFyZXMiLCJkc0RpYW1vbmRzIiwic2l6ZcO4MSIsInNoaWZ0w7gxIiwiZGlhbW9uZFNxdWFyZSIsImluaXRpYWxTcHJlYWTDuDEiLCJzcHJlYWRSZWR1Y3Rpb27DuDEiLCJyYWRpdXPDuDEiLCJzcHJlYWTDuDEiLCJkaWFtb25kU3F1YXJlMSIsImRpYW1vbmRTcXVhcmUyIiwiZGlhbW9uZFNxdWFyZTMiLCJtYWtlRGlyZWN0aW9uYWxMaWdodCIsImxpZ2h0w7gxIiwiVEhSRUUiLCJEaXJlY3Rpb25hbExpZ2h0IiwicG9zaXRpb24uc2V0IiwibWFrZUNhbWVyYSIsImNhbWVyYcO4MSIsIlBlcnNwZWN0aXZlQ2FtZXJhIiwibWFrZVJlbmRlcmVyIiwicmVuZGVyZXLDuDEiLCJXZWJHTFJlbmRlcmVyIiwic2V0Q2xlYXJDb2xvciIsInNldFNpemUiLCJzZXRQaXhlbFJhdGlvIiwibWFrZUdlb21ldHJ5IiwiZ2VvbWV0cnnDuDEiLCJQbGFuZUdlb21ldHJ5IiwibWFrZUNvbnRyb2xzIiwiY2FtZXJhIiwicmVuZGVyZXIiLCJjb250cm9sc8O4MSIsIlRyYWNrYmFsbENvbnRyb2xzIiwiZG9tRWxlbWVudCIsInJvdGF0ZVNwZWVkIiwiem9vbVNwZWVkIiwic3RhdGljTW92aW5nIiwiZHluYW1pY0RhbXBpbmdGYWN0b3IiLCJtYWtlUGxhbmUiLCJnZW9tZXRyeSIsIm1hdGVyaWFsw7gxIiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsIk1lc2giLCJhdHRhY2hUb0RvbSIsImVsTmFtZSIsInJlZnJlc2hGbiIsImNvbnRhaW5lcsO4MSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzZXR0aW5nc8O4MSIsImNyZWF0ZUVsZW1lbnQiLCJyZWZyZXNoQnV0dG9uw7gxIiwiYnV0dG9uVGV4dMO4MSIsImNyZWF0ZVRleHROb2RlIiwiY2FuY2VsU2Nyb2xsw7gxIiwiZSIsInByZXZlbnREZWZhdWx0Iiwib25jbGljayIsImRvbUVsZW1lbnQub25tb3VzZXdoZWVsIiwiZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyIiwiYXBwZW5kQ2hpbGQiLCJ1cGRhdGVHZW9tZXRyeSIsImnDuDEiLCJ2ZXJ0aWNlcy5sZW5ndGgiLCJ2ZXJ0aWNlcyIsInoiLCJkYXRhIiwiY29tcHV0ZVZlcnRleE5vcm1hbHMiLCJtYWtlRGVtbyIsImVsZW1lbnRJZCIsImFsZ29yaXRobSIsInNpemUiLCJzY2VuZSIsIlNjZW5lIiwiYWRkIiwiQXhpc0hlbHBlciIsImNsb2NrIiwiQ2xvY2siLCJwbGFuZSIsIkFtYmllbnRMaWdodCIsInJlZnJlc2giLCJyZW1vdmUiLCJjb250cm9scyIsInJlbmRlciIsImRlbHRhw7gxIiwiZ2V0RGVsdGEiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ1cGRhdGUiLCJtYWtlRmluYWwiLCJydW4iLCIkIl0sIm1hcHBpbmdzIjoiO0lBQUEsSUFBQ0EsSSxHQUFEO0FBQUEsUUFBQUMsRSxFQUFJLE1BQUo7QUFBQSxRQUFBQyxHLEVBQUEsSyxDQUFBO0FBQUEsTTs7O0FBS0EsSUFBS0MsS0FBQSxHQUFBQyxPQUFBLENBQUFELEtBQUEsR0FBTSxHQUFYLEM7QUFDQSxJQUFLRSxNQUFBLEdBQUFELE9BQUEsQ0FBQUMsTUFBQSxHQUFPLEdBQVosQztBQUNBLElBQUtDLFNBQUEsR0FBQUYsT0FBQSxDQUFBRSxTQUFBLEcsSUFBTCxDO0FBQ0EsSUFBS0MsY0FBQSxHQUFBSCxPQUFBLENBQUFHLGNBQUEsR0FBZ0IsR0FBckIsQztBQUNBLElBQUtDLGFBQUEsR0FBQUosT0FBQSxDQUFBSSxhQUFBLEdBQWUsRUFBcEIsQztBQUNBLElBQUtDLFdBQUEsR0FBQUwsT0FBQSxDQUFBSyxXQUFBLEdBQWEsR0FBbEIsQzs7OztBQW9CQSxJQUFNQyxHQUFBLEdBQUFOLE9BQUEsQ0FBQU0sR0FBQSxHQUFOLFNBQU1BLEdBQU4sQ0FBV0MsQ0FBWCxFQUNFO0FBQUEsV0FBR0EsQ0FBSCxHQUFLLENBQUw7QUFBQSxDQURGLEM7QUFHQSxJQUFNQyxHQUFBLEdBQUFSLE9BQUEsQ0FBQVEsR0FBQSxHQUFOLFNBQU1BLEdBQU4sQ0FBV0QsQ0FBWCxFQUNFO0FBQUEsV0FBR0EsQ0FBSCxH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QUEsSUFFQzJELFFBQUQsQ0FBVyxRQUFYLEVBQW9CMUQsY0FBcEIsRUFBcUMsQ0FBckMsRUFGQTtBQUFBLElBR0EsT0FBQzhFLFNBQUQsQ0FBWSxZQUFaLEVBSEE7QUFBQSxDQURGLEM7QUFNQ0UsQ0FBRCxDQUFHRCxHQUFIIiwic291cmNlc0NvbnRlbnQiOlsiKG5zIGRlbW9cbiAgKDpyZXF1aXJlIFtuZGFycmF5XSkpXG5cblxuOyBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKGRlZiB3aWR0aCA2MTApXG4oZGVmIGhlaWdodCA0MDApXG4oZGVmIHdpcmVmcmFtZSB0cnVlKVxuKGRlZiB3aXJlZnJhbWUtd2lkdGggMS4yKVxuKGRlZiB0ZXJyYWluLWhlaWdodCA1MClcbihkZWYgdGVycmFpbi1zaXplIDEwMClcblxuOyBHZW5lcmFsIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKGRlZm1hY3JvIHdoZW4gW2NvbmRpdGlvbiAmIGJvZHldXG4gIGAoaWYgfmNvbmRpdGlvblxuICAgICAoZG8gfkBib2R5KSkpXG5cbihkZWZtYWNybyB3aGVuLW5vdCBbY29uZGl0aW9uICYgYm9keV1cbiAgYCh3aGVuIChub3QgfmNvbmRpdGlvbilcbiAgICAgfkBib2R5KSlcblxuKGRlZm1hY3JvIC0+IFsmIG9wZXJhdGlvbnNdXG4gIChyZWR1Y2VcbiAgICAoZm4gW2Zvcm0gb3BlcmF0aW9uXVxuICAgICAgKGNvbnMgKGZpcnN0IG9wZXJhdGlvbilcbiAgICAgICAgICAgIChjb25zIGZvcm0gKHJlc3Qgb3BlcmF0aW9uKSkpKVxuICAgIChmaXJzdCBvcGVyYXRpb25zKVxuICAgIChyZXN0IG9wZXJhdGlvbnMpKSlcblxuXG4oZGVmbiBpbmMgW3hdXG4gICgrIHggMSkpXG5cbihkZWZuIGRlYyBbeF1cbiAgKC0geCAxKSlcblxuXG4oZGVmbWFjcm8gZG8tdGltZXMgW3Zhcm5hbWUgbGltaXQgJiBib2R5XVxuICAobGV0IFtlbmQgKGdlbnN5bSldXG4gICAgYChsZXQgW35lbmQgfmxpbWl0XVxuICAgICAgIChsb29wIFt+dmFybmFtZSAwXVxuICAgICAgICAgKHdoZW4gKDwgfnZhcm5hbWUgfmVuZClcbiAgICAgICAgICAgfkBib2R5XG4gICAgICAgICAgIChyZWN1ciAoaW5jIH52YXJuYW1lKSkpKSkpKVxuXG4oZGVmbWFjcm8gZG8tc3RyaWRlIFt2YXJuYW1lcyBzdGFydC1mb3JtIGVuZC1mb3JtIHN0cmlkZS1mb3JtICYgYm9keV1cbiAgKGxldCBbc3RyaWRlIChnZW5zeW0gXCJzdHJpZGVcIilcbiAgICAgICAgc3RhcnQgKGdlbnN5bSBcInN0YXJ0XCIpXG4gICAgICAgIGVuZCAoZ2Vuc3ltIFwiZW5kXCIpXG4gICAgICAgIGJ1aWxkIChmbiBidWlsZCBbdmFyc11cbiAgICAgICAgICAgICAgICAoaWYgKGVtcHR5PyB2YXJzKVxuICAgICAgICAgICAgICAgICAgYChkbyB+QGJvZHkpXG4gICAgICAgICAgICAgICAgICAobGV0IFt2YXJuYW1lIChmaXJzdCB2YXJzKV1cbiAgICAgICAgICAgICAgICAgICAgYChsb29wIFt+dmFybmFtZSB+c3RhcnRdXG4gICAgICAgICAgICAgICAgICAgICAgICh3aGVuICg8IH52YXJuYW1lIH5lbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgfihidWlsZCAocmVzdCB2YXJzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAocmVjdXIgKCsgfnZhcm5hbWUgfnN0cmlkZSkpKSkpKSldXG4gICAgOyBGaXggdGhlIG51bWJlcnMgb25jZSBvdXRzaWRlIHRoZSBuZXN0ZWQgbG9vcHMsXG4gICAgOyBhbmQgdGhlbiBidWlsZCB0aGUgZ3V0cy5cbiAgICBgKGxldCBbfnN0YXJ0IH5zdGFydC1mb3JtXG4gICAgICAgICAgIH5lbmQgfmVuZC1mb3JtXG4gICAgICAgICAgIH5zdHJpZGUgfnN0cmlkZS1mb3JtXVxuICAgICAgIH4oYnVpbGQgdmFybmFtZXMpKSkpXG5cblxuKGRlZm1hY3JvIGRvLW5kYXJyYXkgW3ZhcnMgYXJyYXktZm9ybSAmIGJvZHldXG4gIChsZXQgW2FycmF5LXZhciAoZ2Vuc3ltIFwiYXJyYXlcIilcbiAgICAgICAgYnVpbGQgKGZuIGJ1aWxkIFt2YXJzIG5dXG4gICAgICAgICAgICAgICAgKGlmIChlbXB0eT8gdmFycylcbiAgICAgICAgICAgICAgICAgIGAoZG8gfkBib2R5KVxuICAgICAgICAgICAgICAgICAgYChkby10aW1lcyB+KGZpcnN0IHZhcnMpIChhZ2V0ICguLXNoYXBlIH5hcnJheS12YXIpIH5uKVxuICAgICAgICAgICAgICAgICAgICAgfihidWlsZCAocmVzdCB2YXJzKSAoaW5jIG4pKSkpKV1cbiAgICBgKGxldCBbfmFycmF5LXZhciB+YXJyYXktZm9ybV1cbiAgICAgICB+KGJ1aWxkIHZhcnMgMCkpKSlcblxuKGRlZm1hY3JvIGRvLW5kYXJyYXktZWwgW2VsZW1lbnQgYXJyYXktZm9ybSAmIGJvZHldXG4gIChsZXQgW2luZGV4IChnZW5zeW0gXCJpbmRleFwiKVxuICAgICAgICBhcnJheSAoZ2Vuc3ltIFwiYXJyYXlcIildXG4gICAgYChsZXQgW35hcnJheSB+YXJyYXktZm9ybV1cbiAgICAgICAoZG8tdGltZXMgfmluZGV4ICguLWxlbmd0aCAoLi1kYXRhIH5hcnJheSkpXG4gICAgICAgICAobGV0IFt+ZWxlbWVudCAoYWdldCAoLi1kYXRhIH5hcnJheSkgfmluZGV4KV1cbiAgICAgICAgICAgfkBib2R5KSkpKSlcblxuXG4oZGVmbWFjcm8gaW5jISBbcGxhY2VdXG4gIGAoc2V0ISB+cGxhY2UgKGluYyB+cGxhY2UpKSlcblxuKGRlZm1hY3JvIGFkZCEgW3BsYWNlIGFtb3VudF1cbiAgYChzZXQhIH5wbGFjZSAoKyB+cGxhY2UgfmFtb3VudCkpKVxuXG5cbihkZWZtYWNybyBsIFsmIGZvcm1zXVxuICBgKGNvbnNvbGUubG9nIH5AZm9ybXMpKVxuXG4oZGVmbWFjcm8gdGltZSBbJiBib2R5XVxuICAobGV0IFtzdGFydCAoZ2Vuc3ltKVxuICAgICAgICBlbmQgKGdlbnN5bSlcbiAgICAgICAgcmVzdWx0IChnZW5zeW0pXVxuICAgIGAobGV0IFt+c3RhcnQgKC5nZXRUaW1lIChuZXcgRGF0ZSkpXG4gICAgICAgICAgIH5yZXN1bHQgKGRvIH5AYm9keSlcbiAgICAgICAgICAgfmVuZCAoLmdldFRpbWUgKG5ldyBEYXRlKSldXG4gICAgICAgKGwgKCsgXCJFbGFwc2VkIHRpbWU6IFwiICgtIH5lbmQgfnN0YXJ0KSBcIm1zLlwiKSlcbiAgICAgICB+cmVzdWx0KSkpXG5cblxuKGRlZm4gbWlkcG9pbnQgW2EgYl1cbiAgKC8gKCsgYSBiKSAyKSlcblxuKGRlZm4gYXZlcmFnZTIgW2EgYl1cbiAgKC8gKCsgYSBiKSAyKSlcblxuKGRlZm4gYXZlcmFnZTQgW2EgYiBjIGRdXG4gICgvICgrIGEgYiBjIGQpIDQpKVxuXG4oZGVmbiBzYWZlLWF2ZXJhZ2UgW2EgYiBjIGRdXG4gIChsZXQgW3RvdGFsIDAgY291bnQgMF1cbiAgICAod2hlbiBhIChhZGQhIHRvdGFsIGEpIChpbmMhIGNvdW50KSlcbiAgICAod2hlbiBiIChhZGQhIHRvdGFsIGIpIChpbmMhIGNvdW50KSlcbiAgICAod2hlbiBjIChhZGQhIHRvdGFsIGMpIChpbmMhIGNvdW50KSlcbiAgICAod2hlbiBkIChhZGQhIHRvdGFsIGQpIChpbmMhIGNvdW50KSlcbiAgICAoLyB0b3RhbCBjb3VudCkpKVxuXG5cbihkZWZuIGV2ZW4/IFtuXVxuICAoPT0gMCAobW9kIG4gMikpKVxuXG4oZGVmbiBvZGQ/IFtuXVxuICAoPT0gMSAobW9kIG4gMikpKVxuXG5cbjsgUmFuZG9tbmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIHJhbmQgW11cbiAgKE1hdGgucmFuZG9tKSlcblxuKGRlZm4gcmFuZC1hcm91bmQtemVybyBbc3ByZWFkXVxuICAoLSAoKiBzcHJlYWQgKHJhbmQpIDIpIHNwcmVhZCkpXG5cbihkZWZuIGppdHRlciBbdmFsdWUgc3ByZWFkXVxuICAoKyB2YWx1ZSAocmFuZC1hcm91bmQtemVybyBzcHJlYWQpKSlcblxuXG47IEhlaWdodG1hcCBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbiBoZWlnaHRtYXAtcmVzb2x1dGlvbiBbaGVpZ2h0bWFwXVxuICAoYWdldCBoZWlnaHRtYXAuc2hhcGUgMCkpXG5cbihkZWZuIGhlaWdodG1hcC1sYXN0LWluZGV4IFtoZWlnaHRtYXBdXG4gIChkZWMgKGhlaWdodG1hcC1yZXNvbHV0aW9uIGhlaWdodG1hcCkpKVxuXG4oZGVmbiBoZWlnaHRtYXAtY2VudGVyLWluZGV4IFtoZWlnaHRtYXBdXG4gIChtaWRwb2ludCAwIChoZWlnaHRtYXAtbGFzdC1pbmRleCBoZWlnaHRtYXApKSlcblxuXG4oZGVmbiBoZWlnaHRtYXAtZ2V0IFtoZWlnaHRtYXAgeCB5XVxuICAoLmdldCBoZWlnaHRtYXAgeCB5KSlcblxuKGRlZm4gaGVpZ2h0bWFwLWdldC1zYWZlIFtoZWlnaHRtYXAgeCB5XVxuICAobGV0IFtsYXN0IChoZWlnaHRtYXAtbGFzdC1pbmRleCBoZWlnaHRtYXApXVxuICAgICh3aGVuIChhbmQgKDw9IDAgeCBsYXN0KVxuICAgICAgICAgICAgICAgKDw9IDAgeSBsYXN0KSlcbiAgICAgIChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCB4IHkpKSkpXG5cbihkZWZuIGhlaWdodG1hcC1zZXQhIFtoZWlnaHRtYXAgeCB5IHZhbF1cbiAgKC5zZXQgaGVpZ2h0bWFwIHggeSB2YWwpKVxuXG4oZGVmbiBoZWlnaHRtYXAtc2V0LWlmLXVuc2V0ISBbaGVpZ2h0bWFwIHggeSB2YWxdXG4gICh3aGVuICg9PSAwIChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCB4IHkpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgeCB5IHZhbCkpKVxuXG5cbihkZWZuIG5vcm1hbGl6ZSBbaGVpZ2h0bWFwXVxuICAobGV0IFttYXggKC0gSW5maW5pdHkpXG4gICAgICAgIG1pbiBJbmZpbml0eV1cbiAgICAoZG8tbmRhcnJheS1lbCBlbCBoZWlnaHRtYXBcbiAgICAgICh3aGVuICg8IG1heCBlbCkgKHNldCEgbWF4IGVsKSlcbiAgICAgICh3aGVuICg+IG1pbiBlbCkgKHNldCEgbWluIGVsKSkpXG4gICAgKGxldCBbc3BhbiAoLSBtYXggbWluKV1cbiAgICAgIChkby1uZGFycmF5IFt4IHldIGhlaWdodG1hcFxuICAgICAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIHggeVxuICAgICAgICAgICAgICAgICAgICAgICAgKC8gKC0gKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIHggeSkgbWluKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbikpKSkpKVxuXG5cbihkZWZuIG1ha2UtaGVpZ2h0bWFwIFtleHBvbmVudF1cbiAgKGxldCBbcmVzb2x1dGlvbiAoKyAoTWF0aC5wb3cgMiBleHBvbmVudCkgMSldXG4gICAgKGxldCBbaGVpZ2h0bWFwIChuZGFycmF5IChuZXcgRmxvYXQ2NEFycmF5ICgqIHJlc29sdXRpb24gcmVzb2x1dGlvbikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHV0aW9uIHJlc29sdXRpb25dKV1cbiAgICAgIChzZXQhIGhlaWdodG1hcC5leHBvbmVudCBleHBvbmVudClcbiAgICAgIChzZXQhIGhlaWdodG1hcC5yZXNvbHV0aW9uIHJlc29sdXRpb24pXG4gICAgICAoc2V0ISBoZWlnaHRtYXAubGFzdCAoZGVjIHJlc29sdXRpb24pKVxuICAgICAgaGVpZ2h0bWFwKSkpXG5cblxuKGRlZm4gdG9wLWxlZnQtY29ybmVyIFtoZWlnaHRtYXBdXG4gIChsZXQgW2NlbnRlciAoaGVpZ2h0bWFwLWNlbnRlci1pbmRleCBoZWlnaHRtYXApXVxuICAgICgtPiBoZWlnaHRtYXBcbiAgICAgICgubG8gMCAwKVxuICAgICAgKC5oaSAoaW5jIGNlbnRlcikgKGluYyBjZW50ZXIpKSkpKVxuXG4oZGVmbiB0b3AtcmlnaHQtY29ybmVyIFtoZWlnaHRtYXBdXG4gIChsZXQgW2NlbnRlciAoaGVpZ2h0bWFwLWNlbnRlci1pbmRleCBoZWlnaHRtYXApXVxuICAgICgtPiBoZWlnaHRtYXBcbiAgICAgICgubG8gY2VudGVyIDApXG4gICAgICAoLmhpIChpbmMgY2VudGVyKSAoaW5jIGNlbnRlcikpKSkpXG5cbihkZWZuIGJvdHRvbS1sZWZ0LWNvcm5lciBbaGVpZ2h0bWFwXVxuICAobGV0IFtjZW50ZXIgKGhlaWdodG1hcC1jZW50ZXItaW5kZXggaGVpZ2h0bWFwKV1cbiAgICAoLT4gaGVpZ2h0bWFwXG4gICAgICAoLmxvIDAgY2VudGVyKVxuICAgICAgKC5oaSAoaW5jIGNlbnRlcikgKGluYyBjZW50ZXIpKSkpKVxuXG4oZGVmbiBib3R0b20tcmlnaHQtY29ybmVyIFtoZWlnaHRtYXBdXG4gIChsZXQgW2NlbnRlciAoaGVpZ2h0bWFwLWNlbnRlci1pbmRleCBoZWlnaHRtYXApXVxuICAgICgtPiBoZWlnaHRtYXBcbiAgICAgICgubG8gY2VudGVyIGNlbnRlcilcbiAgICAgICguaGkgKGluYyBjZW50ZXIpIChpbmMgY2VudGVyKSkpKSlcblxuXG47IERpYW1vbmQtU3F1YXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbiBkcy1pbml0LWNvcm5lcnMgW2hlaWdodG1hcF1cbiAgKGxldCBbbGFzdCAoaGVpZ2h0bWFwLWxhc3QtaW5kZXggaGVpZ2h0bWFwKV1cbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIDAgICAgMCAgICAocmFuZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCAwICAgIGxhc3QgKHJhbmQpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgbGFzdCAwICAgIChyYW5kKSlcbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGxhc3QgbGFzdCAocmFuZCkpKSlcblxuKGRlZm4gZHMtc3F1YXJlIFtoZWlnaHRtYXAgeCB5IHJhZGl1cyBzcHJlYWRdXG4gIChsZXQgW25ldy1oZWlnaHQgKGppdHRlclxuICAgICAgICAgICAgICAgICAgICAgKGF2ZXJhZ2U0XG4gICAgICAgICAgICAgICAgICAgICAgIChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCAoLSB4IHJhZGl1cykgKC0geSByYWRpdXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAoaGVpZ2h0bWFwLWdldCBoZWlnaHRtYXAgKC0geCByYWRpdXMpICgrIHkgcmFkaXVzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwICgrIHggcmFkaXVzKSAoLSB5IHJhZGl1cykpXG4gICAgICAgICAgICAgICAgICAgICAgIChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCAoKyB4IHJhZGl1cykgKCsgeSByYWRpdXMpKSlcbiAgICAgICAgICAgICAgICAgICAgIHNwcmVhZCldXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCB4IHkgbmV3LWhlaWdodCkpKVxuXG4oZGVmbiBkcy1kaWFtb25kIFtoZWlnaHRtYXAgeCB5IHJhZGl1cyBzcHJlYWRdXG4gIChsZXQgW25ldy1oZWlnaHQgKGppdHRlclxuICAgICAgICAgICAgICAgICAgICAgKHNhZmUtYXZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAoaGVpZ2h0bWFwLWdldC1zYWZlIGhlaWdodG1hcCAoLSB4IHJhZGl1cykgeSlcbiAgICAgICAgICAgICAgICAgICAgICAgKGhlaWdodG1hcC1nZXQtc2FmZSBoZWlnaHRtYXAgKCsgeCByYWRpdXMpIHkpXG4gICAgICAgICAgICAgICAgICAgICAgIChoZWlnaHRtYXAtZ2V0LXNhZmUgaGVpZ2h0bWFwIHggKC0geSByYWRpdXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAoaGVpZ2h0bWFwLWdldC1zYWZlIGhlaWdodG1hcCB4ICgrIHkgcmFkaXVzKSkpXG4gICAgICAgICAgICAgICAgICAgICBzcHJlYWQpXVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgeCB5IG5ldy1oZWlnaHQpKSlcblxuXG4oZGVmbiBkcy1zcXVhcmVzIFtoZWlnaHRtYXAgcmFkaXVzIHNwcmVhZF1cbiAgKGRvLXN0cmlkZSBbeCB5XSByYWRpdXMgKGhlaWdodG1hcC1yZXNvbHV0aW9uIGhlaWdodG1hcCkgKCogMiByYWRpdXMpXG4gICAgKGRzLXNxdWFyZSBoZWlnaHRtYXAgeCB5IHJhZGl1cyBzcHJlYWQpKSlcblxuKGRlZm4gZHMtZGlhbW9uZHMgW2hlaWdodG1hcCByYWRpdXMgc3ByZWFkXVxuICAobGV0IFtzaXplIChoZWlnaHRtYXAtcmVzb2x1dGlvbiBoZWlnaHRtYXApXVxuICAgIChkby1zdHJpZGUgW3ldIDAgc2l6ZSByYWRpdXNcbiAgICAgIChsZXQgW3NoaWZ0IChpZiAoZXZlbj8gKC8geSByYWRpdXMpKSByYWRpdXMgMCldXG4gICAgICAgIChkby1zdHJpZGUgW3hdIHNoaWZ0IHNpemUgKCogMiByYWRpdXMpXG4gICAgICAgICAgKGRzLWRpYW1vbmQgaGVpZ2h0bWFwIHggeSByYWRpdXMgc3ByZWFkKSkpKSkpXG5cbihkZWZuIGRpYW1vbmQtc3F1YXJlIFtoZWlnaHRtYXBdXG4gIChsZXQgW2luaXRpYWwtc3ByZWFkIDAuM1xuICAgICAgICBzcHJlYWQtcmVkdWN0aW9uIDAuNVxuICAgICAgICBjZW50ZXIgKGhlaWdodG1hcC1jZW50ZXItaW5kZXggaGVpZ2h0bWFwKVxuICAgICAgICBzaXplIChhZ2V0IGhlaWdodG1hcC5zaGFwZSAwKV1cbiAgICAoZHMtaW5pdC1jb3JuZXJzIGhlaWdodG1hcClcbiAgICAobG9vcCBbcmFkaXVzIGNlbnRlclxuICAgICAgICAgICBzcHJlYWQgaW5pdGlhbC1zcHJlYWRdXG4gICAgICAod2hlbiAoPj0gcmFkaXVzIDEpXG4gICAgICAgIChkcy1zcXVhcmVzIGhlaWdodG1hcCByYWRpdXMgc3ByZWFkKVxuICAgICAgICAoZHMtZGlhbW9uZHMgaGVpZ2h0bWFwIHJhZGl1cyBzcHJlYWQpXG4gICAgICAgIChyZWN1ciAoLyByYWRpdXMgMilcbiAgICAgICAgICAgICAgICgqIHNwcmVhZCBzcHJlYWQtcmVkdWN0aW9uKSkpKVxuICAgIChub3JtYWxpemUgaGVpZ2h0bWFwKSkpXG5cblxuKGRlZm4gZGlhbW9uZC1zcXVhcmUtMSBbaGVpZ2h0bWFwXVxuICAoZHMtaW5pdC1jb3JuZXJzIGhlaWdodG1hcClcbiAgKG5vcm1hbGl6ZSBoZWlnaHRtYXApKVxuXG4oZGVmbiBkaWFtb25kLXNxdWFyZS0yIFtoZWlnaHRtYXBdXG4gIChsZXQgW2luaXRpYWwtc3ByZWFkIDAuM1xuICAgICAgICBzcHJlYWQtcmVkdWN0aW9uIDAuNVxuICAgICAgICBjZW50ZXIgKGhlaWdodG1hcC1jZW50ZXItaW5kZXggaGVpZ2h0bWFwKVxuICAgICAgICBzaXplIChhZ2V0IGhlaWdodG1hcC5zaGFwZSAwKV1cbiAgICAoZHMtaW5pdC1jb3JuZXJzIGhlaWdodG1hcClcbiAgICAoZHMtc3F1YXJlcyBoZWlnaHRtYXAgY2VudGVyIGluaXRpYWwtc3ByZWFkKVxuICAgIChub3JtYWxpemUgaGVpZ2h0bWFwKSkpXG5cbihkZWZuIGRpYW1vbmQtc3F1YXJlLTMgW2hlaWdodG1hcF1cbiAgKGxldCBbaW5pdGlhbC1zcHJlYWQgMC4zXG4gICAgICAgIHNwcmVhZC1yZWR1Y3Rpb24gMC41XG4gICAgICAgIGNlbnRlciAoaGVpZ2h0bWFwLWNlbnRlci1pbmRleCBoZWlnaHRtYXApXG4gICAgICAgIHNpemUgKGFnZXQgaGVpZ2h0bWFwLnNoYXBlIDApXVxuICAgIChkcy1pbml0LWNvcm5lcnMgaGVpZ2h0bWFwKVxuICAgIChkcy1zcXVhcmVzIGhlaWdodG1hcCBjZW50ZXIgaW5pdGlhbC1zcHJlYWQpXG4gICAgKGRzLWRpYW1vbmRzIGhlaWdodG1hcCBjZW50ZXIgaW5pdGlhbC1zcHJlYWQpXG4gICAgKGRzLXNxdWFyZXMgaGVpZ2h0bWFwICgvIGNlbnRlciAyKSAoKiBzcHJlYWQtcmVkdWN0aW9uIGluaXRpYWwtc3ByZWFkKSlcbiAgICAoZHMtZGlhbW9uZHMgaGVpZ2h0bWFwICgvIGNlbnRlciAyKSAoKiBzcHJlYWQtcmVkdWN0aW9uIGluaXRpYWwtc3ByZWFkKSlcbiAgICAobm9ybWFsaXplIGhlaWdodG1hcCkpKVxuXG5cbjsgVGhyZWUuanMgSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIG1ha2UtZGlyZWN0aW9uYWwtbGlnaHQgW11cbiAgKGxldCBbbGlnaHQgKG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0IDB4ZmZmZmZmIDEpXVxuICAgIChsaWdodC5wb3NpdGlvbi5zZXQgMTAwIDAgMTUwKVxuICAgIGxpZ2h0KSlcblxuKGRlZm4gbWFrZS1jYW1lcmEgW11cbiAgKGxldCBbY2FtZXJhIChuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmFcbiAgICAgICAgICAgICAgICAgICAgNTUsXG4gICAgICAgICAgICAgICAgICAgICgvIHdpZHRoIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgMC4xLFxuICAgICAgICAgICAgICAgICAgICAxMDAwKV1cbiAgICAoY2FtZXJhLnBvc2l0aW9uLnNldCAwIC0xMDAgMTUwKVxuICAgIGNhbWVyYSkpXG5cbihkZWZuIG1ha2UtcmVuZGVyZXIgW11cbiAgKGxldCBbcmVuZGVyZXIgKG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyIHs6YW50aWFsaWFzIGZhbHNlfSldXG4gICAgKHJlbmRlcmVyLnNldENsZWFyQ29sb3IgMHhmZmZmZmYpXG4gICAgKHJlbmRlcmVyLnNldFNpemUgd2lkdGggaGVpZ2h0KVxuICAgIChyZW5kZXJlci5zZXRQaXhlbFJhdGlvIDIpXG4gICAgcmVuZGVyZXIpKVxuXG4oZGVmbiBtYWtlLWdlb21ldHJ5IFtoZWlnaHRtYXBdXG4gIChsZXQgW3Jlc29sdXRpb24gKGFnZXQgaGVpZ2h0bWFwLnNoYXBlIDApXG4gICAgICAgIGdlb21ldHJ5IChuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICgtIHJlc29sdXRpb24gMSlcbiAgICAgICAgICAgICAgICAgICAgICAoLSByZXNvbHV0aW9uIDEpKV1cbiAgICBnZW9tZXRyeSkpXG5cbihkZWZuIG1ha2UtY29udHJvbHMgW2NhbWVyYSByZW5kZXJlcl1cbiAgKGxldCBbY29udHJvbHMgKG5ldyBUSFJFRS5UcmFja2JhbGxDb250cm9scyBjYW1lcmEgcmVuZGVyZXIuZG9tRWxlbWVudCldXG4gICAgKHNldCEgY29udHJvbHMucm90YXRlU3BlZWQgMS40KVxuICAgIChzZXQhIGNvbnRyb2xzLnpvb21TcGVlZCAwLjUpXG4gICAgKHNldCEgY29udHJvbHMuc3RhdGljTW92aW5nIHRydWUpXG4gICAgKHNldCEgY29udHJvbHMuZHluYW1pY0RhbXBpbmdGYWN0b3IgMC4zKVxuICAgIGNvbnRyb2xzKSlcblxuKGRlZm4gbWFrZS1wbGFuZSBbZ2VvbWV0cnldXG4gIChsZXQgW21hdGVyaWFsIChuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbFxuICAgICAgICAgICAgICAgICAgICAgIHs6d2lyZWZyYW1lIHdpcmVmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICA6d2lyZWZyYW1lTGluZXdpZHRoIHdpcmVmcmFtZS13aWR0aFxuICAgICAgICAgICAgICAgICAgICAgICA6Y29sb3IgMHgwMGJiMDB9KV1cbiAgICAobmV3IFRIUkVFLk1lc2ggZ2VvbWV0cnkgbWF0ZXJpYWwpKSlcblxuXG4oZGVmbiBhdHRhY2gtdG8tZG9tIFtyZW5kZXJlciBlbC1uYW1lIHJlZnJlc2gtZm5dXG4gIChsZXQgW2NvbnRhaW5lciAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgZWwtbmFtZSlcbiAgICAgICAgc2V0dGluZ3MgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJkaXZcIilcbiAgICAgICAgcmVmcmVzaC1idXR0b24gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJidXR0b25cIilcbiAgICAgICAgYnV0dG9uLXRleHQgKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlIFwiUmVmcmVzaFwiKVxuICAgICAgICBjYW5jZWwtc2Nyb2xsIChmbiBbZV0gKC5wcmV2ZW50RGVmYXVsdCBlKSldXG4gICAgKHNldCEgcmVmcmVzaC1idXR0b24ub25jbGljayByZWZyZXNoLWZuKVxuICAgIChzZXQhIHJlbmRlcmVyLmRvbUVsZW1lbnQub25tb3VzZXdoZWVsIGNhbmNlbC1zY3JvbGwpXG4gICAgKHJlbmRlcmVyLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciBcIk1vek1vdXNlUGl4ZWxTY3JvbGxcIiBjYW5jZWwtc2Nyb2xsIGZhbHNlKVxuICAgICguYXBwZW5kQ2hpbGQgcmVmcmVzaC1idXR0b24gYnV0dG9uLXRleHQpXG4gICAgKC5hcHBlbmRDaGlsZCBjb250YWluZXIgcmVuZGVyZXIuZG9tRWxlbWVudClcbiAgICAoLmFwcGVuZENoaWxkIGNvbnRhaW5lciBzZXR0aW5ncylcbiAgICAoLmFwcGVuZENoaWxkIHNldHRpbmdzIHJlZnJlc2gtYnV0dG9uKSkpXG5cblxuKGRlZm4gdXBkYXRlLWdlb21ldHJ5IFtnZW9tZXRyeSBoZWlnaHRtYXBdXG4gIChsb29wIFtpIDBdXG4gICAgKGlmICg8IGkgZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoKVxuICAgICAgKGRvIChzZXQhICguLXogKGFnZXQgZ2VvbWV0cnkudmVydGljZXMgaSkpXG4gICAgICAgICAgICAgICAgKCogdGVycmFpbi1oZWlnaHQgKGFnZXQgKC4tZGF0YSBoZWlnaHRtYXApIGkpKSlcbiAgICAgICAgKHJlY3VyICgrIGkgMSkpKSkpXG4gIChnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscylcbiAgZ2VvbWV0cnkpXG5cblxuOyBNYWluIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKGRlZm4gbWFrZS1kZW1vIFtlbGVtZW50LWlkIGFsZ29yaXRobSBzaXplXVxuICAoZGVmIHNjZW5lIChuZXcgVEhSRUUuU2NlbmUpKVxuICAoc2NlbmUuYWRkIChuZXcgVEhSRUUuQXhpc0hlbHBlciAxMDApKVxuXG4gIChkZWYgY2xvY2sgKG5ldyBUSFJFRS5DbG9jaykpXG4gIChkZWYgY2FtZXJhIChtYWtlLWNhbWVyYSkpXG4gIChkZWYgcmVuZGVyZXIgKG1ha2UtcmVuZGVyZXIpKVxuXG4gIChkZWYgZ2VvbWV0cnkpXG4gIChkZWYgcGxhbmUpXG5cbiAgKHNjZW5lLmFkZCAobWFrZS1kaXJlY3Rpb25hbC1saWdodCkpXG4gIChzY2VuZS5hZGQgKG5ldyBUSFJFRS5BbWJpZW50TGlnaHQgMHhmZmZmZmYgMC4wNSkpXG5cbiAgKGRlZm4gcmVmcmVzaCBbXVxuICAgIChsZXQgW2hlaWdodG1hcCAobWFrZS1oZWlnaHRtYXAgc2l6ZSldXG4gICAgICAobCBcIkdlbmVyYXRpbmcgdGVycmFpbi4uLlwiKVxuICAgICAgKHRpbWUgKGFsZ29yaXRobSBoZWlnaHRtYXApKVxuXG4gICAgICAobCBcIlJlYnVpbGRpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAgICh0aW1lXG4gICAgICAgIChzZXQhIGdlb21ldHJ5IChtYWtlLWdlb21ldHJ5IGhlaWdodG1hcCkpXG4gICAgICAgICh1cGRhdGUtZ2VvbWV0cnkgZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcblxuICAgICAgKGwgXCJSZWJ1aWxkaW5nIHBsYW5lLi4uXCIpXG4gICAgICAodGltZVxuICAgICAgICAoc2NlbmUucmVtb3ZlIHBsYW5lKVxuICAgICAgICAoc2V0ISBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG4gICAgICAgIChzY2VuZS5hZGQgcGxhbmUpKSkpXG5cbiAgKGF0dGFjaC10by1kb20gcmVuZGVyZXIgZWxlbWVudC1pZCByZWZyZXNoKVxuICAoZGVmIGNvbnRyb2xzIChtYWtlLWNvbnRyb2xzIGNhbWVyYSByZW5kZXJlcikpXG5cbiAgKGRlZm4gcmVuZGVyIFtdXG4gICAgKGxldCBbZGVsdGEgKGNsb2NrLmdldERlbHRhKV1cbiAgICAgIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcmVuZGVyKVxuICAgICAgKC51cGRhdGUgY29udHJvbHMgZGVsdGEpXG4gICAgICAocmVuZGVyZXIucmVuZGVyIHNjZW5lIGNhbWVyYSkpKVxuXG4gIChyZWZyZXNoKVxuICAocmVuZGVyKVxuXG4gIG5pbClcblxuKGRlZm4gbWFrZS1maW5hbCBbZWxlbWVudC1pZF1cbiAgKGRlZiBzY2VuZSAobmV3IFRIUkVFLlNjZW5lKSlcbiAgKHNjZW5lLmFkZCAobmV3IFRIUkVFLkF4aXNIZWxwZXIgMTAwKSlcblxuICAoZGVmIGNsb2NrIChuZXcgVEhSRUUuQ2xvY2spKVxuICAoZGVmIGNhbWVyYSAobWFrZS1jYW1lcmEpKVxuICAoZGVmIHJlbmRlcmVyIChtYWtlLXJlbmRlcmVyKSlcblxuICAoZGVmIGdlb21ldHJ5KVxuICAoZGVmIHBsYW5lKVxuXG4gIChzY2VuZS5hZGQgKG1ha2UtZGlyZWN0aW9uYWwtbGlnaHQpKVxuICAoc2NlbmUuYWRkIChuZXcgVEhSRUUuQW1iaWVudExpZ2h0IDB4ZmZmZmZmIDAuMDUpKVxuXG4gIChkZWZuIHJlZnJlc2ggW11cbiAgICAobGV0IFtoZWlnaHRtYXAgKG1ha2UtaGVpZ2h0bWFwIDYpXVxuICAgICAgKGwgXCJHZW5lcmF0aW5nIHRlcnJhaW4uLi5cIilcbiAgICAgICh0aW1lIChkaWFtb25kLXNxdWFyZSBoZWlnaHRtYXApKVxuXG4gICAgICAobCBcIlJlYnVpbGRpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAgICh0aW1lXG4gICAgICAgIChzZXQhIGdlb21ldHJ5IChtYWtlLWdlb21ldHJ5IGhlaWdodG1hcCkpXG4gICAgICAgICh1cGRhdGUtZ2VvbWV0cnkgZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcblxuICAgICAgKGwgXCJSZWJ1aWxkaW5nIHBsYW5lLi4uXCIpXG4gICAgICAodGltZVxuICAgICAgICAoc2NlbmUucmVtb3ZlIHBsYW5lKVxuICAgICAgICAoc2V0ISBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG4gICAgICAgIChzY2VuZS5hZGQgcGxhbmUpKSkpXG5cbiAgKGF0dGFjaC10by1kb20gcmVuZGVyZXIgZWxlbWVudC1pZCByZWZyZXNoKVxuICAoZGVmIGNvbnRyb2xzIChtYWtlLWNvbnRyb2xzIGNhbWVyYSByZW5kZXJlcikpXG5cbiAgKGRlZm4gcmVuZGVyIFtdXG4gICAgKGxldCBbZGVsdGEgKGNsb2NrLmdldERlbHRhKV1cbiAgICAgIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcmVuZGVyKVxuICAgICAgKC51cGRhdGUgY29udHJvbHMgZGVsdGEpXG4gICAgICAocmVuZGVyZXIucmVuZGVyIHNjZW5lIGNhbWVyYSkpKVxuXG4gIChyZWZyZXNoKVxuICAocmVuZGVyKVxuXG4gIG5pbClcblxuKGRlZm4gcnVuIFtdXG4gIChtYWtlLWRlbW8gXCJkZW1vLTFcIiBkaWFtb25kLXNxdWFyZS0xIDIpXG4gIChtYWtlLWRlbW8gXCJkZW1vLTJcIiBkaWFtb25kLXNxdWFyZS0yIDQpXG4gIChtYWtlLWRlbW8gXCJkZW1vLTNcIiBkaWFtb25kLXNxdWFyZS0zIDQpXG4gIChtYWtlLWZpbmFsIFwiZGVtby1maW5hbFwiKSlcblxuKCQgcnVuKVxuXG5cbjsgdmltOiBsdys9ZG8tdGltZXMgbHcrPWRvLW5lc3RlZCA6XG4iXX0=